<?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" rel="self" type="application/rss+xml" />
                            <title><![CDATA[ Latest from Tom's Guide in Samsung ]]></title>
                <link>https://www.tomsguide.com/tag/samsung</link>
        <description><![CDATA[ All the latest samsung content from the Tom's Guide team ]]></description>
                                    <lastBuildDate>Wed, 28 Oct 2026 15:45:00 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ Lowe's knocks hundreds off appliances — 12 essential deals from LG, Samsung, Frigidaire and more ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If you're looking for a new oven, washer, fridge, or other household appliance then make sure to check out Lowe's. The online retailer currently has an absolutely enormous sale on appliances, with some great savings to be had on big name brands like Samsung, LG, and Frigidaire.</p><p>For this article I combed the sale trying to find some essential bargains. I've picked out 12 of my favorite deals from the hundreds available on the site. You'll find all sorts of appliances here with savings of up to $1000. </p><p>Lowe's big appliance sale is running until November 3, so you've got a bit of time to make your mind up about these deals. Still, they won't stick around forever, so act fast if there's something here you like.</p>        <div class="featured_product_block featured_block_hero" data-id="dccfef10-d2ce-11f1-ac55-45f192c9f305">            <a href="https://www.lowes.com/pd/Frigidaire-1-8-cu-ft-1000-Watt-Over-the-Range-Microwave-Easycare-Stainless-Steel/5013814937" data-model-name="Frigidaire Over-the-Range Microwave" 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/yqTVueNMs75jYgiwu8MgFj.jpg" alt="BRAND, Frigidaire 1.8-cu ft Over-the-Range Microwave ( Fingerprint Resistant Stainless Steel )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Frigidaire Over-the-Range Microwave</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff08c-d2ce-11f1-94f6-3de407ca6cc6">            <a href="https://www.lowes.com/pd/LG-2-0-cu-ft-OTR/5017902525" data-model-name="LG 2-cu ft Over-the-Range Microwave with Sensor Cooking ( Printproof Stainless Steel )" 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/NaQDL8XVq3SaSqHTsyxQvm.jpg" alt="BRAND, LG 2-cu ft Over-the-Range Microwave with Sensor Cooking ( Printproof Stainless Steel )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">LG 2-cu ft Over-the-Range Microwave with Sensor Cooking ( Printproof Stainless Steel )</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff136-d2ce-11f1-b0ef-d1e3a3c0a451">            <a href="https://www.lowes.com/pd/Frigidaire-16-03-cu-ft-Standard-Depth-28-in-Wide-Top-Freezer-Refrigerator-Black-Garage-Ready-ENERGY-STAR-Certified/5018775151" data-model-name="Frigidaire Freezer and Refrigerator" 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/RkDP23RHwfT436kaKW5nW4.jpg" alt="BRAND, Frigidaire 17.6-cu ft Standard-Depth 28-in Wide Top-Freezer Refrigerator ( Black ) ENERGY STAR Certified"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Frigidaire Freezer and Refrigerator</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="addf8a36-d2dc-11f1-a6c8-fb66e8c71ced">            <a href="https://www.lowes.com/pd/Samsung-7-4-cu-ft-Smart-Electric-Dryer-with-Steam-Sanitize-White/5005327149" data-model-name="Samsung Vented Electric Dryer with Steam Cycle" 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/j7N8nWSK3fAi6vktAFWHNL.jpg" alt="BRAND, Samsung 7.4-cu ft Vented Electric Dryer with Steam Cycle ( White )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Samsung Vented Electric Dryer with Steam Cycle</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff1f4-d2ce-11f1-bad7-11442a443474">            <a href="https://www.lowes.com/pd/Frigidaire-30-in-5-burners-5-1-cu-ft-Freestanding-Natural-Gas-Range-Fingerprint-Resistant-Stainless-Steel/5018666771" data-model-name="Frigidaire Freestanding Natural Gas Range" 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/wN6rrrxvJm3yHRHbGQAfF6.jpg" alt="BRAND, Frigidaire 30-in 5 burners 5.1-cu ft Freestanding Natural Gas ( Fingerprint Resistant Stainless Steel )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Frigidaire Freestanding Natural Gas Range</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff35c-d2ce-11f1-8d18-83fe4460aac8">            <a href="https://www.lowes.com/pd/Frigidaire-30-in-5-burners-5-1-cu-ft-Air-Fry-Convection-Oven-Freestanding-Natural-Gas-Range-Stainless-Steel/5018666763" data-model-name="Frigidaire 5 burners Air Fry Convection Oven and Gas Range" 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/XcyRCNB4b5yVwq9svgqTgB.jpg" alt="BRAND, Frigidaire 30-in 5 burners 5.1-cu ft Air Fry Convection Oven Freestanding Natural Gas ( Stainless Steel )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Frigidaire 5 burners Air Fry Convection Oven and Gas Range</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff3fc-d2ce-11f1-a863-05c6ffc8600f">            <a href="https://www.lowes.com/pd/Frigidaire-30-in-5-burners-5-1-cu-ft-Slide-In-Natural-Gas-Range-Stainless-steel/5018666839" data-model-name="Frigidaire 5 burners single oven gas range" 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/QiPzsH7bsCRAAprAXWZoRD.jpg" alt="BRAND, Frigidaire 30-in 5 burners 5.1-cu ft Single oven gas range Natural Gas ( Stainless steel )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Frigidaire 5 burners single oven gas range</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="addf8b26-d2dc-11f1-9e47-c5994b4355be">            <a href="https://www.lowes.com/pd/LG-Electric-Dryer-DLEX8900B/5013193595" data-model-name="LG TurboSteam Stackable Vented Electric Dryer" 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/VCa9Zt2dL4D4YR3dwhVyfM.jpg" alt="BRAND, LG TurboSteam 9-cu ft Stackable Vented Electric Dryer with Steam Cycle ( Black Steel )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">LG TurboSteam Stackable Vented Electric Dryer</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff49c-d2ce-11f1-ab35-17a26f9f3002">            <a href="https://www.lowes.com/pd/Frigidaire-Counter-Depth-17-6-cu-ft-3-Door-French-Door-Refrigerator-with-Ice-Maker-Fingerprint-Resistant-Stainless-Look-ENERGY-STAR-Certified/5016471305" data-model-name="Frigidaire French Door Refrigerator with Ice Maker" 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/cDgTtMB2hAXtoz9dh9sUrE.jpg" alt="BRAND, Frigidaire Counter-Depth 17.6-cu ft 3 -Door 31-in Wide French Door Refrigerator with Ice Maker ( Fingerprint-Resistant Stainless Look ) ENERGY STAR Certified"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Frigidaire French Door Refrigerator with Ice Maker</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="addf8c02-d2dc-11f1-ba8f-113be491bd1b">            <a href="https://www.lowes.com/pd/LG-26-cu-ft-French-Door/5017626235" data-model-name="LG Freezer Refrigerator with Ice Maker " 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/aUGsDd5sVc4bvr73gRW6hP.jpg" alt="BRAND, LG 25.2-cu ft Standard-Depth 33-in Wide Bottom-Freezer Refrigerator with Ice Maker ( PrintProof Stainless Steel ) ENERGY STAR Certified"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">LG Freezer Refrigerator with Ice Maker </div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff546-d2ce-11f1-b807-e95fe56a2442">            <a href="https://www.lowes.com/pd/Samsung-Bespoke-4-Door-French-Door-Refrigerator-29-cu-ft-with-Beverage-Center-in-Morning-Blue-Glass-Top-Panel-with-White-Glass-Middle-and-Bottom-Panels/5013496811" data-model-name="Samsung AI Beverage Center Refrigerator with Ice Maker" 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/X3JWxsTJJEg7H2cfASE8RH.jpg" alt="BRAND, Samsung Bespoke AI Standard-Depth Beverage Center 29-cu ft 4 -Door 36-in Wide French Door Refrigerator with Dual Ice Maker and Door within Door ( Morning Blue ) ENERGY STAR Certified"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Samsung AI Beverage Center Refrigerator with Ice Maker</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff686-d2ce-11f1-9081-51659b5c40ea">            <a href="https://www.lowes.com/pd/Cafe-30-inch-Single-Electric-Wall-Oven-with-Air-Fry-True-Convection-and-Self-Steam-Cleaning-Matte-White-with-Brushed-Bronze-Handles/5020737177" data-model-name="Cafe 30-inch Single Electric Wall Oven" 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/YGAitVXiFEGBygfAcscVfL.jpg" alt="BRAND, Cafe 30 inch Single Electric Wall Oven with Air Fry True Convection and Self-cleaning (, Steam Cleaning ( Matte White with Brushed Bronze Handles )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Cafe 30-inch Single Electric Wall Oven</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/sales-events/lowes-knocks-hundreds-off-appliances-12-essential-deals-from-lg-samsung-frigidaire-and-more</link>
                                                                            <description>
                            <![CDATA[ Lowe's massive appliance sale is cutting prices on washers, ovens, fridges, and more from LG, Samsung, Frigidaire, and other big brands. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">qnNN47fz72m3pat5yAg578</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/hEPgYUpZYPdDmJnYPmWzB6-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 28 Oct 2026 15:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Sales Events]]></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/hEPgYUpZYPdDmJnYPmWzB6-1920-80.jpg">
                                                            <media:credit><![CDATA[Samsung, LG, Frigidaire / Edited with Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A selection of appliances at Lowe&#039;s.]]></media:description>                                                            <media:text><![CDATA[A selection of appliances at Lowe&#039;s.]]></media:text>
                                <media:title type="plain"><![CDATA[A selection of appliances at Lowe&#039;s.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/hEPgYUpZYPdDmJnYPmWzB6-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you're looking for a new oven, washer, fridge, or other household appliance then make sure to check out Lowe's. The online retailer currently has an absolutely enormous sale on appliances, with some great savings to be had on big name brands like Samsung, LG, and Frigidaire.</p><p>For this article I combed the sale trying to find some essential bargains. I've picked out 12 of my favorite deals from the hundreds available on the site. You'll find all sorts of appliances here with savings of up to $1000. </p><p>Lowe's big appliance sale is running until November 3, so you've got a bit of time to make your mind up about these deals. Still, they won't stick around forever, so act fast if there's something here you like.</p>        <div class="featured_product_block featured_block_hero" data-id="dccfef10-d2ce-11f1-ac55-45f192c9f305">            <a href="https://www.lowes.com/pd/Frigidaire-1-8-cu-ft-1000-Watt-Over-the-Range-Microwave-Easycare-Stainless-Steel/5013814937" data-model-name="Frigidaire Over-the-Range Microwave" 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/yqTVueNMs75jYgiwu8MgFj.jpg" alt="BRAND, Frigidaire 1.8-cu ft Over-the-Range Microwave ( Fingerprint Resistant Stainless Steel )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Frigidaire Over-the-Range Microwave</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff08c-d2ce-11f1-94f6-3de407ca6cc6">            <a href="https://www.lowes.com/pd/LG-2-0-cu-ft-OTR/5017902525" data-model-name="LG 2-cu ft Over-the-Range Microwave with Sensor Cooking ( Printproof Stainless Steel )" 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/NaQDL8XVq3SaSqHTsyxQvm.jpg" alt="BRAND, LG 2-cu ft Over-the-Range Microwave with Sensor Cooking ( Printproof Stainless Steel )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">LG 2-cu ft Over-the-Range Microwave with Sensor Cooking ( Printproof Stainless Steel )</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff136-d2ce-11f1-b0ef-d1e3a3c0a451">            <a href="https://www.lowes.com/pd/Frigidaire-16-03-cu-ft-Standard-Depth-28-in-Wide-Top-Freezer-Refrigerator-Black-Garage-Ready-ENERGY-STAR-Certified/5018775151" data-model-name="Frigidaire Freezer and Refrigerator" 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/RkDP23RHwfT436kaKW5nW4.jpg" alt="BRAND, Frigidaire 17.6-cu ft Standard-Depth 28-in Wide Top-Freezer Refrigerator ( Black ) ENERGY STAR Certified"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Frigidaire Freezer and Refrigerator</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="addf8a36-d2dc-11f1-a6c8-fb66e8c71ced">            <a href="https://www.lowes.com/pd/Samsung-7-4-cu-ft-Smart-Electric-Dryer-with-Steam-Sanitize-White/5005327149" data-model-name="Samsung Vented Electric Dryer with Steam Cycle" 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/j7N8nWSK3fAi6vktAFWHNL.jpg" alt="BRAND, Samsung 7.4-cu ft Vented Electric Dryer with Steam Cycle ( White )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Samsung Vented Electric Dryer with Steam Cycle</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff1f4-d2ce-11f1-bad7-11442a443474">            <a href="https://www.lowes.com/pd/Frigidaire-30-in-5-burners-5-1-cu-ft-Freestanding-Natural-Gas-Range-Fingerprint-Resistant-Stainless-Steel/5018666771" data-model-name="Frigidaire Freestanding Natural Gas Range" 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/wN6rrrxvJm3yHRHbGQAfF6.jpg" alt="BRAND, Frigidaire 30-in 5 burners 5.1-cu ft Freestanding Natural Gas ( Fingerprint Resistant Stainless Steel )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Frigidaire Freestanding Natural Gas Range</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff35c-d2ce-11f1-8d18-83fe4460aac8">            <a href="https://www.lowes.com/pd/Frigidaire-30-in-5-burners-5-1-cu-ft-Air-Fry-Convection-Oven-Freestanding-Natural-Gas-Range-Stainless-Steel/5018666763" data-model-name="Frigidaire 5 burners Air Fry Convection Oven and Gas Range" 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/XcyRCNB4b5yVwq9svgqTgB.jpg" alt="BRAND, Frigidaire 30-in 5 burners 5.1-cu ft Air Fry Convection Oven Freestanding Natural Gas ( Stainless Steel )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Frigidaire 5 burners Air Fry Convection Oven and Gas Range</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff3fc-d2ce-11f1-a863-05c6ffc8600f">            <a href="https://www.lowes.com/pd/Frigidaire-30-in-5-burners-5-1-cu-ft-Slide-In-Natural-Gas-Range-Stainless-steel/5018666839" data-model-name="Frigidaire 5 burners single oven gas range" 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/QiPzsH7bsCRAAprAXWZoRD.jpg" alt="BRAND, Frigidaire 30-in 5 burners 5.1-cu ft Single oven gas range Natural Gas ( Stainless steel )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Frigidaire 5 burners single oven gas range</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="addf8b26-d2dc-11f1-9e47-c5994b4355be">            <a href="https://www.lowes.com/pd/LG-Electric-Dryer-DLEX8900B/5013193595" data-model-name="LG TurboSteam Stackable Vented Electric Dryer" 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/VCa9Zt2dL4D4YR3dwhVyfM.jpg" alt="BRAND, LG TurboSteam 9-cu ft Stackable Vented Electric Dryer with Steam Cycle ( Black Steel )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">LG TurboSteam Stackable Vented Electric Dryer</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff49c-d2ce-11f1-ab35-17a26f9f3002">            <a href="https://www.lowes.com/pd/Frigidaire-Counter-Depth-17-6-cu-ft-3-Door-French-Door-Refrigerator-with-Ice-Maker-Fingerprint-Resistant-Stainless-Look-ENERGY-STAR-Certified/5016471305" data-model-name="Frigidaire French Door Refrigerator with Ice Maker" 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/cDgTtMB2hAXtoz9dh9sUrE.jpg" alt="BRAND, Frigidaire Counter-Depth 17.6-cu ft 3 -Door 31-in Wide French Door Refrigerator with Ice Maker ( Fingerprint-Resistant Stainless Look ) ENERGY STAR Certified"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Frigidaire French Door Refrigerator with Ice Maker</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="addf8c02-d2dc-11f1-ba8f-113be491bd1b">            <a href="https://www.lowes.com/pd/LG-26-cu-ft-French-Door/5017626235" data-model-name="LG Freezer Refrigerator with Ice Maker " 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/aUGsDd5sVc4bvr73gRW6hP.jpg" alt="BRAND, LG 25.2-cu ft Standard-Depth 33-in Wide Bottom-Freezer Refrigerator with Ice Maker ( PrintProof Stainless Steel ) ENERGY STAR Certified"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">LG Freezer Refrigerator with Ice Maker </div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff546-d2ce-11f1-b807-e95fe56a2442">            <a href="https://www.lowes.com/pd/Samsung-Bespoke-4-Door-French-Door-Refrigerator-29-cu-ft-with-Beverage-Center-in-Morning-Blue-Glass-Top-Panel-with-White-Glass-Middle-and-Bottom-Panels/5013496811" data-model-name="Samsung AI Beverage Center Refrigerator with Ice Maker" 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/X3JWxsTJJEg7H2cfASE8RH.jpg" alt="BRAND, Samsung Bespoke AI Standard-Depth Beverage Center 29-cu ft 4 -Door 36-in Wide French Door Refrigerator with Dual Ice Maker and Door within Door ( Morning Blue ) ENERGY STAR Certified"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Samsung AI Beverage Center Refrigerator with Ice Maker</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="dccff686-d2ce-11f1-9081-51659b5c40ea">            <a href="https://www.lowes.com/pd/Cafe-30-inch-Single-Electric-Wall-Oven-with-Air-Fry-True-Convection-and-Self-Steam-Cleaning-Matte-White-with-Brushed-Bronze-Handles/5020737177" data-model-name="Cafe 30-inch Single Electric Wall Oven" 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/YGAitVXiFEGBygfAcscVfL.jpg" alt="BRAND, Cafe 30 inch Single Electric Wall Oven with Air Fry True Convection and Self-cleaning (, Steam Cleaning ( Matte White with Brushed Bronze Handles )"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Cafe 30-inch Single Electric Wall Oven</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung's Galaxy Tab S12 Plus has quietly become my favourite tablet —here's why I'd pick it over the Ultra ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Whenever Samsung launches a new flagship tablet, it's usually the Ultra model that gets most of the attention. With its massive 14.6-inch display, it's not surprising that the South Korean electronics giant would want its biggest and most impressive device all over its marketing materials, but that doesn't mean you should overlook the Galaxy Tab S12 Plus. This isn't like the difference between Samsung's <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-plus-review">Galaxy S26 Plus</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-plus-review">S26 Ultra</a> — both tablets are practically identical in terms of software and horsepower, with only a few minor downgrades on the smaller model.</p><p>Granted, I've only had the Galaxy Tab S12 Plus for a couple of weeks, but I already think it's the better buy for many people. If you're looking for what is essentially the Android equivalent of Apple's 13-inch <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5</a>, chances are you're not shopping for the biggest tablet Samsung can physically make — most people will want something a little more portable, with a premium screen, strong performance, excellent battery life, pen support and enough versatility to handle both work and entertainment. In that sense, the 12.6-inch Tab S12 Plus feels more practical.</p><p>Lately, it's become the device I find myself using more than almost anything else, and honestly, I find its size far more practical to use on a day-to-day basis than the Ultra models I've tested in the past. Not only have I been neglecting other devices, like my <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Nintendo Switch 2</a>, since its arrival, but I've even started using it over my actual phone.</p><h2 id="the-display-feels-like-the-sweet-spot">The display feels like the sweet spot</h2><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="GsFrJZozkhcG9y9jLdYqTT" name="Samsung Galaxy Tab S12 Plus-2" alt="Samsung Galaxy Tab S12 Plus on desk" src="https://cdn.mos.cms.futurecdn.net/GsFrJZozkhcG9y9jLdYqTT-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 / Stephen Lambrechts)</span></figcaption></figure><p>Having spent years alternating between smaller tablets that can feel a bit restrictive and larger models that aren't always practical to carry around, the Tab S12's 12.6-inch display feels just right. That might make me sound like Goldilocks, but the display is large enough for movies and TV shows to feel immersive, while the tablet itself is slim and compact enough to easily slip into a messenger bag or backpack.</p><p>And that's before I get to the display's picture quality — I've been rewatching “The Sopranos” on my last few train rides, and this AMOLED panel has consistently delivered rich colours, excellent contrast and stunning brightness, while its 120Hz refresh rate makes navigating its UI feel incredibly snappy. Although Tom's Guide has yet to run its usual lab tests on the Tab S12 Plus, Samsung quotes the same peak brightness figures as the larger Tab S12 Ultra, which delivered excellent results in our testing and remains one of the best tablet displays <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s12-ultra-review">we've reviewed</a>, significantly outperforming the iPad Pro M5.</p><p>Of course, glare is still a concern. This being Australia, the sun can be particularly brutal during morning commutes, making reflections more noticeable than I'd like. It's not enough to ruin the viewing experience, and the display is bright enough to push through most lighting conditions, but I did find myself wishing Samsung had included some form of anti-reflective coating. Given how much time I spend using the tablet outside the house, that would probably be the one display upgrade I'd put at the top of my wishlist for the next generation.</p><h2 id="i-39-ve-ended-up-reading-more-comics-than-watching-tv-shows">I've ended up reading more comics than watching TV shows</h2><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="3KtbgTkR6ZAMXHpTWbcG7U" name="Samsung Galaxy Tab S12 Plus-5" alt="Samsung Galaxy Tab S12 Plus on desk" src="https://cdn.mos.cms.futurecdn.net/3KtbgTkR6ZAMXHpTWbcG7U-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 / Stephen Lambrechts)</span></figcaption></figure><p>Truth be told, I've probably spent more time reading comics on the Tab S12 Plus than watching TV shows, which wasn't something I expected going in. I've been catching up on DC's Absolute Batman series (excellent) and the latest Lobo run (ridiculous, but fun) whenever I get the chance, and it made me realise how much I missed the hobby. </p><p>And, after attempting to read comics on a variety of foldable smartphones (not ideal), the 12.6-inch screen on the Tab S12 Plus feels downright luxurious by comparison, allowing me to take in the glorious artwork in its entirety. Also, its AMOLED display makes the artwork look super crisp, with colours that pop with amazing vibrancy, and true blacks that allow for inky shadows and detailed line work.</p><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="gcxpcLxYYJxs94XfXJUxKZ" name="Samsung Galaxy Tab S12 Plus-9" alt="Hands-on image of Samsung Galaxy Tab S12 Plus playing Call of Duty: Mobile" src="https://cdn.mos.cms.futurecdn.net/gcxpcLxYYJxs94XfXJUxKZ-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 / Stephen Lambrechts)</span></figcaption></figure><p>Quite a few times now I've found myself opening a comic just to fill ten or fifteen minutes and then realising I've been sitting there for the better part of an hour. It's obviously a fantastic screen for comics, though I think its portability is just as important — the Tab S12 Plus is easy enough to take almost anywhere, which means it's usually close at hand when the urge to read strikes.</p><p>Reading comics also had the knock-on effect of inspiring me to use the S Pen more often. I used to draw quite a bit in my younger days, and in a comic book style. Lately, I've been using Split Screen View on the Tab S12 Plus to look at particularly striking comic panels on one side of the display while attempting to sketch it in Clip Studio Paint on the other, which is so handy. And now that I've started getting used to the Clip Studio Paint app, the next step is to do some basic drawing tutorials focused on 3D figures and poses.</p><h2 id="its-pro-keyboard-is-quality">Its Pro Keyboard is quality</h2><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="iDURbe2YRXA2Uns8eWyJdT" name="Samsung Galaxy Tab S12 Plus-3" alt="Samsung Galaxy Tab S12 Plus on desk" src="https://cdn.mos.cms.futurecdn.net/iDURbe2YRXA2Uns8eWyJdT-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 / Stephen Lambrechts)</span></figcaption></figure><p>There's no sugar-coating it: Samsung's Pro Keyboard for the Galaxy Tab S12 Plus is expensive. At $350 / £289 / AU$499 for the keyboard alone, it's more expensive than many entry-level Chromebook devices. Add that to the cost of the tablet and you're looking at the kind of money that could buy a pretty decent laptop.</p><p>Having spent some time using it, though, I can at least understand where some of that money is going. The aluminium construction gives the tablet a much sturdier feel when it's sitting on a desk, and both the keyboard and trackpad are good enough that it makes you feel like you're using an actual laptop. The only thing that regularly reminds me it's still a tablet is the U-shaped support built into the hinge, which folds out behind the display and sticks out a little further than you'd expect once it's open. I also love how firmly its magnets snap to the Tab S12 Plus — it's surprisingly hard to detach from the keyboard unless you hold the support stand and tilt the tablet forward.</p><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="jBhWs8trYd7zqbPvzeRPNG" name="Samsung Galaxy Tab S12 Plus-8" alt="Rear view of Samsung Galaxy Tab S12 Plus keyboard stand" src="https://cdn.mos.cms.futurecdn.net/jBhWs8trYd7zqbPvzeRPNG-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 / Stephen Lambrechts)</span></figcaption></figure><p>Most of my workday revolves around writing, research, photo editing, and responding to emails and Slack messages, and the Tab S12 Plus is more than capable of handling all that. Admittedly, I prefer to do the bulk of my feature writing on a mechanical keyboard, but I can take care of most other tasks on the Tab S12 Plus without any real hassles. The keyboard also sports a large trackpad with physical click functionality, a dedicated button to switch on DeX mode, an AI key and a programmable hot key to launch your favourite apps. I also realised fairly late in the game that the keyboard is backlit — you just have to hold the Fn key and hit F12 to switch the backlight on and cycle through its three brightness settings.</p><p>My only real gripe is that it's a fingerprint magnet. The brushed aluminium looks great fresh out of the box, but it was absolutely covered in fingerprints after I passed it around the office for a few minutes. It's hardly a deal-breaker, though I ended up having to wipe the prints off with a tech wipe.</p><h2 id="bigger-isn-t-always-better">Bigger isn’t always 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jbiZwRG3VnyjnxFBkMArQ9" name="Samsung Galaxy Tab S12 Plus-6" alt="Samsung Galaxy Tab S12 Plus on desk" src="https://cdn.mos.cms.futurecdn.net/jbiZwRG3VnyjnxFBkMArQ9-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 / Stephen Lambrechts)</span></figcaption></figure><p>The Ultra might be the flashiest product in Samsung’s Tab S12 line-up, but in daily use, bigger isn’t always better. A 14.6-inch screen basically demands a desk, whereas the Tab S12 Plus still feels like a tablet you can actually hold. It’s light and thin enough to comfortably use without tiring your arms, but with a 12.6-inch display that's still big enough to get creative on. </p><p>It does come with a couple of downgrades compared to the Ultra — it only has a single camera on its rear compared to the Ultra’s dual camera setup, and for some reason the Tab S12 Plus doesn’t get the same Wi-Fi 7 support as the Ultra, topping out at Wi-Fi 6E instead — but I don’t think either of those concessions should be considered deal breakers.</p><p>That said, with a starting price of $1,199 / £1,199 / AU$1,999, it isn't cheap. Factoring in that pricey Pro Keyboard does make you start considering a laptop as an alternative, especially if you prefer full desktop apps. Still, being able to jump from a casual handheld tablet to a proper DeX workstation in seconds is something most 2-in-1 laptops just can't pull off. It’s versatile, easy to take anywhere, and actually fits the way I live and work — which is why it’s quietly become my favourite tablet.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More From Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/ipads/apple-just-announced-a-new-ipad-mini-with-an-oled-panel-and-a20-pro-chip">Apple just announced a new iPad mini with an OLED panel and IP67 resistance</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-responds-to-iphone-duo-cracked-inner-screens-what-to-do-if-your-phone-is-affected">Apple responds to iPhone Duo cracked inner screens — what to do if your phone is affected</a></li><li><a href="https://www.tomsguide.com/best-picks/best-2-in-1-laptops">These are the 5 best 2-in-1 laptops we tested to work, draw and stream on one machine</a></li></ul><div data-widget-type="review" data-model-name="Samsung Galaxy Tab S12 Plus"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/samsungs-galaxy-tab-s12-plus-has-quietly-become-my-favourite-tablet-heres-why-id-pick-it-over-the-ultra</link>
                                                                            <description>
                            <![CDATA[ The Ultra grabs the headlines, but the 12.6-inch Tab S12 Plus is the one you'll actually want to carry. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hx5TB923vUMFe3EZuHFG2f</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/rLp5og6jYtpYeTkE7AjEJT-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 28 Oct 2026 01:37:34 +0000</pubDate>                                                                                                                                <updated>Wed, 28 Oct 2026 04:22:27 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                                    <dc:creator><![CDATA[ Stephen Lambrechts ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/JN3jEQpqyyt32as8AJJqXe-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Stephen Lambrechts is the Managing Editor of Tom&#039;s Guide AU and has written professionally across the categories of tech, film, television and gaming for the last 15 years. Before Tom&#039;s Guide, he spent several years as a Senior Journalist at TechRadar, had a brief stint as Editor in Chief at Official Xbox Magazine Australia, and worked at IGN. He&#039;s also written for such mags and sites as APC, TechLife Australia, T3, FilmInk, Daily Telegraph and AskMen. Additionally, he&#039;s a Tomatometer-approved critic on Rotten Tomatoes, and has offered his tech advice on radio and television.&lt;/p&gt;&lt;p&gt;He&#039;s an expert when it comes to smartphones, TVs, gaming and streaming, having contributed many reviews in each of those categories over the years. Despite his many articles on streaming, he&#039;s a passionate collector of physical media who enjoys listening to vinyl records and acquiring obscure horror movies from the &#039;60s, &#039;70s and 80s. He can usually be seen rocking the latest retro sneaker releases, particularly Air Jordans and Reebok Pumps. Occasionally, he also indulges in other non-hipster stuff, like hiking.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/rLp5og6jYtpYeTkE7AjEJT-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide / Stephen Lambrechts]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Tab S12 Plus on desk]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Tab S12 Plus on desk]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Tab S12 Plus on desk]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/rLp5og6jYtpYeTkE7AjEJT-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Whenever Samsung launches a new flagship tablet, it's usually the Ultra model that gets most of the attention. With its massive 14.6-inch display, it's not surprising that the South Korean electronics giant would want its biggest and most impressive device all over its marketing materials, but that doesn't mean you should overlook the Galaxy Tab S12 Plus. This isn't like the difference between Samsung's <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-plus-review">Galaxy S26 Plus</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-plus-review">S26 Ultra</a> — both tablets are practically identical in terms of software and horsepower, with only a few minor downgrades on the smaller model.</p><p>Granted, I've only had the Galaxy Tab S12 Plus for a couple of weeks, but I already think it's the better buy for many people. If you're looking for what is essentially the Android equivalent of Apple's 13-inch <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5</a>, chances are you're not shopping for the biggest tablet Samsung can physically make — most people will want something a little more portable, with a premium screen, strong performance, excellent battery life, pen support and enough versatility to handle both work and entertainment. In that sense, the 12.6-inch Tab S12 Plus feels more practical.</p><p>Lately, it's become the device I find myself using more than almost anything else, and honestly, I find its size far more practical to use on a day-to-day basis than the Ultra models I've tested in the past. Not only have I been neglecting other devices, like my <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Nintendo Switch 2</a>, since its arrival, but I've even started using it over my actual phone.</p><h2 id="the-display-feels-like-the-sweet-spot">The display feels like the sweet spot</h2><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="GsFrJZozkhcG9y9jLdYqTT" name="Samsung Galaxy Tab S12 Plus-2" alt="Samsung Galaxy Tab S12 Plus on desk" src="https://cdn.mos.cms.futurecdn.net/GsFrJZozkhcG9y9jLdYqTT-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 / Stephen Lambrechts)</span></figcaption></figure><p>Having spent years alternating between smaller tablets that can feel a bit restrictive and larger models that aren't always practical to carry around, the Tab S12's 12.6-inch display feels just right. That might make me sound like Goldilocks, but the display is large enough for movies and TV shows to feel immersive, while the tablet itself is slim and compact enough to easily slip into a messenger bag or backpack.</p><p>And that's before I get to the display's picture quality — I've been rewatching “The Sopranos” on my last few train rides, and this AMOLED panel has consistently delivered rich colours, excellent contrast and stunning brightness, while its 120Hz refresh rate makes navigating its UI feel incredibly snappy. Although Tom's Guide has yet to run its usual lab tests on the Tab S12 Plus, Samsung quotes the same peak brightness figures as the larger Tab S12 Ultra, which delivered excellent results in our testing and remains one of the best tablet displays <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s12-ultra-review">we've reviewed</a>, significantly outperforming the iPad Pro M5.</p><p>Of course, glare is still a concern. This being Australia, the sun can be particularly brutal during morning commutes, making reflections more noticeable than I'd like. It's not enough to ruin the viewing experience, and the display is bright enough to push through most lighting conditions, but I did find myself wishing Samsung had included some form of anti-reflective coating. Given how much time I spend using the tablet outside the house, that would probably be the one display upgrade I'd put at the top of my wishlist for the next generation.</p><h2 id="i-39-ve-ended-up-reading-more-comics-than-watching-tv-shows">I've ended up reading more comics than watching TV shows</h2><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="3KtbgTkR6ZAMXHpTWbcG7U" name="Samsung Galaxy Tab S12 Plus-5" alt="Samsung Galaxy Tab S12 Plus on desk" src="https://cdn.mos.cms.futurecdn.net/3KtbgTkR6ZAMXHpTWbcG7U-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 / Stephen Lambrechts)</span></figcaption></figure><p>Truth be told, I've probably spent more time reading comics on the Tab S12 Plus than watching TV shows, which wasn't something I expected going in. I've been catching up on DC's Absolute Batman series (excellent) and the latest Lobo run (ridiculous, but fun) whenever I get the chance, and it made me realise how much I missed the hobby. </p><p>And, after attempting to read comics on a variety of foldable smartphones (not ideal), the 12.6-inch screen on the Tab S12 Plus feels downright luxurious by comparison, allowing me to take in the glorious artwork in its entirety. Also, its AMOLED display makes the artwork look super crisp, with colours that pop with amazing vibrancy, and true blacks that allow for inky shadows and detailed line work.</p><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="gcxpcLxYYJxs94XfXJUxKZ" name="Samsung Galaxy Tab S12 Plus-9" alt="Hands-on image of Samsung Galaxy Tab S12 Plus playing Call of Duty: Mobile" src="https://cdn.mos.cms.futurecdn.net/gcxpcLxYYJxs94XfXJUxKZ-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 / Stephen Lambrechts)</span></figcaption></figure><p>Quite a few times now I've found myself opening a comic just to fill ten or fifteen minutes and then realising I've been sitting there for the better part of an hour. It's obviously a fantastic screen for comics, though I think its portability is just as important — the Tab S12 Plus is easy enough to take almost anywhere, which means it's usually close at hand when the urge to read strikes.</p><p>Reading comics also had the knock-on effect of inspiring me to use the S Pen more often. I used to draw quite a bit in my younger days, and in a comic book style. Lately, I've been using Split Screen View on the Tab S12 Plus to look at particularly striking comic panels on one side of the display while attempting to sketch it in Clip Studio Paint on the other, which is so handy. And now that I've started getting used to the Clip Studio Paint app, the next step is to do some basic drawing tutorials focused on 3D figures and poses.</p><h2 id="its-pro-keyboard-is-quality">Its Pro Keyboard is quality</h2><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="iDURbe2YRXA2Uns8eWyJdT" name="Samsung Galaxy Tab S12 Plus-3" alt="Samsung Galaxy Tab S12 Plus on desk" src="https://cdn.mos.cms.futurecdn.net/iDURbe2YRXA2Uns8eWyJdT-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 / Stephen Lambrechts)</span></figcaption></figure><p>There's no sugar-coating it: Samsung's Pro Keyboard for the Galaxy Tab S12 Plus is expensive. At $350 / £289 / AU$499 for the keyboard alone, it's more expensive than many entry-level Chromebook devices. Add that to the cost of the tablet and you're looking at the kind of money that could buy a pretty decent laptop.</p><p>Having spent some time using it, though, I can at least understand where some of that money is going. The aluminium construction gives the tablet a much sturdier feel when it's sitting on a desk, and both the keyboard and trackpad are good enough that it makes you feel like you're using an actual laptop. The only thing that regularly reminds me it's still a tablet is the U-shaped support built into the hinge, which folds out behind the display and sticks out a little further than you'd expect once it's open. I also love how firmly its magnets snap to the Tab S12 Plus — it's surprisingly hard to detach from the keyboard unless you hold the support stand and tilt the tablet forward.</p><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="jBhWs8trYd7zqbPvzeRPNG" name="Samsung Galaxy Tab S12 Plus-8" alt="Rear view of Samsung Galaxy Tab S12 Plus keyboard stand" src="https://cdn.mos.cms.futurecdn.net/jBhWs8trYd7zqbPvzeRPNG-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 / Stephen Lambrechts)</span></figcaption></figure><p>Most of my workday revolves around writing, research, photo editing, and responding to emails and Slack messages, and the Tab S12 Plus is more than capable of handling all that. Admittedly, I prefer to do the bulk of my feature writing on a mechanical keyboard, but I can take care of most other tasks on the Tab S12 Plus without any real hassles. The keyboard also sports a large trackpad with physical click functionality, a dedicated button to switch on DeX mode, an AI key and a programmable hot key to launch your favourite apps. I also realised fairly late in the game that the keyboard is backlit — you just have to hold the Fn key and hit F12 to switch the backlight on and cycle through its three brightness settings.</p><p>My only real gripe is that it's a fingerprint magnet. The brushed aluminium looks great fresh out of the box, but it was absolutely covered in fingerprints after I passed it around the office for a few minutes. It's hardly a deal-breaker, though I ended up having to wipe the prints off with a tech wipe.</p><h2 id="bigger-isn-t-always-better">Bigger isn’t always 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jbiZwRG3VnyjnxFBkMArQ9" name="Samsung Galaxy Tab S12 Plus-6" alt="Samsung Galaxy Tab S12 Plus on desk" src="https://cdn.mos.cms.futurecdn.net/jbiZwRG3VnyjnxFBkMArQ9-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 / Stephen Lambrechts)</span></figcaption></figure><p>The Ultra might be the flashiest product in Samsung’s Tab S12 line-up, but in daily use, bigger isn’t always better. A 14.6-inch screen basically demands a desk, whereas the Tab S12 Plus still feels like a tablet you can actually hold. It’s light and thin enough to comfortably use without tiring your arms, but with a 12.6-inch display that's still big enough to get creative on. </p><p>It does come with a couple of downgrades compared to the Ultra — it only has a single camera on its rear compared to the Ultra’s dual camera setup, and for some reason the Tab S12 Plus doesn’t get the same Wi-Fi 7 support as the Ultra, topping out at Wi-Fi 6E instead — but I don’t think either of those concessions should be considered deal breakers.</p><p>That said, with a starting price of $1,199 / £1,199 / AU$1,999, it isn't cheap. Factoring in that pricey Pro Keyboard does make you start considering a laptop as an alternative, especially if you prefer full desktop apps. Still, being able to jump from a casual handheld tablet to a proper DeX workstation in seconds is something most 2-in-1 laptops just can't pull off. It’s versatile, easy to take anywhere, and actually fits the way I live and work — which is why it’s quietly become my favourite tablet.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More From Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/ipads/apple-just-announced-a-new-ipad-mini-with-an-oled-panel-and-a20-pro-chip">Apple just announced a new iPad mini with an OLED panel and IP67 resistance</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-responds-to-iphone-duo-cracked-inner-screens-what-to-do-if-your-phone-is-affected">Apple responds to iPhone Duo cracked inner screens — what to do if your phone is affected</a></li><li><a href="https://www.tomsguide.com/best-picks/best-2-in-1-laptops">These are the 5 best 2-in-1 laptops we tested to work, draw and stream on one machine</a></li></ul><div data-widget-type="review" data-model-name="Samsung Galaxy Tab S12 Plus"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 7 amazing pre-Black Friday Samsung phone deals — including Z Fold 8, Galaxy S26 Ultra, S26 FE and more ]]></title>
                                                                                                <dc:content><![CDATA[ <p>With Black Friday coming, a bunch of you out there will be looking for ways to pick up a brand new smartphone without paying full price. I don't blame you, because phone prices have gone through the roof this year, and paying the MSRP is starting to feel a lot like being ripped off.</p><p>The good news is that you don't have to wait until Black Friday to save serious money. Nor do you have to pick up the latest iPhone to get the best possible phone experience. Samsung sells a lot of the <a href="https://www.tomsguide.com/best-picks/best-phones">best phones</a> and <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldables</a>, and their latest models are all discounted ahead of Black Friday — with some deals knocking hundreds of dollars off. </p><p>It's almost enough to make you forget that Samsung has been one of the <a href="https://www.tomsguide.com/phones/samsung-phones/usd1-400-galaxy-s26-ultra-every-samsung-galaxy-s26-phone-just-got-a-price-hike">worst offenders for raising prices</a>.</p><div class="product"><a data-dimension112="427fd158-d15e-11f1-a549-65baaa014e00" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1699" href="https://www.amazon.com/Samsung-Smartphone-Content-Native-Customized-Processor/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>The <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-duo-review" data-dimension112="427fd158-d15e-11f1-a549-65baaa014e00" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1699">iPhone Duo</a> may be getting all the attention at the moment, but we can't forget that Samsung has its own passport-shaped foldable — and one that seems to have Apple beat on AI and price. 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>has a similar design to the Duo, complete with a 5.5-inch cover screen and 7.6-inch foldable screen and eight generations of foldable experience to draw upon. All with $200 off the usual price over at Amazon<a class="view-deal button" href="https://www.amazon.com/Samsung-Smartphone-Content-Native-Customized-Processor/dp/B0H126B3KV" target="_blank" rel="nofollow" data-dimension112="427fd158-d15e-11f1-a549-65baaa014e00" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1699">View Deal</a></p></div><div class="product"><a data-dimension112="427fd1e4-d15e-11f1-a34b-d9dc8d42b2ec" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1899" href="https://www.amazon.com/Samsung-Smartphone-Customized-Processor-Multitasking/dp/B0H12KX1X4" 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>If you need a slightly bigger screen, then the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review" data-dimension112="427fd1e4-d15e-11f1-a34b-d9dc8d42b2ec" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1899">Samsung Galaxy Z Fold 8 Ultra</a> is the foldable for you. It features a taller and narrower design than the Z Fold 8, with a 6.5-inch cover screen and 8-inch foldable display. It also features more powerful cameras, with a 200MP main lens, 50MP ultrawide and a 10MP telephoto with 3x optical zoom. It also features a larger 5,000 mAh battery and a super thin and lightweight design — alongside all the benefits of the Z Fold 8.<a class="view-deal button" href="https://www.amazon.com/Samsung-Smartphone-Customized-Processor-Multitasking/dp/B0H12KX1X4" target="_blank" rel="nofollow" data-dimension112="427fd1e4-d15e-11f1-a34b-d9dc8d42b2ec" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1899">View Deal</a></p></div><div class="product"><a data-dimension112="427fd252-d15e-11f1-a5c9-9f869c881be6" data-action="Deal Block" data-label="Galaxy Z Flip 8" data-dimension48="Galaxy Z Flip 8" data-dimension25="$1049" href="https://www.bestbuy.com/product/samsung-galaxy-z-flip8-256gb-unlocked-graphite/JJGRF3TF7P" 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>If you'd prefer a more compact foldable experience, there's always the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-review" data-dimension112="427fd252-d15e-11f1-a5c9-9f869c881be6" data-action="Deal Block" data-label="Galaxy Z Flip 8" data-dimension48="Galaxy Z Flip 8" data-dimension25="$1049">Galaxy Z Flip 8</a>. It's nowhere near as advanced as the Z Fold 8 series, and there isn't a whole lot to make it stand out from other flip phones, But you do get access to Galaxy AI, strong Snapdragon performance, a 6.9-inch main display, 4.1-inch cover display, and a 4,300 mAh battery. And, its 50MP main camera paired with a 12MP ultrawide take great photos.<a class="view-deal button" href="https://www.bestbuy.com/product/samsung-galaxy-z-flip8-256gb-unlocked-graphite/JJGRF3TF7P" target="_blank" rel="nofollow" data-dimension112="427fd252-d15e-11f1-a5c9-9f869c881be6" data-action="Deal Block" data-label="Galaxy Z Flip 8" data-dimension48="Galaxy Z Flip 8" data-dimension25="$1049">View Deal</a></p></div><div class="product"><a data-dimension112="427fd2b6-d15e-11f1-9a1a-11dc41005f42" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$599" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Graphite-Battery/dp/B0H7SLXZPB/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1145px;"><p class="vanilla-image-block" style="padding-top:120.61%;"><img id="WLXj7d8uGbL3XKk4YkG9Cf" name="Galaxy S26 FE" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WLXj7d8uGbL3XKk4YkG9Cf-1920-80.png" mos="" align="middle" fullscreen="" width="1145" height="1381" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you want the premium experience at a lower price, Samsung's Fan Edition series has long been the go-to. You do make some compromises to get the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-fe-review-the-perfect-cure-for-samsungs-recent-price-hike-frenzy" data-dimension112="427fd2b6-d15e-11f1-9a1a-11dc41005f42" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$599">Galaxy S26 FE</a>'s lower price, but you still get good cameras, solid battery life and a design that offers a premium feel — even if it's not quite as fancy as that of the Galaxy S26. Plus you get many of the same AI features as the rest of the S26 series in a lower cost package. <a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Graphite-Battery/dp/B0H7SLXZPB/" target="_blank" rel="nofollow" data-dimension112="427fd2b6-d15e-11f1-9a1a-11dc41005f42" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$599">View Deal</a></p></div><div class="product"><a data-dimension112="427fd324-d15e-11f1-baf6-09f7d2f674aa" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$849" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Processor-Immersive/dp/B0G4SWZP8B/" 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="82idHUPd6dizKAJwshQ8mk" name="Galaxy S26 (256GB) 'Cobalt Violet'" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/82idHUPd6dizKAJwshQ8mk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>For the absolute basic Samsung flagship experience, there's the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review" data-dimension112="427fd324-d15e-11f1-baf6-09f7d2f674aa" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$849">Galaxy S26</a>. It's not as large or feature-rich as the Ultra, or even the Plus, but it still offers a whole lot of great features. That includes powerful Snapdragon 8 Elite Gen 5 performance, a larger, brighter display than before, a bunch of cool new magnetic AI features and a combination of solid battery life and camera quality. <a class="view-deal button" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Processor-Immersive/dp/B0G4SWZP8B/" target="_blank" rel="nofollow" data-dimension112="427fd324-d15e-11f1-baf6-09f7d2f674aa" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$849">View Deal</a></p></div><div class="product"><a data-dimension112="427fd37e-d15e-11f1-8b7f-afea1ff831b7" data-action="Deal Block" data-label="Galaxy S26 Plus" data-dimension48="Galaxy S26 Plus" data-dimension25="$999" href="https://www.bestbuy.com/product/samsung-galaxy-s26-256gb-unlocked-black/JJGRF368TV" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1192px;"><p class="vanilla-image-block" style="padding-top:123.07%;"><img id="nLnALydHBLsMiQiAEDTrQk" name="Galaxy S26 Plus deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/nLnALydHBLsMiQiAEDTrQk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1192" height="1467" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-plus-review" data-dimension112="427fd37e-d15e-11f1-8b7f-afea1ff831b7" data-action="Deal Block" data-label="Galaxy S26 Plus" data-dimension48="Galaxy S26 Plus" data-dimension25="$999">Galaxy S26 Plus</a> is a little bigger and a little more capable than the Galaxy S26. It features a QHD resolution screen, a larger 4,900 mAh battery, faster 45W charging speeds as well as all the same advantages as the standard S26 model. Though sadly it lacks the major benefits of the Ultra model, such as the high-resolution cameras and built-in S Pen.<a class="view-deal button" href="https://www.bestbuy.com/product/samsung-galaxy-s26-256gb-unlocked-black/JJGRF368TV" target="_blank" rel="nofollow" data-dimension112="427fd37e-d15e-11f1-8b7f-afea1ff831b7" data-action="Deal Block" data-label="Galaxy S26 Plus" data-dimension48="Galaxy S26 Plus" data-dimension25="$999">View Deal</a></p></div><div class="product"><a data-dimension112="427fd5e0-d15e-11f1-b12f-35d75b49d0cc" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$1144" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Charging-Warranty/dp/B0G4SWDH8P" 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 <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review#section-galaxy-s26-ultra-review-release-date-and-price" data-dimension112="427fd5e0-d15e-11f1-b12f-35d75b49d0cc" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$1144">Samsung Galaxy S26 Ultra</a> is the flagship of Samsung's premium phone line, and it easily offers the best Galaxy experience you can get right now. Not only does it have the largest screen of the S26 lineup, it also features a built-in S Pen stylus, a larger 5,000 mAh battery, 60W wires charging speeds and the Privacy Display that helps keep snooping eyes away from your phone — but only when you say so. Not to mention the fact there's a 200MP main camera, and  a main telephoto lens with 50MP resolution.<a class="view-deal button" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Charging-Warranty/dp/B0G4SWDH8P" target="_blank" rel="nofollow" data-dimension112="427fd5e0-d15e-11f1-b12f-35d75b49d0cc" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$1144">View Deal</a></p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/7-amazing-pre-black-friday-samsung-phone-deals-including-z-fold-8-galaxy-s26-ultra-s26-fe-and-more</link>
                                                                            <description>
                            <![CDATA[ Black Friday isn't here yet, but you can still save hundreds of dollars on the best Samsung Galaxy phones. Here are 7 unmissable deals. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">R6a54cdPzPKzonsL7DFcqD</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/GtEqu8qMu5TFusi2Q5xh2K-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 27 Oct 2026 12: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/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>With Black Friday coming, a bunch of you out there will be looking for ways to pick up a brand new smartphone without paying full price. I don't blame you, because phone prices have gone through the roof this year, and paying the MSRP is starting to feel a lot like being ripped off.</p><p>The good news is that you don't have to wait until Black Friday to save serious money. Nor do you have to pick up the latest iPhone to get the best possible phone experience. Samsung sells a lot of the <a href="https://www.tomsguide.com/best-picks/best-phones">best phones</a> and <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldables</a>, and their latest models are all discounted ahead of Black Friday — with some deals knocking hundreds of dollars off. </p><p>It's almost enough to make you forget that Samsung has been one of the <a href="https://www.tomsguide.com/phones/samsung-phones/usd1-400-galaxy-s26-ultra-every-samsung-galaxy-s26-phone-just-got-a-price-hike">worst offenders for raising prices</a>.</p><div class="product"><a data-dimension112="427fd158-d15e-11f1-a549-65baaa014e00" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1699" href="https://www.amazon.com/Samsung-Smartphone-Content-Native-Customized-Processor/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>The <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-duo-review" data-dimension112="427fd158-d15e-11f1-a549-65baaa014e00" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1699">iPhone Duo</a> may be getting all the attention at the moment, but we can't forget that Samsung has its own passport-shaped foldable — and one that seems to have Apple beat on AI and price. 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>has a similar design to the Duo, complete with a 5.5-inch cover screen and 7.6-inch foldable screen and eight generations of foldable experience to draw upon. All with $200 off the usual price over at Amazon<a class="view-deal button" href="https://www.amazon.com/Samsung-Smartphone-Content-Native-Customized-Processor/dp/B0H126B3KV" target="_blank" rel="nofollow" data-dimension112="427fd158-d15e-11f1-a549-65baaa014e00" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1699">View Deal</a></p></div><div class="product"><a data-dimension112="427fd1e4-d15e-11f1-a34b-d9dc8d42b2ec" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1899" href="https://www.amazon.com/Samsung-Smartphone-Customized-Processor-Multitasking/dp/B0H12KX1X4" 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>If you need a slightly bigger screen, then the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review" data-dimension112="427fd1e4-d15e-11f1-a34b-d9dc8d42b2ec" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1899">Samsung Galaxy Z Fold 8 Ultra</a> is the foldable for you. It features a taller and narrower design than the Z Fold 8, with a 6.5-inch cover screen and 8-inch foldable display. It also features more powerful cameras, with a 200MP main lens, 50MP ultrawide and a 10MP telephoto with 3x optical zoom. It also features a larger 5,000 mAh battery and a super thin and lightweight design — alongside all the benefits of the Z Fold 8.<a class="view-deal button" href="https://www.amazon.com/Samsung-Smartphone-Customized-Processor-Multitasking/dp/B0H12KX1X4" target="_blank" rel="nofollow" data-dimension112="427fd1e4-d15e-11f1-a34b-d9dc8d42b2ec" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1899">View Deal</a></p></div><div class="product"><a data-dimension112="427fd252-d15e-11f1-a5c9-9f869c881be6" data-action="Deal Block" data-label="Galaxy Z Flip 8" data-dimension48="Galaxy Z Flip 8" data-dimension25="$1049" href="https://www.bestbuy.com/product/samsung-galaxy-z-flip8-256gb-unlocked-graphite/JJGRF3TF7P" 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>If you'd prefer a more compact foldable experience, there's always the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-review" data-dimension112="427fd252-d15e-11f1-a5c9-9f869c881be6" data-action="Deal Block" data-label="Galaxy Z Flip 8" data-dimension48="Galaxy Z Flip 8" data-dimension25="$1049">Galaxy Z Flip 8</a>. It's nowhere near as advanced as the Z Fold 8 series, and there isn't a whole lot to make it stand out from other flip phones, But you do get access to Galaxy AI, strong Snapdragon performance, a 6.9-inch main display, 4.1-inch cover display, and a 4,300 mAh battery. And, its 50MP main camera paired with a 12MP ultrawide take great photos.<a class="view-deal button" href="https://www.bestbuy.com/product/samsung-galaxy-z-flip8-256gb-unlocked-graphite/JJGRF3TF7P" target="_blank" rel="nofollow" data-dimension112="427fd252-d15e-11f1-a5c9-9f869c881be6" data-action="Deal Block" data-label="Galaxy Z Flip 8" data-dimension48="Galaxy Z Flip 8" data-dimension25="$1049">View Deal</a></p></div><div class="product"><a data-dimension112="427fd2b6-d15e-11f1-9a1a-11dc41005f42" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$599" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Graphite-Battery/dp/B0H7SLXZPB/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1145px;"><p class="vanilla-image-block" style="padding-top:120.61%;"><img id="WLXj7d8uGbL3XKk4YkG9Cf" name="Galaxy S26 FE" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WLXj7d8uGbL3XKk4YkG9Cf-1920-80.png" mos="" align="middle" fullscreen="" width="1145" height="1381" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you want the premium experience at a lower price, Samsung's Fan Edition series has long been the go-to. You do make some compromises to get the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-fe-review-the-perfect-cure-for-samsungs-recent-price-hike-frenzy" data-dimension112="427fd2b6-d15e-11f1-9a1a-11dc41005f42" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$599">Galaxy S26 FE</a>'s lower price, but you still get good cameras, solid battery life and a design that offers a premium feel — even if it's not quite as fancy as that of the Galaxy S26. Plus you get many of the same AI features as the rest of the S26 series in a lower cost package. <a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Graphite-Battery/dp/B0H7SLXZPB/" target="_blank" rel="nofollow" data-dimension112="427fd2b6-d15e-11f1-9a1a-11dc41005f42" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$599">View Deal</a></p></div><div class="product"><a data-dimension112="427fd324-d15e-11f1-baf6-09f7d2f674aa" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$849" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Processor-Immersive/dp/B0G4SWZP8B/" 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="82idHUPd6dizKAJwshQ8mk" name="Galaxy S26 (256GB) 'Cobalt Violet'" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/82idHUPd6dizKAJwshQ8mk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>For the absolute basic Samsung flagship experience, there's the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review" data-dimension112="427fd324-d15e-11f1-baf6-09f7d2f674aa" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$849">Galaxy S26</a>. It's not as large or feature-rich as the Ultra, or even the Plus, but it still offers a whole lot of great features. That includes powerful Snapdragon 8 Elite Gen 5 performance, a larger, brighter display than before, a bunch of cool new magnetic AI features and a combination of solid battery life and camera quality. <a class="view-deal button" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Processor-Immersive/dp/B0G4SWZP8B/" target="_blank" rel="nofollow" data-dimension112="427fd324-d15e-11f1-baf6-09f7d2f674aa" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$849">View Deal</a></p></div><div class="product"><a data-dimension112="427fd37e-d15e-11f1-8b7f-afea1ff831b7" data-action="Deal Block" data-label="Galaxy S26 Plus" data-dimension48="Galaxy S26 Plus" data-dimension25="$999" href="https://www.bestbuy.com/product/samsung-galaxy-s26-256gb-unlocked-black/JJGRF368TV" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1192px;"><p class="vanilla-image-block" style="padding-top:123.07%;"><img id="nLnALydHBLsMiQiAEDTrQk" name="Galaxy S26 Plus deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/nLnALydHBLsMiQiAEDTrQk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1192" height="1467" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-plus-review" data-dimension112="427fd37e-d15e-11f1-8b7f-afea1ff831b7" data-action="Deal Block" data-label="Galaxy S26 Plus" data-dimension48="Galaxy S26 Plus" data-dimension25="$999">Galaxy S26 Plus</a> is a little bigger and a little more capable than the Galaxy S26. It features a QHD resolution screen, a larger 4,900 mAh battery, faster 45W charging speeds as well as all the same advantages as the standard S26 model. Though sadly it lacks the major benefits of the Ultra model, such as the high-resolution cameras and built-in S Pen.<a class="view-deal button" href="https://www.bestbuy.com/product/samsung-galaxy-s26-256gb-unlocked-black/JJGRF368TV" target="_blank" rel="nofollow" data-dimension112="427fd37e-d15e-11f1-8b7f-afea1ff831b7" data-action="Deal Block" data-label="Galaxy S26 Plus" data-dimension48="Galaxy S26 Plus" data-dimension25="$999">View Deal</a></p></div><div class="product"><a data-dimension112="427fd5e0-d15e-11f1-b12f-35d75b49d0cc" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$1144" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Charging-Warranty/dp/B0G4SWDH8P" 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 <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review#section-galaxy-s26-ultra-review-release-date-and-price" data-dimension112="427fd5e0-d15e-11f1-b12f-35d75b49d0cc" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$1144">Samsung Galaxy S26 Ultra</a> is the flagship of Samsung's premium phone line, and it easily offers the best Galaxy experience you can get right now. Not only does it have the largest screen of the S26 lineup, it also features a built-in S Pen stylus, a larger 5,000 mAh battery, 60W wires charging speeds and the Privacy Display that helps keep snooping eyes away from your phone — but only when you say so. Not to mention the fact there's a 200MP main camera, and  a main telephoto lens with 50MP resolution.<a class="view-deal button" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Charging-Warranty/dp/B0G4SWDH8P" target="_blank" rel="nofollow" data-dimension112="427fd5e0-d15e-11f1-b12f-35d75b49d0cc" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$1144">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I watched 3 movies with JBL and Samsung's 2026 flagship soundbars — here's the one I'd choose and why ]]></title>
                                                                                                <dc:content><![CDATA[ <p>As oxymoronic as it sounds, even <a href="https://www.tomsguide.com/best-picks/best-cheap-soundbars">cheap soundbars</a> are expensive. Flagship soundbars? Oof, don't look at the price tag if you're already feeling a bit weepy, because you won't like it. "How many zeros? That has to be a typo, right?" </p><p>Nope. No typo. Unfortunately, dropping well over $1,500 for one of the <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbars</a> is... normal? How can this possibly be <em>normal</em>? Who has that kind of money? Not me, that's for sure, but I'm here to help you make well-informed purchasing decisions. </p><p>I recently reviewed the <a href="https://www.tomsguide.com/audio/soundbars/jbl-bar-1300xmk2-review">JBL Bar 1300X MK2</a> and the <a href="https://tomsguide.com/audio/soundbars/samsung-q990h-review">Samsung Q990H</a> — both the American and Korean behemoths' current flagships. While the JBL option came out in late 2025, it's still the current flagship, hence my referring to it as 2026's flagship. Samsung's was released earlier in 2026. </p><p>These two soundbars represent the best of the best. While I'm sure you won't be disappointed by either, I know which one I would buy, and here's why. Let's get into it. </p><div class="product"><a data-dimension112="78735778-cec8-11f1-a431-db9918167909" data-action="Deal Block" data-label="Bar 1300X MK2" data-dimension48="Bar 1300X MK2" data-dimension25="$1399.95" href="https://www.amazon.com/JBL-1300XMK2-11-1-4-soundbar-Detachable-Surround/dp/B0FN1JLNCN" 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="Z94hVSPwNpy3qJHxkYG9Tm" name="jbl bar 1300mk2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Z94hVSPwNpy3qJHxkYG9Tm-1920-80.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Not only is the JBL Bar 1300X MK2 one of the best soundbars on the market right now, it's also randomly discounted. The 11.4.1 channel soundbar is the easiest way to get cinematic, movie theater sound quality at home. Removable, wireless rear speakers and a floorboard-quaking subwoofer are the cherry on top.<a class="view-deal button" href="https://www.amazon.com/JBL-1300XMK2-11-1-4-soundbar-Detachable-Surround/dp/B0FN1JLNCN" target="_blank" rel="nofollow" data-dimension112="78735778-cec8-11f1-a431-db9918167909" data-action="Deal Block" data-label="Bar 1300X MK2" data-dimension48="Bar 1300X MK2" data-dimension25="$1399.95">View Deal</a></p></div><div class="product"><a data-dimension112="78735804-cec8-11f1-a8f4-354ff44912f9" data-action="Deal Block" data-label="Q990H" data-dimension48="Q990H" data-dimension25="$1497.99" href="https://www.amazon.com/Samsung-Soundbar-HW-Q990H-Wireless-Subwoofer/dp/B0GL1Q8P1P/" 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="y6E97egDkEYoevVyJnveDM" name="samsung q990h deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/y6E97egDkEYoevVyJnveDM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>There must be something in the water, because even Samsung's new flagship is discounted too. At just $1,500, the Q990H is a fantastic deal. The 11.4.1 channel soundbar has a huge 23 speakers for room-filling Dolby Atmos and a powerful 300W subwoofer to enrage your neighbors.<a class="view-deal button" href="https://www.amazon.com/Samsung-Soundbar-HW-Q990H-Wireless-Subwoofer/dp/B0GL1Q8P1P/" target="_blank" rel="nofollow" data-dimension112="78735804-cec8-11f1-a8f4-354ff44912f9" data-action="Deal Block" data-label="Q990H" data-dimension48="Q990H" data-dimension25="$1497.99">View Deal</a></p></div><h2 id="bass-battle">Bass battle</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TcKVby8SNBkZ5mjCbzZpqn" name="JBL Bar 1300XMK2 1.JPG" alt="the jbl bar 1300xmk2 in black photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/TcKVby8SNBkZ5mjCbzZpqn-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>Both the JBL Bar 1300X MK2 and the Samsung Q990H have extremely powerful bass. Both models come with a standalone 300W subwoofer. In real terms, that means hella bass. </p><p>In the U.S. model, JBL's sub has a single 12-inch driver, whilst the E.U. and U.K. model equals Samsung's dual 8-inch driver setup. As I'm in the U.K., I tested the dual-driver version, and, unfortunately, I can't confidently say if there's a tangible difference between the models. I can, however, assure you with every fiber of my being that the U.K. sub is Epic. Yes, with a capital 'E'. </p><p>I watched "Top Gun: Maverick" with both soundbars. Of the JBL, I wrote in my review, "The first scene, with Maverick flying in hypersonic, rumbled through the subwoofer with immense energy and depth." Even so, "each [high-frequency] siren blare and alarm was clear over the pounding bass", which proves the subwoofer doesn't overpower the rest of the soundstage.</p><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="8XPckJhsxiP3wVrm7szNGm" name="Samsung_Q990H_009.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/8XPckJhsxiP3wVrm7szNGm-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>Similarly, Samsung's bass performance was excellent during "The Batman". In my review, I wrote, "I could feel the subwoofer through the chair", and "My colleagues told me they could feel the subwoofer rumbling from downstairs, so I’m sorry, but I was having too much fun to care." </p><p>Yep, that's all I really needed to write, isn't it? What else can you ask for from a flagship soundbar? </p><p>There's also a bass boost mode on the JBL and Samsung apps, and individual subwoofer volume adjustments, which I set to the max during my testing period. While I wouldn't recommend this if you've got sensitive downstairs neighbors, you can seriously push the subs to their peaks. </p><h2 id="dialogue-duel">Dialogue duel</h2><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="AgJgD57ehj3GVTxdbLmCMm" name="Samsung_Q990H_002.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/AgJgD57ehj3GVTxdbLmCMm-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>One of the most important features in a soundbar is its ability to produce clear, intelligible dialogue without losing bass, high-frequency in-scene (diegetic) sound effects, soundtrack, and 360° audio. It's not a tall order, is it? </p><p>Both the Samsung and JBL models have a dialogue enhancement in the app. I didn't find the need to use this on the Samsung, not even during radio-ed dialogue scenes. JBL's isn't explicitly called dialogue mode, but Movie mode brings dialogue to the center channel, and the soundbar has something called PureVoice 2.0. In real terms, this means it's better at isolating and pronouncing speech than soundbars without PureVoice 2.0.</p><p>I've seen some users online discredit the 1300X MK2's dialogue performance, but I completely disagree. I never struggled to hear dialogue; not during flying scenes in "Top Gun: Maverick", nor the action sequences in "No Time to Die". I heard every word. </p><p>The Samsung model is just as clear. In "Top Gun: Maverick"'s near-overwhelming dogfighting scenes, I "could hear every layer of in-scene plane sound effects, each rich guitar chord, and every syllable of dialogue."</p><p>I don't think there's a clear winner here. Perhaps I'd recommend the Samsung if you know you have dialogue processing issues personally — due to the explicit dialogue enhancement mode — but I never strained to understand actors in any movie on either soundbar.</p><h2 id="dolby-atmos-dalliance">Dolby Atmos dalliance</h2><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="Vd96znQ6EEjdaQVZ2ey3un" name="JBL Bar 1300XMK2 8.JPG" alt="the jbl bar 1300xmk2 in black photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/Vd96znQ6EEjdaQVZ2ey3un-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>Dolby Atmos is another must-have feature when you're looking at premium, flagship soundbars. Of course, both the JBL and Samsung have DTS:X as well, but as I watched Dolby Atmos-enabled 4K UHD Blu-rays, I need to evaluate Dolby Atmos performance here. If you have DTS:X DVDs, just know both soundbars will play them to their full potential. </p><p>Even so, the JBL <em>just</em> took the win here. "Top Gun: Maverick" is the best movie to test Dolby Atmos (I'll fight you on this) thanks to the gorgeous flying scenes. When I watched this movie on the JBL, the planes "raced overhead as if I were truly outside."</p><p>On top of that, the OST was "bombastic without overpowering the screeching jet engine sounds, and the radio dialogue was surprisingly clear." </p><p>However, I still wanted a little more. Now that I've tested the $3,500 <a href="https://www.tomsguide.com/audio/soundbars/yamaha-true-x-surround-90a-review">Yamaha True X Surround 90A</a> — the best Dolby Atmos soundbar I've ever used, but way too expensive and with unimpressive dialogue performance — I'm a tough cookie. </p><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="wV4X2yPGWWecPpKULBc4uk" name="Samsung_Q990H_011.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/wV4X2yPGWWecPpKULBc4uk-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>Similarly, when I tested the Samsung, I wrote, "width is great, but the Q990H doesn’t sound <em>quite</em> as high as I’d like for $2k." </p><p>I could hear the planes around me, but the JBL did a better job of tricking me the planes were flying <em>over</em> me. "I wanted <em>more</em> from the surround speakers," I wrote of the Q990H. "Even on “Surround” mode, I wanted a stronger surround sound." </p><p>Although it's close, and although I still thoroughly enjoyed testing the Samsung Q990H, the JBL just cinched this victory. </p><h2 id="feature-facedown">Feature facedown</h2><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="tBVDm4vw8miY9HUb6Xf38m" name="Samsung_Q990H_004.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/tBVDm4vw8miY9HUb6Xf38m-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>New for 2026, Samsung no longer restricts its awesome "SpaceFit Sound Pro" to compatible AI Samsung TVs. I tested the Q990H on both an LG and a TCL and I enabled SpaceFit Sound Pro in SmartThings. </p><p>JBL has a similar room configuration tool, but its name is a little less snazzy: audio calibration. Boo! Where's the whimsy? Where's the trademarkeable moniker? </p><p>I jest, I jest. As long as the feature works, I really don't care what it's called. </p><p>Both Samsung and JBL's room calibration features work perfectly. When I tested the Samsung, the sound before was good enough, but it was a little pinched in the center speaker and a touch diffused on the rear channels. After enabling SpaceFit Sound Pro, the soundbar readjusted itself so the dialogue was more expansive.</p><p>Similarly, JBL's audio calibration increased the height, width, and depth of sound, providing a more immersive experience. </p><p>If you have an oddly shaped living room or weirdly low ceilings, both these calibration tools will adjust audio output to optimize for your space. I wouldn't buy a premium soundbar without 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XRGwSE7nSZ3NGj97mMmYtn" name="JBL Bar 1300XMK2 4.JPG" alt="the jbl bar 1300xmk2 in black photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/XRGwSE7nSZ3NGj97mMmYtn-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>Of course, both soundbars have more features than just automatic room calibration. Both have AirPlay, so you can play music from your phone to the devices, and both sound surprisingly great. Soundbars are notorious for making even the best songs sound mediocre, but that's not the case here. Bass is powerful and controlled through both 300W subwoofers, and the soundbars themselves do a fantastic job of separating vocals for maximum musicality. </p><p>There's a plethora of playback modes in both soundbars, namely dialogue enhancer and bass boost, which I discussed earlier.</p><p>However, there's one key place where the Samsung takes the lead: 4K pass-through at 120Hz. The JBL lags behind at just 60Hz (still — this was one of my major qualms with the original model). </p><p>If you're a 4K gamer, this will probably edge your hand towards the Samsung. Personally, though, I would never notice the 60Hz refresh rate, as I don't game. Just something to think about. </p><h2 id="my-choice">My choice</h2><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="uQDNtcvzR6tMJZuy2Zyvqn" name="JBL Bar 1300XMK2 2.JPG" alt="the jbl bar 1300xmk2 in black photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/uQDNtcvzR6tMJZuy2Zyvqn-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>This decision is much trickier right now — both soundbars are massively discounted. The JBL Bar 1300X MK2 is $300 off, down from $1,700 to $1,400. Similarly, Samsung's Q990H is $1,500 down from $2,000. Yes, a huge $500 off. </p><p>Before the discount, it's a no-brainer: grab the cheaper JBL if you don't have a Samsung TV. You'd save $400 and get a more immersive experience while you're at it. </p><p>I would personally still buy the JBL instead. I'm a famous (or infamous, depending on how you view it) spendthrift. If something is $9 and something else is $8.99, I'm buying the $8.99 one. I get to keep my cent! </p><p>Both soundbars have room-filling bass. Samsung and JBL's 300W subwoofers are both forces to be reckoned with, and both the 11-channel soundbars provide unbeatable dialogue clarity. On top of that, both have wireless rears for true Dolby Atmos immersion. </p><p>For me, though, the JBL <em>just</em> ekes out the win thanks to the <em>slightly</em> better height and more palatable price tag. </p><p>Which one would you buy? </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WQQEnW"></div>                            </div>                            <script src="https://kwizly.com/embed/WQQEnW.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/audio/ipod-25th-anniversary-25-things-you-need-to-know-about-the-product-that-changed-apple-and-the-world">iPod 25th Anniversary: 25 things you need to know about the product that changed Apple (and the world)</a></li><li><a href="https://www.tomsguide.com/audio/smart-speakers/bluesound-pulse-flex-review-tried-so-hard-and-got-so-far-but-its-not-a-slam-dunk-yet">Bluesound Pulse Flex review: Tried so hard and got so far, but it's not a slam-dunk (yet)</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/7-new-movies-and-shows-to-stream-this-weekend-on-netflix-hulu-and-more-oct-23-25">7 new movies and shows to stream this weekend on Netflix, Hulu and more (Oct. 23-25)</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/audio/soundbars/i-watched-3-movies-with-jbl-and-samsungs-2026-flagship-soundbars-heres-the-one-id-choose-and-why</link>
                                                                            <description>
                            <![CDATA[ Which 2026 flagship soundbar reigns supreme: Samsung Q990H or JBL Bar 1300X MK2? Here's the model I'd buy and why. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LT7PRczFAhNi8YEXqFWmpJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/uKiBX2wqj4s52U733ooNyN-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 25 Oct 2026 10:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Soundbars]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Speakers]]></category>
                                                                                                <author><![CDATA[ erin.bashford@futurenet.com (Erin Bashford) ]]></author>                    <dc:creator><![CDATA[ Erin Bashford ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/rLvJvJVZx43hEzSsJy3BpL-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Erin Bashford is a senior reviews writer at Tom’s Guide. She has a Master’s in Broadcast and Digital Journalism from the University of East Anglia and 7 years of experience reviewing music and events for various publications. She has edited publications such as Outline Magazine’s Guide to Norwich, and she has written for a number of music magazines and websites such as Clash Magazine, Outline Magazine and Dork Magazine. She has a strong interest in audio gear and the music world. &lt;/p&gt;&lt;p&gt;As an ex-barista, Erin is passionate about coffee tech. She also loves finding the best cooking hacks and kitchen appliances, including her beloved Instant Pot. &lt;/p&gt;&lt;p&gt;In her spare time, you can find her reading, practising yoga, hiking, writing fantasy novels, or stressing over NYT Games.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/uKiBX2wqj4s52U733ooNyN-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a photo of the jbl bar 1300xmk2 (left) and samsung q990h (right) showing subwoofer and rear speakers]]></media:description>                                                            <media:text><![CDATA[a photo of the jbl bar 1300xmk2 (left) and samsung q990h (right) showing subwoofer and rear speakers]]></media:text>
                                <media:title type="plain"><![CDATA[a photo of the jbl bar 1300xmk2 (left) and samsung q990h (right) showing subwoofer and rear speakers]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/uKiBX2wqj4s52U733ooNyN-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As oxymoronic as it sounds, even <a href="https://www.tomsguide.com/best-picks/best-cheap-soundbars">cheap soundbars</a> are expensive. Flagship soundbars? Oof, don't look at the price tag if you're already feeling a bit weepy, because you won't like it. "How many zeros? That has to be a typo, right?" </p><p>Nope. No typo. Unfortunately, dropping well over $1,500 for one of the <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbars</a> is... normal? How can this possibly be <em>normal</em>? Who has that kind of money? Not me, that's for sure, but I'm here to help you make well-informed purchasing decisions. </p><p>I recently reviewed the <a href="https://www.tomsguide.com/audio/soundbars/jbl-bar-1300xmk2-review">JBL Bar 1300X MK2</a> and the <a href="https://tomsguide.com/audio/soundbars/samsung-q990h-review">Samsung Q990H</a> — both the American and Korean behemoths' current flagships. While the JBL option came out in late 2025, it's still the current flagship, hence my referring to it as 2026's flagship. Samsung's was released earlier in 2026. </p><p>These two soundbars represent the best of the best. While I'm sure you won't be disappointed by either, I know which one I would buy, and here's why. Let's get into it. </p><div class="product"><a data-dimension112="78735778-cec8-11f1-a431-db9918167909" data-action="Deal Block" data-label="Bar 1300X MK2" data-dimension48="Bar 1300X MK2" data-dimension25="$1399.95" href="https://www.amazon.com/JBL-1300XMK2-11-1-4-soundbar-Detachable-Surround/dp/B0FN1JLNCN" 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="Z94hVSPwNpy3qJHxkYG9Tm" name="jbl bar 1300mk2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Z94hVSPwNpy3qJHxkYG9Tm-1920-80.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Not only is the JBL Bar 1300X MK2 one of the best soundbars on the market right now, it's also randomly discounted. The 11.4.1 channel soundbar is the easiest way to get cinematic, movie theater sound quality at home. Removable, wireless rear speakers and a floorboard-quaking subwoofer are the cherry on top.<a class="view-deal button" href="https://www.amazon.com/JBL-1300XMK2-11-1-4-soundbar-Detachable-Surround/dp/B0FN1JLNCN" target="_blank" rel="nofollow" data-dimension112="78735778-cec8-11f1-a431-db9918167909" data-action="Deal Block" data-label="Bar 1300X MK2" data-dimension48="Bar 1300X MK2" data-dimension25="$1399.95">View Deal</a></p></div><div class="product"><a data-dimension112="78735804-cec8-11f1-a8f4-354ff44912f9" data-action="Deal Block" data-label="Q990H" data-dimension48="Q990H" data-dimension25="$1497.99" href="https://www.amazon.com/Samsung-Soundbar-HW-Q990H-Wireless-Subwoofer/dp/B0GL1Q8P1P/" 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="y6E97egDkEYoevVyJnveDM" name="samsung q990h deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/y6E97egDkEYoevVyJnveDM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>There must be something in the water, because even Samsung's new flagship is discounted too. At just $1,500, the Q990H is a fantastic deal. The 11.4.1 channel soundbar has a huge 23 speakers for room-filling Dolby Atmos and a powerful 300W subwoofer to enrage your neighbors.<a class="view-deal button" href="https://www.amazon.com/Samsung-Soundbar-HW-Q990H-Wireless-Subwoofer/dp/B0GL1Q8P1P/" target="_blank" rel="nofollow" data-dimension112="78735804-cec8-11f1-a8f4-354ff44912f9" data-action="Deal Block" data-label="Q990H" data-dimension48="Q990H" data-dimension25="$1497.99">View Deal</a></p></div><h2 id="bass-battle">Bass battle</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TcKVby8SNBkZ5mjCbzZpqn" name="JBL Bar 1300XMK2 1.JPG" alt="the jbl bar 1300xmk2 in black photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/TcKVby8SNBkZ5mjCbzZpqn-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>Both the JBL Bar 1300X MK2 and the Samsung Q990H have extremely powerful bass. Both models come with a standalone 300W subwoofer. In real terms, that means hella bass. </p><p>In the U.S. model, JBL's sub has a single 12-inch driver, whilst the E.U. and U.K. model equals Samsung's dual 8-inch driver setup. As I'm in the U.K., I tested the dual-driver version, and, unfortunately, I can't confidently say if there's a tangible difference between the models. I can, however, assure you with every fiber of my being that the U.K. sub is Epic. Yes, with a capital 'E'. </p><p>I watched "Top Gun: Maverick" with both soundbars. Of the JBL, I wrote in my review, "The first scene, with Maverick flying in hypersonic, rumbled through the subwoofer with immense energy and depth." Even so, "each [high-frequency] siren blare and alarm was clear over the pounding bass", which proves the subwoofer doesn't overpower the rest of the soundstage.</p><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="8XPckJhsxiP3wVrm7szNGm" name="Samsung_Q990H_009.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/8XPckJhsxiP3wVrm7szNGm-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>Similarly, Samsung's bass performance was excellent during "The Batman". In my review, I wrote, "I could feel the subwoofer through the chair", and "My colleagues told me they could feel the subwoofer rumbling from downstairs, so I’m sorry, but I was having too much fun to care." </p><p>Yep, that's all I really needed to write, isn't it? What else can you ask for from a flagship soundbar? </p><p>There's also a bass boost mode on the JBL and Samsung apps, and individual subwoofer volume adjustments, which I set to the max during my testing period. While I wouldn't recommend this if you've got sensitive downstairs neighbors, you can seriously push the subs to their peaks. </p><h2 id="dialogue-duel">Dialogue duel</h2><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="AgJgD57ehj3GVTxdbLmCMm" name="Samsung_Q990H_002.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/AgJgD57ehj3GVTxdbLmCMm-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>One of the most important features in a soundbar is its ability to produce clear, intelligible dialogue without losing bass, high-frequency in-scene (diegetic) sound effects, soundtrack, and 360° audio. It's not a tall order, is it? </p><p>Both the Samsung and JBL models have a dialogue enhancement in the app. I didn't find the need to use this on the Samsung, not even during radio-ed dialogue scenes. JBL's isn't explicitly called dialogue mode, but Movie mode brings dialogue to the center channel, and the soundbar has something called PureVoice 2.0. In real terms, this means it's better at isolating and pronouncing speech than soundbars without PureVoice 2.0.</p><p>I've seen some users online discredit the 1300X MK2's dialogue performance, but I completely disagree. I never struggled to hear dialogue; not during flying scenes in "Top Gun: Maverick", nor the action sequences in "No Time to Die". I heard every word. </p><p>The Samsung model is just as clear. In "Top Gun: Maverick"'s near-overwhelming dogfighting scenes, I "could hear every layer of in-scene plane sound effects, each rich guitar chord, and every syllable of dialogue."</p><p>I don't think there's a clear winner here. Perhaps I'd recommend the Samsung if you know you have dialogue processing issues personally — due to the explicit dialogue enhancement mode — but I never strained to understand actors in any movie on either soundbar.</p><h2 id="dolby-atmos-dalliance">Dolby Atmos dalliance</h2><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="Vd96znQ6EEjdaQVZ2ey3un" name="JBL Bar 1300XMK2 8.JPG" alt="the jbl bar 1300xmk2 in black photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/Vd96znQ6EEjdaQVZ2ey3un-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>Dolby Atmos is another must-have feature when you're looking at premium, flagship soundbars. Of course, both the JBL and Samsung have DTS:X as well, but as I watched Dolby Atmos-enabled 4K UHD Blu-rays, I need to evaluate Dolby Atmos performance here. If you have DTS:X DVDs, just know both soundbars will play them to their full potential. </p><p>Even so, the JBL <em>just</em> took the win here. "Top Gun: Maverick" is the best movie to test Dolby Atmos (I'll fight you on this) thanks to the gorgeous flying scenes. When I watched this movie on the JBL, the planes "raced overhead as if I were truly outside."</p><p>On top of that, the OST was "bombastic without overpowering the screeching jet engine sounds, and the radio dialogue was surprisingly clear." </p><p>However, I still wanted a little more. Now that I've tested the $3,500 <a href="https://www.tomsguide.com/audio/soundbars/yamaha-true-x-surround-90a-review">Yamaha True X Surround 90A</a> — the best Dolby Atmos soundbar I've ever used, but way too expensive and with unimpressive dialogue performance — I'm a tough cookie. </p><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="wV4X2yPGWWecPpKULBc4uk" name="Samsung_Q990H_011.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/wV4X2yPGWWecPpKULBc4uk-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>Similarly, when I tested the Samsung, I wrote, "width is great, but the Q990H doesn’t sound <em>quite</em> as high as I’d like for $2k." </p><p>I could hear the planes around me, but the JBL did a better job of tricking me the planes were flying <em>over</em> me. "I wanted <em>more</em> from the surround speakers," I wrote of the Q990H. "Even on “Surround” mode, I wanted a stronger surround sound." </p><p>Although it's close, and although I still thoroughly enjoyed testing the Samsung Q990H, the JBL just cinched this victory. </p><h2 id="feature-facedown">Feature facedown</h2><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="tBVDm4vw8miY9HUb6Xf38m" name="Samsung_Q990H_004.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/tBVDm4vw8miY9HUb6Xf38m-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>New for 2026, Samsung no longer restricts its awesome "SpaceFit Sound Pro" to compatible AI Samsung TVs. I tested the Q990H on both an LG and a TCL and I enabled SpaceFit Sound Pro in SmartThings. </p><p>JBL has a similar room configuration tool, but its name is a little less snazzy: audio calibration. Boo! Where's the whimsy? Where's the trademarkeable moniker? </p><p>I jest, I jest. As long as the feature works, I really don't care what it's called. </p><p>Both Samsung and JBL's room calibration features work perfectly. When I tested the Samsung, the sound before was good enough, but it was a little pinched in the center speaker and a touch diffused on the rear channels. After enabling SpaceFit Sound Pro, the soundbar readjusted itself so the dialogue was more expansive.</p><p>Similarly, JBL's audio calibration increased the height, width, and depth of sound, providing a more immersive experience. </p><p>If you have an oddly shaped living room or weirdly low ceilings, both these calibration tools will adjust audio output to optimize for your space. I wouldn't buy a premium soundbar without 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XRGwSE7nSZ3NGj97mMmYtn" name="JBL Bar 1300XMK2 4.JPG" alt="the jbl bar 1300xmk2 in black photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/XRGwSE7nSZ3NGj97mMmYtn-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>Of course, both soundbars have more features than just automatic room calibration. Both have AirPlay, so you can play music from your phone to the devices, and both sound surprisingly great. Soundbars are notorious for making even the best songs sound mediocre, but that's not the case here. Bass is powerful and controlled through both 300W subwoofers, and the soundbars themselves do a fantastic job of separating vocals for maximum musicality. </p><p>There's a plethora of playback modes in both soundbars, namely dialogue enhancer and bass boost, which I discussed earlier.</p><p>However, there's one key place where the Samsung takes the lead: 4K pass-through at 120Hz. The JBL lags behind at just 60Hz (still — this was one of my major qualms with the original model). </p><p>If you're a 4K gamer, this will probably edge your hand towards the Samsung. Personally, though, I would never notice the 60Hz refresh rate, as I don't game. Just something to think about. </p><h2 id="my-choice">My choice</h2><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="uQDNtcvzR6tMJZuy2Zyvqn" name="JBL Bar 1300XMK2 2.JPG" alt="the jbl bar 1300xmk2 in black photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/uQDNtcvzR6tMJZuy2Zyvqn-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>This decision is much trickier right now — both soundbars are massively discounted. The JBL Bar 1300X MK2 is $300 off, down from $1,700 to $1,400. Similarly, Samsung's Q990H is $1,500 down from $2,000. Yes, a huge $500 off. </p><p>Before the discount, it's a no-brainer: grab the cheaper JBL if you don't have a Samsung TV. You'd save $400 and get a more immersive experience while you're at it. </p><p>I would personally still buy the JBL instead. I'm a famous (or infamous, depending on how you view it) spendthrift. If something is $9 and something else is $8.99, I'm buying the $8.99 one. I get to keep my cent! </p><p>Both soundbars have room-filling bass. Samsung and JBL's 300W subwoofers are both forces to be reckoned with, and both the 11-channel soundbars provide unbeatable dialogue clarity. On top of that, both have wireless rears for true Dolby Atmos immersion. </p><p>For me, though, the JBL <em>just</em> ekes out the win thanks to the <em>slightly</em> better height and more palatable price tag. </p><p>Which one would you buy? </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WQQEnW"></div>                            </div>                            <script src="https://kwizly.com/embed/WQQEnW.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/audio/ipod-25th-anniversary-25-things-you-need-to-know-about-the-product-that-changed-apple-and-the-world">iPod 25th Anniversary: 25 things you need to know about the product that changed Apple (and the world)</a></li><li><a href="https://www.tomsguide.com/audio/smart-speakers/bluesound-pulse-flex-review-tried-so-hard-and-got-so-far-but-its-not-a-slam-dunk-yet">Bluesound Pulse Flex review: Tried so hard and got so far, but it's not a slam-dunk (yet)</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/7-new-movies-and-shows-to-stream-this-weekend-on-netflix-hulu-and-more-oct-23-25">7 new movies and shows to stream this weekend on Netflix, Hulu and more (Oct. 23-25)</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ My highest-rated flagship soundbars are already discounted before Black Friday — up to $500 off ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Black Friday is still a month away, but the deals are seemingly already here. I know, I know, I was just as confused as you. I was researching a long-form comparison piece, and randomly discovered both JBL and Samsung's flagship 2026 soundbars are <em>already discounted</em> — and obviously I had to let you know about it. </p><p>The <a href="https://www.tomsguide.com/audio/soundbars/jbl-bar-1300xmk2-review">JBL Bar 1300XMK2</a> and the <a href="https://www.tomsguide.com/samsung-q990h-review">Samsung Q990H</a> are two of my highest-rated soundbars of this year. I adore both of these soundbars — Dolby Atmos performance is truly immersive (but the JBL is better!), dialogue is always perfectly clear, and bass is powerful thanks to the 300W subwoofers. </p><p>Are they the <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbars</a>? 100%. But at $1,699 (JBL) and $1,997 (Samsung), they're not cheap. I find it tricky to recommend soundbars at this price because it's just not accessible for most of us. Even so, it's your lucky day! Right now, the JBL Bar 1300XMK2 is just <a href="https://www.amazon.com/JBL-1300XMK2-11-1-4-soundbar-Detachable-Surround/dp/B0FN1JLNCN" target="_blank" rel="nofollow">$1,399 on Amazon</a>, and the Samsung Q990H is just <a href="https://www.amazon.com/Samsung-Soundbar-HW-Q990H-Wireless-Subwoofer/dp/B0GL1Q8P1P/">$1,497 also at Amazon</a>. Score!</p><div class="product"><a data-dimension112="a082c3ae-cee9-11f1-b075-2927db6cff83" data-action="Deal Block" data-label="Bar 1300X MK2" data-dimension48="Bar 1300X MK2" data-dimension25="$1399" href="https://www.amazon.com/JBL-1300XMK2-11-1-4-soundbar-Detachable-Surround/dp/B0FN1JLNCN" 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="Z94hVSPwNpy3qJHxkYG9Tm" name="jbl bar 1300mk2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Z94hVSPwNpy3qJHxkYG9Tm-1920-80.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>At $1,399, the JBL Bar 1300X MK2 is even better value — and it was already good value at $1,699. JBL's treating us ahead of Black Friday, clearly! I was pleasantly surprised when I stumbled upon this deal, and I hope you are too.<a class="view-deal button" href="https://www.amazon.com/JBL-1300XMK2-11-1-4-soundbar-Detachable-Surround/dp/B0FN1JLNCN" target="_blank" rel="nofollow" data-dimension112="a082c3ae-cee9-11f1-b075-2927db6cff83" data-action="Deal Block" data-label="Bar 1300X MK2" data-dimension48="Bar 1300X MK2" data-dimension25="$1399">View Deal</a></p></div><div class="product"><a data-dimension112="a082c494-cee9-11f1-8953-670289566317" data-action="Deal Block" data-label="Q990H" data-dimension48="Q990H" data-dimension25="$1497" href="https://www.amazon.com/Samsung-Soundbar-HW-Q990H-Wireless-Subwoofer/dp/B0GL1Q8P1P/" 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="y6E97egDkEYoevVyJnveDM" name="samsung q990h deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/y6E97egDkEYoevVyJnveDM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Just like the JBL Bar 1300X MK2, I was extremely surprised to see the Samsung Q990H discounted already. Either it's completely random, or Black Friday's coming early? Who knows! Right now you can save a whole $500 on this full cinematic setup for the ultimate movie night.<a class="view-deal button" href="https://www.amazon.com/Samsung-Soundbar-HW-Q990H-Wireless-Subwoofer/dp/B0GL1Q8P1P/" target="_blank" rel="nofollow" data-dimension112="a082c494-cee9-11f1-8953-670289566317" data-action="Deal Block" data-label="Q990H" data-dimension48="Q990H" data-dimension25="$1497">View Deal</a></p></div><p>Both the JBL and Samsung models have 23 drivers and 300W subwoofers, and an 11.1.4 channel configuration. In real terms, this means there are 11 channels in the center soundbar, one subwoofer channel, and four rear speaker channels. </p><p>If you want genuine Dolby Atmos, you need at least a 3.1.2 channel — so you know 11.1.4 means business. With so many channels, the soundbars can project layers of sound in all directions, providing a genuinely immersive experience. </p><p>On top of that, the Samsung soundbar has 4K pass-through at 120Hz, which is great for gamers. While the JBL misses out on this, if you're not a gamer, it probably won't be a huge issue.</p><div><blockquote><p>I would probably buy the JBL because it's a better-value product than the Samsung.</p></blockquote></div><p>I would probably buy the JBL because it's a better-value product than the Samsung. You get better immersion for less money, but there's no dedicated dialogue mode. If you struggle to hear dialogue sometimes, you might need the Samsung's AI dialogue enhancer. </p><p>But both flagships discounted at the same time before Black Friday? It's almost too good to be true.</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/huge-android-phone-sale-at-best-buy-save-on-pixel-galaxy-z-fold-8-and-more">Huge Android phone sale at Best Buy: save on Pixel, Galaxy Z Fold 8 and more</a></li><li><a href="https://www.tomsguide.com/sales-events/35-best-amazon-deals-worth-shopping-this-weekend-my-favorite-fall-finds-starting-at-usd17-from-apple-skechers-carhartt-and-more">35 best Amazon deals worth shopping this weekend — my favorite fall finds starting at $17 from Apple, Skechers, Carhartt and more</a></li><li><a href="https://www.tomsguide.com/sales-events/black-friday-is-weeks-away-but-these-37-amazon-deals-are-worth-shopping-right-now">Black Friday is weeks away, but these 37 Amazon deals are worth shopping right now</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/audio/soundbars/my-highest-rated-flagship-soundbars-are-already-discounted-before-black-friday-up-to-usd500-off</link>
                                                                            <description>
                            <![CDATA[ My favorite JBL and Samsung flagship soundbars + subwoofers are already discounted in this early Black Friday deal. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">fEg2fzSuuW5rjrogkQkuJ6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ZqPZJ2QrZXpcdm2mdWs7f8-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 23 Oct 2026 16:25:09 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Soundbars]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Speakers]]></category>
                                                                                                <author><![CDATA[ erin.bashford@futurenet.com (Erin Bashford) ]]></author>                    <dc:creator><![CDATA[ Erin Bashford ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/rLvJvJVZx43hEzSsJy3BpL-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Erin Bashford is a senior reviews writer at Tom’s Guide. She has a Master’s in Broadcast and Digital Journalism from the University of East Anglia and 7 years of experience reviewing music and events for various publications. She has edited publications such as Outline Magazine’s Guide to Norwich, and she has written for a number of music magazines and websites such as Clash Magazine, Outline Magazine and Dork Magazine. She has a strong interest in audio gear and the music world. &lt;/p&gt;&lt;p&gt;As an ex-barista, Erin is passionate about coffee tech. She also loves finding the best cooking hacks and kitchen appliances, including her beloved Instant Pot. &lt;/p&gt;&lt;p&gt;In her spare time, you can find her reading, practising yoga, hiking, writing fantasy novels, or stressing over NYT Games.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ZqPZJ2QrZXpcdm2mdWs7f8-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[the jbl bar 1300xmk2 and the samsung q990h soundbars with subwoofers and rear speakers and a tom&#039;s guide black friday badge]]></media:description>                                                            <media:text><![CDATA[the jbl bar 1300xmk2 and the samsung q990h soundbars with subwoofers and rear speakers and a tom&#039;s guide black friday badge]]></media:text>
                                <media:title type="plain"><![CDATA[the jbl bar 1300xmk2 and the samsung q990h soundbars with subwoofers and rear speakers and a tom&#039;s guide black friday badge]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ZqPZJ2QrZXpcdm2mdWs7f8-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Black Friday is still a month away, but the deals are seemingly already here. I know, I know, I was just as confused as you. I was researching a long-form comparison piece, and randomly discovered both JBL and Samsung's flagship 2026 soundbars are <em>already discounted</em> — and obviously I had to let you know about it. </p><p>The <a href="https://www.tomsguide.com/audio/soundbars/jbl-bar-1300xmk2-review">JBL Bar 1300XMK2</a> and the <a href="https://www.tomsguide.com/samsung-q990h-review">Samsung Q990H</a> are two of my highest-rated soundbars of this year. I adore both of these soundbars — Dolby Atmos performance is truly immersive (but the JBL is better!), dialogue is always perfectly clear, and bass is powerful thanks to the 300W subwoofers. </p><p>Are they the <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbars</a>? 100%. But at $1,699 (JBL) and $1,997 (Samsung), they're not cheap. I find it tricky to recommend soundbars at this price because it's just not accessible for most of us. Even so, it's your lucky day! Right now, the JBL Bar 1300XMK2 is just <a href="https://www.amazon.com/JBL-1300XMK2-11-1-4-soundbar-Detachable-Surround/dp/B0FN1JLNCN" target="_blank" rel="nofollow">$1,399 on Amazon</a>, and the Samsung Q990H is just <a href="https://www.amazon.com/Samsung-Soundbar-HW-Q990H-Wireless-Subwoofer/dp/B0GL1Q8P1P/">$1,497 also at Amazon</a>. Score!</p><div class="product"><a data-dimension112="a082c3ae-cee9-11f1-b075-2927db6cff83" data-action="Deal Block" data-label="Bar 1300X MK2" data-dimension48="Bar 1300X MK2" data-dimension25="$1399" href="https://www.amazon.com/JBL-1300XMK2-11-1-4-soundbar-Detachable-Surround/dp/B0FN1JLNCN" 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="Z94hVSPwNpy3qJHxkYG9Tm" name="jbl bar 1300mk2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Z94hVSPwNpy3qJHxkYG9Tm-1920-80.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>At $1,399, the JBL Bar 1300X MK2 is even better value — and it was already good value at $1,699. JBL's treating us ahead of Black Friday, clearly! I was pleasantly surprised when I stumbled upon this deal, and I hope you are too.<a class="view-deal button" href="https://www.amazon.com/JBL-1300XMK2-11-1-4-soundbar-Detachable-Surround/dp/B0FN1JLNCN" target="_blank" rel="nofollow" data-dimension112="a082c3ae-cee9-11f1-b075-2927db6cff83" data-action="Deal Block" data-label="Bar 1300X MK2" data-dimension48="Bar 1300X MK2" data-dimension25="$1399">View Deal</a></p></div><div class="product"><a data-dimension112="a082c494-cee9-11f1-8953-670289566317" data-action="Deal Block" data-label="Q990H" data-dimension48="Q990H" data-dimension25="$1497" href="https://www.amazon.com/Samsung-Soundbar-HW-Q990H-Wireless-Subwoofer/dp/B0GL1Q8P1P/" 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="y6E97egDkEYoevVyJnveDM" name="samsung q990h deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/y6E97egDkEYoevVyJnveDM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Just like the JBL Bar 1300X MK2, I was extremely surprised to see the Samsung Q990H discounted already. Either it's completely random, or Black Friday's coming early? Who knows! Right now you can save a whole $500 on this full cinematic setup for the ultimate movie night.<a class="view-deal button" href="https://www.amazon.com/Samsung-Soundbar-HW-Q990H-Wireless-Subwoofer/dp/B0GL1Q8P1P/" target="_blank" rel="nofollow" data-dimension112="a082c494-cee9-11f1-8953-670289566317" data-action="Deal Block" data-label="Q990H" data-dimension48="Q990H" data-dimension25="$1497">View Deal</a></p></div><p>Both the JBL and Samsung models have 23 drivers and 300W subwoofers, and an 11.1.4 channel configuration. In real terms, this means there are 11 channels in the center soundbar, one subwoofer channel, and four rear speaker channels. </p><p>If you want genuine Dolby Atmos, you need at least a 3.1.2 channel — so you know 11.1.4 means business. With so many channels, the soundbars can project layers of sound in all directions, providing a genuinely immersive experience. </p><p>On top of that, the Samsung soundbar has 4K pass-through at 120Hz, which is great for gamers. While the JBL misses out on this, if you're not a gamer, it probably won't be a huge issue.</p><div><blockquote><p>I would probably buy the JBL because it's a better-value product than the Samsung.</p></blockquote></div><p>I would probably buy the JBL because it's a better-value product than the Samsung. You get better immersion for less money, but there's no dedicated dialogue mode. If you struggle to hear dialogue sometimes, you might need the Samsung's AI dialogue enhancer. </p><p>But both flagships discounted at the same time before Black Friday? It's almost too good to be true.</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/huge-android-phone-sale-at-best-buy-save-on-pixel-galaxy-z-fold-8-and-more">Huge Android phone sale at Best Buy: save on Pixel, Galaxy Z Fold 8 and more</a></li><li><a href="https://www.tomsguide.com/sales-events/35-best-amazon-deals-worth-shopping-this-weekend-my-favorite-fall-finds-starting-at-usd17-from-apple-skechers-carhartt-and-more">35 best Amazon deals worth shopping this weekend — my favorite fall finds starting at $17 from Apple, Skechers, Carhartt and more</a></li><li><a href="https://www.tomsguide.com/sales-events/black-friday-is-weeks-away-but-these-37-amazon-deals-are-worth-shopping-right-now">Black Friday is weeks away, but these 37 Amazon deals are worth shopping right now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy S27 Ultra batteries leak — here's what we know ]]></title>
                                                                                                <dc:content><![CDATA[ <p>With the <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-duo-review">iPhone Duo</a> launch now out of the way, it's time to start looking forward to some of the phones headed our way in the near future — into 2027 and beyond. The next big release we're expecting is the Samsung Galaxy S27, and the latest leak may have revealed what batteries to expect from two of the four upcoming models.</p><p>That's right, four models, because rumor has it that Samsung will be releasing a <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">new Galaxy S27 Pro. </a>Presumably this is a device that will sit between the Plus and the Ultra models, though we'll have to wait and see just what Samsung has planned. This new battery leak covers the mysterious Pro and the flagship Galaxy S27 Ultra.</p><p>Two batteries have just shown up on the<a href="https://www.safetykorea.kr/release/certDetail" target="_blank"> Safety Korea database</a>, alongside photos, featuring the model numbers EB-BS957CBY and EB-BS958DBY. This lines up with the SM-S957 and SM-S958 model numbers tied to the S27 Pro and Ultra, suggesting these are the batteries we'll see in next year's high-end Galaxy phones.</p><p>We can't quite see the capacities, but <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-ultra-leak-reveals-silicon-carbon-battery-leap-but-also-a-camera-downgrade">past leaks suggest that we'll see 5,534 mAh and 5,087 mAh batteries, </a>with typical capacities of 5,700 mAh and 5,200 mAh, respectively. If those figures are accurate, it means this is the first time the Ultra model has had a battery capacity upgrade since the release of the <a href="https://www.tomsguide.com/reviews/galaxy-s20-ultra">Galaxy S20 Ultra </a>almost seven years ago. Charging is said to be 60W on both, which is the same as the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Galaxy S26 Ultra</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eAGKMO"></div>                            </div>                            <script src="https://kwizly.com/embed/eAGKMO.js" async></script><h2 id="this-is-a-long-time-coming">This is a long time coming</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LacgYzjqWKVkFAs6DKZ3ak" name="S27 Ultra render" alt="Samsung Galaxy S27 Ultra render" src="https://cdn.mos.cms.futurecdn.net/LacgYzjqWKVkFAs6DKZ3ak-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: @TechHome100)</span></figcaption></figure><p>For those that don't remember, the Galaxy S20 Ultra was the first of Samsung's modern Ultra phones, and it came with a 5,000 mAh battery — up from 4,100 mAh on the <a href="https://www.tomsguide.com/us/galaxy-s10-plus,review-6210.html">Galaxy S10 Plus.</a> This 700 mAh upgrade effectively means that the S27 Ultra is shaping up for an extra 100 mAh for every year Samsung ignored the calls for higher battery capacity.</p><div><blockquote><p>This 700 mAh upgrade effectively means that the S27 Ultra is shaping up for an extra 100 mAh for every year Samsung ignored the calls for higher battery capacity.</p></blockquote></div><p>Presumably this increase in capacity will be aided by Samsung's recent push into <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 technology</a>. As we saw with 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>, the different battery chemistry allows phone makers to improve battery density — packing more power into the same amount of space.</p><p>The batteries pictured don't look particularly big, which lends some support to that theory. Plus, the Z Fold 8 managed to adopt the new batteries without issue, and it makes little sense to avoid rolling silicon carbon out to other premium Samsung phones.</p><p>The Galaxy S27 series is expected to launch in early 2027, with rumors suggesting Samsung may pivot back to a January launch window. In the meantime we'll be seeing a lot more rumors about what all four phones can do, so stay tuned to Tom's Guide to hear all the best news and rumors as we hear about them.</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/i-put-the-iphone-duo-vs-galaxy-fold-8-through-a-10-round-photo-face-off-heres-the-winner">I put the iPhone Duo vs. Galaxy Fold 8 through a 10-round photo face-off — here’s the winner</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-duo-full-benchmarks-the-worlds-fastest-foldable-but-how-does-it-stack-up-to-iphone-18-pro">iPhone Duo full benchmarks — the world's fastest foldable, but how does it stack up to iPhone 18 Pro?</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ive-been-testing-dozens-of-iphone-duo-apps-heres-my-top-15-picks-so-far">I’ve been testing dozens of iPhone Duo apps — here’s my top 15 picks so far</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-ultra-batteries-leak-heres-what-we-know</link>
                                                                            <description>
                            <![CDATA[ Samsung may finally give Galaxy owners what they're been asking for — a proper battery upgrade in the Galaxy S27 Ultra. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">m2QqtVfW8EW6EoR3h3neoB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EKbAbDHJQJnhBVmx9jUbiC-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 23 Oct 2026 10:38:52 +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/EKbAbDHJQJnhBVmx9jUbiC-1920-80.jpg">
                                                            <media:credit><![CDATA[Ice Universe]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy S27 Ultra render]]></media:description>                                                            <media:text><![CDATA[Galaxy S27 Ultra render]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy S27 Ultra render]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EKbAbDHJQJnhBVmx9jUbiC-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With the <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-duo-review">iPhone Duo</a> launch now out of the way, it's time to start looking forward to some of the phones headed our way in the near future — into 2027 and beyond. The next big release we're expecting is the Samsung Galaxy S27, and the latest leak may have revealed what batteries to expect from two of the four upcoming models.</p><p>That's right, four models, because rumor has it that Samsung will be releasing a <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">new Galaxy S27 Pro. </a>Presumably this is a device that will sit between the Plus and the Ultra models, though we'll have to wait and see just what Samsung has planned. This new battery leak covers the mysterious Pro and the flagship Galaxy S27 Ultra.</p><p>Two batteries have just shown up on the<a href="https://www.safetykorea.kr/release/certDetail" target="_blank"> Safety Korea database</a>, alongside photos, featuring the model numbers EB-BS957CBY and EB-BS958DBY. This lines up with the SM-S957 and SM-S958 model numbers tied to the S27 Pro and Ultra, suggesting these are the batteries we'll see in next year's high-end Galaxy phones.</p><p>We can't quite see the capacities, but <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-ultra-leak-reveals-silicon-carbon-battery-leap-but-also-a-camera-downgrade">past leaks suggest that we'll see 5,534 mAh and 5,087 mAh batteries, </a>with typical capacities of 5,700 mAh and 5,200 mAh, respectively. If those figures are accurate, it means this is the first time the Ultra model has had a battery capacity upgrade since the release of the <a href="https://www.tomsguide.com/reviews/galaxy-s20-ultra">Galaxy S20 Ultra </a>almost seven years ago. Charging is said to be 60W on both, which is the same as the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Galaxy S26 Ultra</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eAGKMO"></div>                            </div>                            <script src="https://kwizly.com/embed/eAGKMO.js" async></script><h2 id="this-is-a-long-time-coming">This is a long time coming</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LacgYzjqWKVkFAs6DKZ3ak" name="S27 Ultra render" alt="Samsung Galaxy S27 Ultra render" src="https://cdn.mos.cms.futurecdn.net/LacgYzjqWKVkFAs6DKZ3ak-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: @TechHome100)</span></figcaption></figure><p>For those that don't remember, the Galaxy S20 Ultra was the first of Samsung's modern Ultra phones, and it came with a 5,000 mAh battery — up from 4,100 mAh on the <a href="https://www.tomsguide.com/us/galaxy-s10-plus,review-6210.html">Galaxy S10 Plus.</a> This 700 mAh upgrade effectively means that the S27 Ultra is shaping up for an extra 100 mAh for every year Samsung ignored the calls for higher battery capacity.</p><div><blockquote><p>This 700 mAh upgrade effectively means that the S27 Ultra is shaping up for an extra 100 mAh for every year Samsung ignored the calls for higher battery capacity.</p></blockquote></div><p>Presumably this increase in capacity will be aided by Samsung's recent push into <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 technology</a>. As we saw with 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>, the different battery chemistry allows phone makers to improve battery density — packing more power into the same amount of space.</p><p>The batteries pictured don't look particularly big, which lends some support to that theory. Plus, the Z Fold 8 managed to adopt the new batteries without issue, and it makes little sense to avoid rolling silicon carbon out to other premium Samsung phones.</p><p>The Galaxy S27 series is expected to launch in early 2027, with rumors suggesting Samsung may pivot back to a January launch window. In the meantime we'll be seeing a lot more rumors about what all four phones can do, so stay tuned to Tom's Guide to hear all the best news and rumors as we hear about them.</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/i-put-the-iphone-duo-vs-galaxy-fold-8-through-a-10-round-photo-face-off-heres-the-winner">I put the iPhone Duo vs. Galaxy Fold 8 through a 10-round photo face-off — here’s the winner</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-duo-full-benchmarks-the-worlds-fastest-foldable-but-how-does-it-stack-up-to-iphone-18-pro">iPhone Duo full benchmarks — the world's fastest foldable, but how does it stack up to iPhone 18 Pro?</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ive-been-testing-dozens-of-iphone-duo-apps-heres-my-top-15-picks-so-far">I’ve been testing dozens of iPhone Duo apps — here’s my top 15 picks so far</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Q990H review: A flagship soundbar in every sense of the word ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">Samsung Q990H review: Cheat sheet</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Price: </strong>3/5<br><strong>Sound quality: </strong>4.5/5<br><strong>Design: </strong>5/5<br><strong>Features: </strong>4.5/5<br><strong>Overall score: </strong>4.25/5<br><br><strong>Best for: </strong>Cinematic sound and high budgets</p></div></div><p>Flagship soundbars are always exciting to test. Enjoying blockbuster movies with best-of-the-best sound is, most definitely, one of the biggest perks of my job. And that’s exactly how I felt testing the Samsung Q990H. This is a flagship soundbar in (almost) every way — bass, dialogue, width; it’s got it all. </p><p>Is that enough to make it one of the <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbars</a>? It depends on how much you’re happy to spend. $2,000 is a lot of money, especially when soundbars like the JBL Bar 1300X MK2 exist for $300 less. SmartThings integration is a huge plus, especially if you have a Samsung TV, but I can’t tell you if that’s worth $300 over the JBL. </p><p>I’ll go through everything in detail, from design to subwoofer quality to Dolby Atmos performance in this Samsung Q990H review. </p><h2 class="article-body__section" id="section-samsung-q990h-review-specs"><span>Samsung Q990H review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Samsung-Soundbar-HW-Q990H-Wireless-Subwoofer/dp/B0GL1Q8P1P" target="_blank" rel="nofollow">$1,997</a> / <a href="https://www.samsung.com/uk/audio-devices/soundbar/q990h-black-hw-q990h-xu/" target="_blank" rel="nofollow">£1,499</a></p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>HDMI (eARC), Bluetooth</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>Soundbar: 16.1 pounds</p><p>Subwoofer: 18.3 pounds</p><p>Rears (each): 7.5 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>Soundbar: 48.5 x 2.8 x 5.4 inches</p><p>Subwoofer: 9.8 x 9.9 x 9.8 in</p><p>Rears (each): 5.1 x 7.9 x 5.5 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Subwoofer</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Dolby Atmos</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Channel</strong></p></td><td  ><p>11.1.4 (23 speakers)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-samsung-q990h-review-what-i-like"><span>Samsung Q990H review: What I like</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iyzpDHm3bFnW285fDxx9Mm" name="Samsung_Q990H_007.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/iyzpDHm3bFnW285fDxx9Mm-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>There’s so much to like about the Samsung Q990H — it <em>is</em> Samsung’s 2026 flagship, after all. </p><h2 id="supremely-clear-dialogue">Supremely clear dialogue</h2><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="m3cgcJp5nqY5Cv54goXXUk" name="Samsung_Q990H_012.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/m3cgcJp5nqY5Cv54goXXUk-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 SmartThings app has a number of dialogue-enhancing settings: “Active Voice Amplifier Pro”, “Voice enhancement”, and individual channel EQs. Even so, I found dialogue sounded more than good enough without any of these additional features. </p><p>I test all soundbars with “Top Gun: Maverick” on 4K UHD Blu-ray, alongside two other UHD Blu-rays, standard TV on streaming services, and music on Spotify and <a href="https://www.tomsguide.com/audio/qobuz-review">Qobuz</a>. </p><p>Dialogue in “Top Gun: Maverick” was extremely clear without additional dialogue features needed. In the busy bar scene, I could hear lead actors speaking clearly over the hubbub of the bar. “Top Gun: Maverick” also features tons of radioed dialogue in flying action sequences. I didn’t miss a single word. The screeching jet engines and soundtrack (“Won’t Get Fooled Again”) melded together nicely underneath the fuzzy dialogue. I could hear every layer of in-scene plane sound effects, each rich guitar chord, and every syllable of dialogue. </p><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="UdTJjpRYifFynbzQBvkfLm" name="Samsung_Q990H_015.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/UdTJjpRYifFynbzQBvkfLm-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>In “Super Mario Galaxy Movie”, dialogue was equally as clear. Just to reiterate, this was with zero dialogue enhancement features enabled. I could feel the texture in Bowser Jr.’s gravelly-yet-high-pitched voice. </p><p>“The Batman” features moody, mumbled dialogue for the majority of the movie. However, I never struggled to hear anything — neither the processed radio dialogue nor Robert Pattinson’s atmospheric voiceovers. Even in action scenes, I could make out every word. For such a broody, mumbled movie, this performance was excellent. </p><p>Even basic streaming services sounded good. Obviously, a basic-level stream will never sound as good as a UHD Blu-ray. I have Now TV’s cheapest tier (HBO for all you across-the-ponders), which uses Stereo audio — not even 5.1. </p><p>I’m not going to pretend this would impress any home cinema enthusiasts, but it’s the streaming service’s fault, not the soundbars. The Q990H did the best with what it was given; every word was clear, and I never struggled to understand dialogue. </p><h2 id="powerful-bass">Powerful bass</h2><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="wV4X2yPGWWecPpKULBc4uk" name="Samsung_Q990H_011.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/wV4X2yPGWWecPpKULBc4uk-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>As I’d hope from a $2,000, 300-watt subwoofer, bass is great, with no distortion. “The Batman” was a particular standout here. My colleagues told me they could feel the subwoofer rumbling from downstairs, so I’m sorry, but I was having too much fun to care. </p><p>The brooding, ominous soundtrack carried a decadent depth to the low-end, bringing body to low-action scenes. High-action scenes were equally as dramatic, especially the iconic car chase and the club scenes. I could feel the subwoofer through the chair. If you long for cinematic lows and clear dialogue, you won’t be disappointed.</p><p>Music performance is decent for a soundbar, too. I listened via AirPlay. Bass in Muse’s “Supermassive Black Hole” shook the floorboards without overpowering the falsetto vocals. Softer songs fared equally as well; “Kill Me” by Hayley Williams was delicate and controlled, and the texture in Williams’ voice came through. </p><h2 id="wireless-subwoofer-and-rears">Wireless subwoofer and rears</h2><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="w3YYFcbnktTSVZGgJtr9Mm" name="Samsung_Q990H_008.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/w3YYFcbnktTSVZGgJtr9Mm-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>Unlike the <a href="https://www.tomsguide.com/audio/soundbars/samsung-qs750f-review">Samsung QS750F</a> ($899), the Q990H’s rears (and subwoofer) are truly wireless. Each rear speaker and the subwoofer require only a power cable. They sync up automatically as soon as they’re plugged in. </p><p>When I set up the Q990H, I only had to connect everything to power — the sub and rears did the hard work for me. I didn’t even have to set them up in Samsung’s SmartThings app, which I was initially expecting to do. This was one of the easiest soundbar setups I've had the pleasure of experiencing.</p><p>The rear speakers are excellent in some movies and middling in others: of all the content I watched, by far the best movie for surround was “The Batman”. The car chase scene was immensely immersive. The soundtrack, pouring rain, and screeching cars were controlled deftly, and the speakers separated high-frequency effects with skill.</p><h2 id="design-features-and-smartthings">Design, features, and SmartThings</h2><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="Cz9rfnaaU8xUdNSNoiGsLk" name="Samsung_Q990H_013.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/Cz9rfnaaU8xUdNSNoiGsLk-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>Samsung soundbars really excel in terms of design. They all look more or less the same (except the Samsung Ultra Slim) — sleek, inconspicuous, and although quite plasticky, this doesn’t detract from the overall appearance. </p><p>Setup is also a breeze: I plugged all the elements in, hooked up the soundbar via HDMI, and I was listening in seconds. Samsung also provides a wall mount for the soundbar if that’s your thing. The rears don’t come with stands or mounts, but you can easily find third-party options online.</p><p>SmartThings is one of my favorite companion apps, and for good reason. It’s supremely easy to use, looks great, and is replete with genuinely beneficial features. No longer restricted to Samsung TVs, SpaceFit Sound Pro is Samsung’s proprietary room calibration feature. I was able to get this working with both an LG and a TCL TV. SpaceFit Sound Pro analyzes your room space to improve immersion. If you’ve got a bigger room, it will increase audio power to ensure you still get space-filling sound. </p><p>Without SpaceFit Sound Pro, “The Batman” still sounded immersive, particularly the rain sounds coming through the rear speakers. However, with SpaceFit Sound Pro enabled, the soundbar adjusted the center channel to make dialogue and OST clearer. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="sZVqZ52KvADfj6tn2ntf8Y" name="samsung q990h soundbar smartthings" alt="three screenshots from the smartthings app showing spacefit sound pro, channel volume adjustment, and the home screen" src="https://cdn.mos.cms.futurecdn.net/sZVqZ52KvADfj6tn2ntf8Y-1920-80.jpg" mos="" align="middle" fullscreen="" width="1510" height="850" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung / Tom's Guide)</span></figcaption></figure><p>In SmartThings, you can also adjust individual channel volume, sub volume, and treble/bass volume. I adjusted the rears and side-firing channels to the maximum volume, but I didn’t notice a huge difference. More on that in the “What I didn’t like” section below, though. </p><h2 id="wireless-listening">Wireless listening</h2><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="8XPckJhsxiP3wVrm7szNGm" name="Samsung_Q990H_009.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/8XPckJhsxiP3wVrm7szNGm-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>Now, this one comes with a caveat. You <em>can</em> use the Q990H wirelessly — if you have a compatible Samsung TV. As I test soundbars with LG and TCL TVs, I was unable to use this feature. </p><p>However, it’s still worth mentioning here. If you have a compatible Samsung TV (all Samsung TVs with Bluetooth or Wi-Fi), you’ll be able to use the soundbar without an HDMI cable. </p><h2 class="article-body__section" id="section-samsung-q990h-review-what-i-don-t-like"><span>Samsung Q990H review: What I don’t like</span></h2><p>As much as I enjoyed listening to the Samsung Q990H, it missed out on a perfect 5-star rating for a reason.</p><h2 id="sound-not-immersive-enough-for-2-000">Sound not immersive enough for $2,000</h2><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="tBVDm4vw8miY9HUb6Xf38m" name="Samsung_Q990H_004.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/tBVDm4vw8miY9HUb6Xf38m-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>Even though I love the Q990H, it’s not perfect. Don’t get me wrong, it sounds fantastic, and I’m sure you won’t be disappointed… unless you’ve just dropped two grand. </p><p>At $2,000, there’s very little room for error. Nay, there’s <em>zero</em> room for error. You could spend just a <em>little</em> (!) more on the $2,500 <a href="https://www.tomsguide.com/audio/soundbars/kef-xio-review">KEF XIO</a> or save money on the <a href="https://www.tomsguide.com/audio/soundbars/jbl-bar-1300xmk2-review">JBL Bar 1300X MK2</a> ($1,799). Honestly, I recommend the JBL Bar 1300X MK2 wholeheartedly. It’s by far the best bang-for-buck soundbar I’ve ever tested.</p><p>Anyway, back to the Samsung Q990H. You can adjust individual channel levels in SmartThings, but I didn’t notice this had a tangible difference. Width is great, but the Q990H doesn’t sound <em>quite</em> as high as I’d like for $2k. </p><p>As I discussed earlier, bass was a different story — I could feel every rumble of the jet engines in “Top Gun: Maverick” and the ominous soundtrack in “The Batman”. Music playback was also decent — soundbars are never excellent, though — but I wanted <em>more</em> from the surround speakers. Even on “Surround” mode, I wanted a stronger surround sound. The JBL Bar 1300X MK2 excels here. </p><p>Consequently, I’m reticent to recommend the Q990H widely unless you find it on sale. </p><h2 class="article-body__section" id="section-how-does-the-samsung-q990h-compare"><span>How does the Samsung Q990H compare?</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wJsR5wp8Qyobm5jXqCzCMm" name="Samsung_Q990H_010.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/wJsR5wp8Qyobm5jXqCzCMm-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>I would recommend the Samsung Q990H over some of the super high-end soundbars I’ve tested. Once you get to a certain price point, it might make a little more sense to invest in a buildable hi-fi setup (like floorstanders and loudspeakers). </p><p>For example, the $2,500 <a href="https://www.tomsguide.com/audio/soundbars/kef-xio-review">KEF XIO</a> and $3,500 <a href="https://www.tomsguide.com/audio/soundbars/yamaha-true-x-surround-90a-review">Yamaha True X Surround 90A</a> both sound excellent. Don’t get me wrong, you won’t be disappointed by their sound. The Yamaha soundbar is one of the best Dolby Atmos products I’ve ever used. However, they’re both eye-wateringly expensive. $2,000 is the most I would <em>ever</em> recommend spending on a soundbar.</p><p>There’s another <em>however</em> here, though. $2,000 is still incredibly expensive for a soundbar. Even though the Q990H sounds fantastic, with expansive width and clear dialogue… $2k is $2k. When you can get more immersive performance from the JBL Bar 1300X MK2 and similar performance with the $999 <a href="https://www.tomsguide.com/audio/soundbars/samsung-qs90h-review">Samsung QS90H</a> or <a href="https://www.tomsguide.com/audio/soundbars/sony-bravia-theater-bar-7-review">Sony Bravia Theater 7</a> ($1,099), I would recommend grabbing the Q990H on sale only. </p><h2 class="article-body__section" id="section-should-you-buy-the-samsung-q990h"><span>Should you buy the Samsung Q990H?</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oXEKax3Fh6rsA5MYq4CQQm" name="Samsung_Q990H_006.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/oXEKax3Fh6rsA5MYq4CQQm-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>It depends on your budget. Is $2,000 an easy amount for you to spend? Then you probably won’t be disappointed by the Samsung Q990H. Dialogue is honey-smooth and clear; bass is propulsive and energetic; Dolby Atmos is immersive and all-encompassing. The only thing missing is height, and that true cinematic experience. </p><p>If $2,000 is a lot for you (relatable), then I’d recommend checking out the JBL Bar 1300X MK2. This is by far the best bang-for-buck soundbar I’ve ever tested, with industry-leading audio power and immersion. </p><p>Of course, though, the Q990H is a fantastic soundbar in its own right, and well-deserving of the flagship name. It’s just really, really expensive. </p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/samsung-q990h-review</link>
                                                                            <description>
                            <![CDATA[ The Samsung Q990H is the behemoth's flagship for 2026, and it doesn't let you forget it. A 300W subwoofer and a 23-speaker system make for great listening. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">oCprZNSxcigNiujUj8Uyw4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aFUBLsRkSyt4syFUWmnKtk-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 23 Oct 2026 10:36:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Soundbars]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Speakers]]></category>
                                                                                                <author><![CDATA[ erin.bashford@futurenet.com (Erin Bashford) ]]></author>                    <dc:creator><![CDATA[ Erin Bashford ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/rLvJvJVZx43hEzSsJy3BpL-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Erin Bashford is a senior reviews writer at Tom’s Guide. She has a Master’s in Broadcast and Digital Journalism from the University of East Anglia and 7 years of experience reviewing music and events for various publications. She has edited publications such as Outline Magazine’s Guide to Norwich, and she has written for a number of music magazines and websites such as Clash Magazine, Outline Magazine and Dork Magazine. She has a strong interest in audio gear and the music world. &lt;/p&gt;&lt;p&gt;As an ex-barista, Erin is passionate about coffee tech. She also loves finding the best cooking hacks and kitchen appliances, including her beloved Instant Pot. &lt;/p&gt;&lt;p&gt;In her spare time, you can find her reading, practising yoga, hiking, writing fantasy novels, or stressing over NYT Games.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/aFUBLsRkSyt4syFUWmnKtk-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[the samsung q990h soundbar with subwoofer and rears]]></media:description>                                                            <media:text><![CDATA[the samsung q990h soundbar with subwoofer and rears]]></media:text>
                                <media:title type="plain"><![CDATA[the samsung q990h soundbar with subwoofer and rears]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aFUBLsRkSyt4syFUWmnKtk-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Samsung Q990H review: Cheat sheet</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Price: </strong>3/5<br><strong>Sound quality: </strong>4.5/5<br><strong>Design: </strong>5/5<br><strong>Features: </strong>4.5/5<br><strong>Overall score: </strong>4.25/5<br><br><strong>Best for: </strong>Cinematic sound and high budgets</p></div></div><p>Flagship soundbars are always exciting to test. Enjoying blockbuster movies with best-of-the-best sound is, most definitely, one of the biggest perks of my job. And that’s exactly how I felt testing the Samsung Q990H. This is a flagship soundbar in (almost) every way — bass, dialogue, width; it’s got it all. </p><p>Is that enough to make it one of the <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbars</a>? It depends on how much you’re happy to spend. $2,000 is a lot of money, especially when soundbars like the JBL Bar 1300X MK2 exist for $300 less. SmartThings integration is a huge plus, especially if you have a Samsung TV, but I can’t tell you if that’s worth $300 over the JBL. </p><p>I’ll go through everything in detail, from design to subwoofer quality to Dolby Atmos performance in this Samsung Q990H review. </p><h2 class="article-body__section" id="section-samsung-q990h-review-specs"><span>Samsung Q990H review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Samsung-Soundbar-HW-Q990H-Wireless-Subwoofer/dp/B0GL1Q8P1P" target="_blank" rel="nofollow">$1,997</a> / <a href="https://www.samsung.com/uk/audio-devices/soundbar/q990h-black-hw-q990h-xu/" target="_blank" rel="nofollow">£1,499</a></p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>HDMI (eARC), Bluetooth</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>Soundbar: 16.1 pounds</p><p>Subwoofer: 18.3 pounds</p><p>Rears (each): 7.5 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>Soundbar: 48.5 x 2.8 x 5.4 inches</p><p>Subwoofer: 9.8 x 9.9 x 9.8 in</p><p>Rears (each): 5.1 x 7.9 x 5.5 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Subwoofer</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Dolby Atmos</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Channel</strong></p></td><td  ><p>11.1.4 (23 speakers)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-samsung-q990h-review-what-i-like"><span>Samsung Q990H review: What I like</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iyzpDHm3bFnW285fDxx9Mm" name="Samsung_Q990H_007.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/iyzpDHm3bFnW285fDxx9Mm-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>There’s so much to like about the Samsung Q990H — it <em>is</em> Samsung’s 2026 flagship, after all. </p><h2 id="supremely-clear-dialogue">Supremely clear dialogue</h2><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="m3cgcJp5nqY5Cv54goXXUk" name="Samsung_Q990H_012.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/m3cgcJp5nqY5Cv54goXXUk-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 SmartThings app has a number of dialogue-enhancing settings: “Active Voice Amplifier Pro”, “Voice enhancement”, and individual channel EQs. Even so, I found dialogue sounded more than good enough without any of these additional features. </p><p>I test all soundbars with “Top Gun: Maverick” on 4K UHD Blu-ray, alongside two other UHD Blu-rays, standard TV on streaming services, and music on Spotify and <a href="https://www.tomsguide.com/audio/qobuz-review">Qobuz</a>. </p><p>Dialogue in “Top Gun: Maverick” was extremely clear without additional dialogue features needed. In the busy bar scene, I could hear lead actors speaking clearly over the hubbub of the bar. “Top Gun: Maverick” also features tons of radioed dialogue in flying action sequences. I didn’t miss a single word. The screeching jet engines and soundtrack (“Won’t Get Fooled Again”) melded together nicely underneath the fuzzy dialogue. I could hear every layer of in-scene plane sound effects, each rich guitar chord, and every syllable of dialogue. </p><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="UdTJjpRYifFynbzQBvkfLm" name="Samsung_Q990H_015.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/UdTJjpRYifFynbzQBvkfLm-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>In “Super Mario Galaxy Movie”, dialogue was equally as clear. Just to reiterate, this was with zero dialogue enhancement features enabled. I could feel the texture in Bowser Jr.’s gravelly-yet-high-pitched voice. </p><p>“The Batman” features moody, mumbled dialogue for the majority of the movie. However, I never struggled to hear anything — neither the processed radio dialogue nor Robert Pattinson’s atmospheric voiceovers. Even in action scenes, I could make out every word. For such a broody, mumbled movie, this performance was excellent. </p><p>Even basic streaming services sounded good. Obviously, a basic-level stream will never sound as good as a UHD Blu-ray. I have Now TV’s cheapest tier (HBO for all you across-the-ponders), which uses Stereo audio — not even 5.1. </p><p>I’m not going to pretend this would impress any home cinema enthusiasts, but it’s the streaming service’s fault, not the soundbars. The Q990H did the best with what it was given; every word was clear, and I never struggled to understand dialogue. </p><h2 id="powerful-bass">Powerful bass</h2><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="wV4X2yPGWWecPpKULBc4uk" name="Samsung_Q990H_011.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/wV4X2yPGWWecPpKULBc4uk-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>As I’d hope from a $2,000, 300-watt subwoofer, bass is great, with no distortion. “The Batman” was a particular standout here. My colleagues told me they could feel the subwoofer rumbling from downstairs, so I’m sorry, but I was having too much fun to care. </p><p>The brooding, ominous soundtrack carried a decadent depth to the low-end, bringing body to low-action scenes. High-action scenes were equally as dramatic, especially the iconic car chase and the club scenes. I could feel the subwoofer through the chair. If you long for cinematic lows and clear dialogue, you won’t be disappointed.</p><p>Music performance is decent for a soundbar, too. I listened via AirPlay. Bass in Muse’s “Supermassive Black Hole” shook the floorboards without overpowering the falsetto vocals. Softer songs fared equally as well; “Kill Me” by Hayley Williams was delicate and controlled, and the texture in Williams’ voice came through. </p><h2 id="wireless-subwoofer-and-rears">Wireless subwoofer and rears</h2><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="w3YYFcbnktTSVZGgJtr9Mm" name="Samsung_Q990H_008.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/w3YYFcbnktTSVZGgJtr9Mm-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>Unlike the <a href="https://www.tomsguide.com/audio/soundbars/samsung-qs750f-review">Samsung QS750F</a> ($899), the Q990H’s rears (and subwoofer) are truly wireless. Each rear speaker and the subwoofer require only a power cable. They sync up automatically as soon as they’re plugged in. </p><p>When I set up the Q990H, I only had to connect everything to power — the sub and rears did the hard work for me. I didn’t even have to set them up in Samsung’s SmartThings app, which I was initially expecting to do. This was one of the easiest soundbar setups I've had the pleasure of experiencing.</p><p>The rear speakers are excellent in some movies and middling in others: of all the content I watched, by far the best movie for surround was “The Batman”. The car chase scene was immensely immersive. The soundtrack, pouring rain, and screeching cars were controlled deftly, and the speakers separated high-frequency effects with skill.</p><h2 id="design-features-and-smartthings">Design, features, and SmartThings</h2><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="Cz9rfnaaU8xUdNSNoiGsLk" name="Samsung_Q990H_013.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/Cz9rfnaaU8xUdNSNoiGsLk-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>Samsung soundbars really excel in terms of design. They all look more or less the same (except the Samsung Ultra Slim) — sleek, inconspicuous, and although quite plasticky, this doesn’t detract from the overall appearance. </p><p>Setup is also a breeze: I plugged all the elements in, hooked up the soundbar via HDMI, and I was listening in seconds. Samsung also provides a wall mount for the soundbar if that’s your thing. The rears don’t come with stands or mounts, but you can easily find third-party options online.</p><p>SmartThings is one of my favorite companion apps, and for good reason. It’s supremely easy to use, looks great, and is replete with genuinely beneficial features. No longer restricted to Samsung TVs, SpaceFit Sound Pro is Samsung’s proprietary room calibration feature. I was able to get this working with both an LG and a TCL TV. SpaceFit Sound Pro analyzes your room space to improve immersion. If you’ve got a bigger room, it will increase audio power to ensure you still get space-filling sound. </p><p>Without SpaceFit Sound Pro, “The Batman” still sounded immersive, particularly the rain sounds coming through the rear speakers. However, with SpaceFit Sound Pro enabled, the soundbar adjusted the center channel to make dialogue and OST clearer. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="sZVqZ52KvADfj6tn2ntf8Y" name="samsung q990h soundbar smartthings" alt="three screenshots from the smartthings app showing spacefit sound pro, channel volume adjustment, and the home screen" src="https://cdn.mos.cms.futurecdn.net/sZVqZ52KvADfj6tn2ntf8Y-1920-80.jpg" mos="" align="middle" fullscreen="" width="1510" height="850" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung / Tom's Guide)</span></figcaption></figure><p>In SmartThings, you can also adjust individual channel volume, sub volume, and treble/bass volume. I adjusted the rears and side-firing channels to the maximum volume, but I didn’t notice a huge difference. More on that in the “What I didn’t like” section below, though. </p><h2 id="wireless-listening">Wireless listening</h2><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="8XPckJhsxiP3wVrm7szNGm" name="Samsung_Q990H_009.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/8XPckJhsxiP3wVrm7szNGm-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>Now, this one comes with a caveat. You <em>can</em> use the Q990H wirelessly — if you have a compatible Samsung TV. As I test soundbars with LG and TCL TVs, I was unable to use this feature. </p><p>However, it’s still worth mentioning here. If you have a compatible Samsung TV (all Samsung TVs with Bluetooth or Wi-Fi), you’ll be able to use the soundbar without an HDMI cable. </p><h2 class="article-body__section" id="section-samsung-q990h-review-what-i-don-t-like"><span>Samsung Q990H review: What I don’t like</span></h2><p>As much as I enjoyed listening to the Samsung Q990H, it missed out on a perfect 5-star rating for a reason.</p><h2 id="sound-not-immersive-enough-for-2-000">Sound not immersive enough for $2,000</h2><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="tBVDm4vw8miY9HUb6Xf38m" name="Samsung_Q990H_004.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/tBVDm4vw8miY9HUb6Xf38m-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>Even though I love the Q990H, it’s not perfect. Don’t get me wrong, it sounds fantastic, and I’m sure you won’t be disappointed… unless you’ve just dropped two grand. </p><p>At $2,000, there’s very little room for error. Nay, there’s <em>zero</em> room for error. You could spend just a <em>little</em> (!) more on the $2,500 <a href="https://www.tomsguide.com/audio/soundbars/kef-xio-review">KEF XIO</a> or save money on the <a href="https://www.tomsguide.com/audio/soundbars/jbl-bar-1300xmk2-review">JBL Bar 1300X MK2</a> ($1,799). Honestly, I recommend the JBL Bar 1300X MK2 wholeheartedly. It’s by far the best bang-for-buck soundbar I’ve ever tested.</p><p>Anyway, back to the Samsung Q990H. You can adjust individual channel levels in SmartThings, but I didn’t notice this had a tangible difference. Width is great, but the Q990H doesn’t sound <em>quite</em> as high as I’d like for $2k. </p><p>As I discussed earlier, bass was a different story — I could feel every rumble of the jet engines in “Top Gun: Maverick” and the ominous soundtrack in “The Batman”. Music playback was also decent — soundbars are never excellent, though — but I wanted <em>more</em> from the surround speakers. Even on “Surround” mode, I wanted a stronger surround sound. The JBL Bar 1300X MK2 excels here. </p><p>Consequently, I’m reticent to recommend the Q990H widely unless you find it on sale. </p><h2 class="article-body__section" id="section-how-does-the-samsung-q990h-compare"><span>How does the Samsung Q990H compare?</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wJsR5wp8Qyobm5jXqCzCMm" name="Samsung_Q990H_010.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/wJsR5wp8Qyobm5jXqCzCMm-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>I would recommend the Samsung Q990H over some of the super high-end soundbars I’ve tested. Once you get to a certain price point, it might make a little more sense to invest in a buildable hi-fi setup (like floorstanders and loudspeakers). </p><p>For example, the $2,500 <a href="https://www.tomsguide.com/audio/soundbars/kef-xio-review">KEF XIO</a> and $3,500 <a href="https://www.tomsguide.com/audio/soundbars/yamaha-true-x-surround-90a-review">Yamaha True X Surround 90A</a> both sound excellent. Don’t get me wrong, you won’t be disappointed by their sound. The Yamaha soundbar is one of the best Dolby Atmos products I’ve ever used. However, they’re both eye-wateringly expensive. $2,000 is the most I would <em>ever</em> recommend spending on a soundbar.</p><p>There’s another <em>however</em> here, though. $2,000 is still incredibly expensive for a soundbar. Even though the Q990H sounds fantastic, with expansive width and clear dialogue… $2k is $2k. When you can get more immersive performance from the JBL Bar 1300X MK2 and similar performance with the $999 <a href="https://www.tomsguide.com/audio/soundbars/samsung-qs90h-review">Samsung QS90H</a> or <a href="https://www.tomsguide.com/audio/soundbars/sony-bravia-theater-bar-7-review">Sony Bravia Theater 7</a> ($1,099), I would recommend grabbing the Q990H on sale only. </p><h2 class="article-body__section" id="section-should-you-buy-the-samsung-q990h"><span>Should you buy the Samsung Q990H?</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oXEKax3Fh6rsA5MYq4CQQm" name="Samsung_Q990H_006.JPG" alt="the samsung q990h soundbar with subwoofer and rears" src="https://cdn.mos.cms.futurecdn.net/oXEKax3Fh6rsA5MYq4CQQm-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>It depends on your budget. Is $2,000 an easy amount for you to spend? Then you probably won’t be disappointed by the Samsung Q990H. Dialogue is honey-smooth and clear; bass is propulsive and energetic; Dolby Atmos is immersive and all-encompassing. The only thing missing is height, and that true cinematic experience. </p><p>If $2,000 is a lot for you (relatable), then I’d recommend checking out the JBL Bar 1300X MK2. This is by far the best bang-for-buck soundbar I’ve ever tested, with industry-leading audio power and immersion. </p><p>Of course, though, the Q990H is a fantastic soundbar in its own right, and well-deserving of the flagship name. It’s just really, really expensive. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone Duo sold out? Here are the 6 best alternatives in stock now ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-duo-review">iPhone Duo</a> is proving <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-wait-times-latest-updates-and-how-to-beat-apples-january-delay">very difficult to come by</a>, and right now, on the official release day, Apple's own delivery estimates stretch into late January of next year. The Duo is, by our metrics, an excellent foldable phone, but it isn't the only option available to you right now. In fact, there are more of the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a> to choose from, none of which have the same availability issues Apple's option is experiencing.</p><p>Obviously these phones have one key difference, in that they run Android rather than Apple's iOS. That is enough to turn off a lot of people, especially if they've been Apple users for a long time. That said, if you're more open to being platform-agnostic, and desperately want to pick up a foldable phone without waiting, you have some options available to you.</p><p>Here are the best iPhone Duo alternatives you can buy today</p><h2 id="best-iphone-duo-alternatives">Best iPhone Duo alternatives</h2><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8"><span>Samsung Galaxy Z Fold 8</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2878px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SEkA5wnoLHBqHNAFZEUp8Z" name="Galaxy Z Fold 8 review-6" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/SEkA5wnoLHBqHNAFZEUp8Z-1920-80.jpg" mos="" align="middle" fullscreen="" width="2878" height="1619" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you're looking for another passport-shaped foldable — with a shorter design when closed and widescreen when open — then 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> is easily your best bet. The Z Fold 8 offers a 5.5-inch cover display and 7.6-inch foldable display, which is close in size to the Duo. </p><p>That larger screen packs Samsung's 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> which promises to improve durability and minimize the crease. There's also an anti-reflective coating to prevent glare and help you see what's on screen. The Fold 8 is thinner and lighter than the iPhone Duo, and it lets you three apps at once instead of just two.</p><p>Camera-wise you're looking at a pair of 50MP rear lenses, with main and ultrawide shooters. Like the Duo, <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">there's no telephoto lens</a> for zoomed in shots. Selfie cameras are 10MP each, and you'll find one in both screens — though there's no under-display camera in this one. It's also a lot thinner and lighter than the Duo, and features the performance power of the Snapdragon 8 Elite Gen 5 for Galaxy. </p><p>That's as good as you'll get on an Android phone. Oh, and you get some of the best AI features of any phone, with a price tag that's $100 less than the iPhone Duo.</p><div data-widget-type="review" data-model-name="Samsung Galaxy Z Fold 8"></div><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra"><span>Samsung Galaxy Z Fold 8 Ultra</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width: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>If you want a foldable that's a little larger than what the Duo has to offer, then <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review" target="_blank">Samsung's Z Fold 8 Ultra</a> is worth considering. It offers all the same features and benefits as the Z Fold 8, albeit without the newly-popular wide design. Instead there's a skinnier 6.5-inch cover display and a 8-inch foldable display on the inside.</p><p>The Z Fold 8 Ultra benefits from better camera hardware, including a 200MP main camera lens and a 10MP telephoto shooter with 3x optical zooming capabilities. On top of that you get a larger battery with 14 hours and 30 minutes of battery life (an hour longer than the iPhone Duo. </p><p>You also get a lightweight and thin frame, and everything Galaxy AI and Google Gemini have to offer. The downside is that Galaxy foldables don't offer stylus support or dust resistance, and the 8 Ultra is $100 more expensive than the iPhone Duo.</p><div data-widget-type="review" data-model-name="Samsung Galaxy Z Fold 8 Ultra"></div><h3 class="article-body__section" id="section-motorola-razr-fold"><span>Motorola Razr Fold</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:3896px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="se3bqMdBi7dSZFBpcvBaDj" name="Motorola Razr Fold Review" alt="Motorola Razr Fold Review." src="https://cdn.mos.cms.futurecdn.net/se3bqMdBi7dSZFBpcvBaDj-1920-80.jpg" mos="" align="middle" fullscreen="" width="3896" height="2192" 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>Here's another book-shaped foldable, coming in with the same $1,900 price tag as the iPhone Duo. The <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-fold-review">Motorola Razr Fold</a> puts an emphasis on premium hardware at that base price, with a 6,000 mAh battery (with over 14 hours of life), 80W charging, 512GB of storage and 16GB of RAM that works in conjunction with the Snapdragon 8 Elite Gen 5 chipset. </p><p>Screens are a little bigger, measuring 6.6-inches for the cover display and 8.1-inches for the foldable inner screen. You also get a trio of 50MP cameras, which are complemented by a 32MP inner selfie camera and a 20MP cover screen camera. Optional stylus support, a slightly thinner design than the iPhone Duo, and a bunch of Motorola's AI features round out the perks. </p><div data-widget-type="review" data-model-name="Motorola Razr Fold"></div><h3 class="article-body__section" id="section-google-pixel-11-pro-fold"><span>Google Pixel 11 Pro Fold</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:4387px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="Q4SHdg39j56f2vhg3S7qSb" name="Google Pixel 11 Pro Fold-15" alt="Google Pixel 11 Pro Fold" src="https://cdn.mos.cms.futurecdn.net/Q4SHdg39j56f2vhg3S7qSb-1920-80.jpg" mos="" align="middle" fullscreen="" width="4387" height="2468" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As a whole, the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-fold-review">Pixel 11 Pro Fold</a> is not that impressive compared to other foldables. Performance is weak; app scaling is a very real problem; and the battery life is not particularly impressive. But there are a lot of benefits to picking up a Google-made foldable instead of one of its rivals. Particularly the AI support, which is some of the best you'll find on any Android thanks to the fact Google is responsible for Pixel phones and Gemini AI.</p><p>The Pixel 11 Pro Fold also features the brightest screen of any foldable, with a 6.5-inch cover display and 8-inch main display, a 5x telephoto lens (with 30x Super Zoom), 16GB of RAM, 25W wireless charging, and the new <a href="https://www.tomsguide.com/phones/google-pixel-phones/i-wrote-and-edited-this-article-with-pixel-11s-rambler-dictation-feature-and-things-did-not-go-according-to-plan">Rambler dictation system</a>. </p><p>On top of that, Google has added a new "app bubbles" system that lets you dock different apps at the bottom of your screen — with the ability to summon them as an extra layer on top of an ordinary split-view mode. There's no stylus support, though.</p><div data-widget-type="review" data-model-name="Google Pixel 11 Pro Fold"></div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OR9PJW"></div>                            </div>                            <script src="https://kwizly.com/embed/OR9PJW.js" async></script><h2 id="other-foldable-options">Other foldable options</h2><p>The thing about foldable phones is that there are a lot more of them out there than you might realize. In fact, the foldable segment is particularly popular among Chinese brands and some of them actually go on sale outside of the country. Sadly, they can be much harder to find, especially if you live in the U.S. </p><p>That's less of an issue in places like the U.K., and any readers from across the Atlantic should be aware of a couple of extra options that are available to you. Plus, while these phones technically run on Android, the software looks very similar to <a href="https://www.tomsguide.com/phones/iphones/20-smart-ios-27-features-that-will-make-your-life-easier-and-how-to-use-them">iOS 27</a> — which means the shock of switching platforms won't be quite as severe.</p><h3 class="article-body__section" id="section-honor-magic-v6"><span>Honor Magic V6</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:4595px;"><p class="vanilla-image-block" style="padding-top:42.85%;"><img id="sG2fsV4Z2onmrx84YtCwuT" name="Honor Magic V6 hands-on_HERO" alt="Honor Magic V6 in tent position" src="https://cdn.mos.cms.futurecdn.net/sG2fsV4Z2onmrx84YtCwuT-1920-80.jpg" mos="" align="middle" fullscreen="" width="4595" height="1969" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/phones/android-phones/honor-magic-v6-hands-on-review">Honor Magic V6</a> is a foldable that aims to be as premium as possible, particularly in the camera department. This thing packs in 50MP main and ultrawide lenses, alongside a 64MP telephoto camera with 3x optical zoom and a pair of 20MP selfie cameras — one on each screen. </p><p>The software is very reminiscent of iOS, and it features a bunch of stuff that you'd normally only get from an iPhone. That includes the ability to use the V6 as a secondary Mac screen, the inclusion of an Apple-like interface for AirPods and even Apple Watch notification support. Which is astounding for an Android</p><p>As for the screens, you get a 7.95-inch foldable display with anti-reflective coating and a 6.52-inch cover display with anti-scratch coating. Both screens are rated for a respective 5,000 and 6,000 nits. You get stylus support on both displays, and they come wrapped in a shiny gold casing. Add in the swift Snapdragon 8 Elite Gen 5 and up to 16GB of RAM and you have a powerful phone that's ready for AI.</p><div data-widget-type="review" data-model-name="Honor Magic V6"></div><h3 class="article-body__section" id="section-oppo-find-n6"><span>Oppo Find N6 </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="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>Oppo's Find N series has been the gold standard for crease elimination for the past couple of generations, and the <a href="https://www.tomsguide.com/phones/android-phones/i-have-been-testing-oppo-find-n6-crease-free-foldable-phone">Oppo Find N6</a> is the bar at which the iPhone Duo's lack of crease will be judged by. The 8.12-inch foldable screen also features a "self-healing memory glass" which is said to keep that crease away for good. Both it and the 6.62-inch cover display offer stylus support, as well as Dolby Vision and HDR10+.</p><p>As for cameras, you're looking at a 200MP main lens, a 50MP ultrawide and a 50MP telephoto lens with 3x optical zoom. Selfie cameras are both 20MP, using a hole-punch design on each screen. Performance is handled by the Snapdragon 8 Elite Gen 5, in conjunction with either 12 or 16GB of RAM. Meanwhile, there's a monster 6,000 mAh battery inside, complete with 80W wired charging speeds.,</p><div data-widget-type="review" data-model-name="Oppo Find N6"></div><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/i-put-the-iphone-duo-vs-galaxy-fold-8-through-a-10-round-photo-face-off-heres-the-winner">I put the iPhone Duo vs. Galaxy Fold 8 through a 10-round photo face-off — here’s the winner</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-duo-full-benchmarks-the-worlds-fastest-foldable-but-how-does-it-stack-up-to-iphone-18-pro">iPhone Duo full benchmarks — the world's fastest foldable, but how does it stack up to iPhone 18 Pro?</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ive-been-testing-dozens-of-iphone-duo-apps-heres-my-top-15-picks-so-far">I’ve been testing dozens of iPhone Duo apps — here’s my top 15 picks so far</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/iphone-duo-is-impossible-to-buy-right-now-but-these-6-alternatives-are-available-right-now</link>
                                                                            <description>
                            <![CDATA[ iPhone Duo is hard to come by right now, but these six foldables phones are in stock right now — here are the options. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ZKYXDf7m4XFZJRskju7gzM</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4RtoBDsrwS8sGu7dtM78Xh-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 23 Oct 2026 04:01:00 +0000</pubDate>                                                                                                                                <updated>Fri, 23 Oct 2026 08:27:52 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-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/4RtoBDsrwS8sGu7dtM78Xh-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/4RtoBDsrwS8sGu7dtM78Xh-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-duo-review">iPhone Duo</a> is proving <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-wait-times-latest-updates-and-how-to-beat-apples-january-delay">very difficult to come by</a>, and right now, on the official release day, Apple's own delivery estimates stretch into late January of next year. The Duo is, by our metrics, an excellent foldable phone, but it isn't the only option available to you right now. In fact, there are more of the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a> to choose from, none of which have the same availability issues Apple's option is experiencing.</p><p>Obviously these phones have one key difference, in that they run Android rather than Apple's iOS. That is enough to turn off a lot of people, especially if they've been Apple users for a long time. That said, if you're more open to being platform-agnostic, and desperately want to pick up a foldable phone without waiting, you have some options available to you.</p><p>Here are the best iPhone Duo alternatives you can buy today</p><h2 id="best-iphone-duo-alternatives">Best iPhone Duo alternatives</h2><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8"><span>Samsung Galaxy Z Fold 8</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2878px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SEkA5wnoLHBqHNAFZEUp8Z" name="Galaxy Z Fold 8 review-6" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/SEkA5wnoLHBqHNAFZEUp8Z-1920-80.jpg" mos="" align="middle" fullscreen="" width="2878" height="1619" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you're looking for another passport-shaped foldable — with a shorter design when closed and widescreen when open — then 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> is easily your best bet. The Z Fold 8 offers a 5.5-inch cover display and 7.6-inch foldable display, which is close in size to the Duo. </p><p>That larger screen packs Samsung's 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> which promises to improve durability and minimize the crease. There's also an anti-reflective coating to prevent glare and help you see what's on screen. The Fold 8 is thinner and lighter than the iPhone Duo, and it lets you three apps at once instead of just two.</p><p>Camera-wise you're looking at a pair of 50MP rear lenses, with main and ultrawide shooters. Like the Duo, <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">there's no telephoto lens</a> for zoomed in shots. Selfie cameras are 10MP each, and you'll find one in both screens — though there's no under-display camera in this one. It's also a lot thinner and lighter than the Duo, and features the performance power of the Snapdragon 8 Elite Gen 5 for Galaxy. </p><p>That's as good as you'll get on an Android phone. Oh, and you get some of the best AI features of any phone, with a price tag that's $100 less than the iPhone Duo.</p><div data-widget-type="review" data-model-name="Samsung Galaxy Z Fold 8"></div><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra"><span>Samsung Galaxy Z Fold 8 Ultra</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width: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>If you want a foldable that's a little larger than what the Duo has to offer, then <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review" target="_blank">Samsung's Z Fold 8 Ultra</a> is worth considering. It offers all the same features and benefits as the Z Fold 8, albeit without the newly-popular wide design. Instead there's a skinnier 6.5-inch cover display and a 8-inch foldable display on the inside.</p><p>The Z Fold 8 Ultra benefits from better camera hardware, including a 200MP main camera lens and a 10MP telephoto shooter with 3x optical zooming capabilities. On top of that you get a larger battery with 14 hours and 30 minutes of battery life (an hour longer than the iPhone Duo. </p><p>You also get a lightweight and thin frame, and everything Galaxy AI and Google Gemini have to offer. The downside is that Galaxy foldables don't offer stylus support or dust resistance, and the 8 Ultra is $100 more expensive than the iPhone Duo.</p><div data-widget-type="review" data-model-name="Samsung Galaxy Z Fold 8 Ultra"></div><h3 class="article-body__section" id="section-motorola-razr-fold"><span>Motorola Razr Fold</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:3896px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="se3bqMdBi7dSZFBpcvBaDj" name="Motorola Razr Fold Review" alt="Motorola Razr Fold Review." src="https://cdn.mos.cms.futurecdn.net/se3bqMdBi7dSZFBpcvBaDj-1920-80.jpg" mos="" align="middle" fullscreen="" width="3896" height="2192" 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>Here's another book-shaped foldable, coming in with the same $1,900 price tag as the iPhone Duo. The <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-fold-review">Motorola Razr Fold</a> puts an emphasis on premium hardware at that base price, with a 6,000 mAh battery (with over 14 hours of life), 80W charging, 512GB of storage and 16GB of RAM that works in conjunction with the Snapdragon 8 Elite Gen 5 chipset. </p><p>Screens are a little bigger, measuring 6.6-inches for the cover display and 8.1-inches for the foldable inner screen. You also get a trio of 50MP cameras, which are complemented by a 32MP inner selfie camera and a 20MP cover screen camera. Optional stylus support, a slightly thinner design than the iPhone Duo, and a bunch of Motorola's AI features round out the perks. </p><div data-widget-type="review" data-model-name="Motorola Razr Fold"></div><h3 class="article-body__section" id="section-google-pixel-11-pro-fold"><span>Google Pixel 11 Pro Fold</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:4387px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="Q4SHdg39j56f2vhg3S7qSb" name="Google Pixel 11 Pro Fold-15" alt="Google Pixel 11 Pro Fold" src="https://cdn.mos.cms.futurecdn.net/Q4SHdg39j56f2vhg3S7qSb-1920-80.jpg" mos="" align="middle" fullscreen="" width="4387" height="2468" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As a whole, the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-fold-review">Pixel 11 Pro Fold</a> is not that impressive compared to other foldables. Performance is weak; app scaling is a very real problem; and the battery life is not particularly impressive. But there are a lot of benefits to picking up a Google-made foldable instead of one of its rivals. Particularly the AI support, which is some of the best you'll find on any Android thanks to the fact Google is responsible for Pixel phones and Gemini AI.</p><p>The Pixel 11 Pro Fold also features the brightest screen of any foldable, with a 6.5-inch cover display and 8-inch main display, a 5x telephoto lens (with 30x Super Zoom), 16GB of RAM, 25W wireless charging, and the new <a href="https://www.tomsguide.com/phones/google-pixel-phones/i-wrote-and-edited-this-article-with-pixel-11s-rambler-dictation-feature-and-things-did-not-go-according-to-plan">Rambler dictation system</a>. </p><p>On top of that, Google has added a new "app bubbles" system that lets you dock different apps at the bottom of your screen — with the ability to summon them as an extra layer on top of an ordinary split-view mode. There's no stylus support, though.</p><div data-widget-type="review" data-model-name="Google Pixel 11 Pro Fold"></div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OR9PJW"></div>                            </div>                            <script src="https://kwizly.com/embed/OR9PJW.js" async></script><h2 id="other-foldable-options">Other foldable options</h2><p>The thing about foldable phones is that there are a lot more of them out there than you might realize. In fact, the foldable segment is particularly popular among Chinese brands and some of them actually go on sale outside of the country. Sadly, they can be much harder to find, especially if you live in the U.S. </p><p>That's less of an issue in places like the U.K., and any readers from across the Atlantic should be aware of a couple of extra options that are available to you. Plus, while these phones technically run on Android, the software looks very similar to <a href="https://www.tomsguide.com/phones/iphones/20-smart-ios-27-features-that-will-make-your-life-easier-and-how-to-use-them">iOS 27</a> — which means the shock of switching platforms won't be quite as severe.</p><h3 class="article-body__section" id="section-honor-magic-v6"><span>Honor Magic V6</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:4595px;"><p class="vanilla-image-block" style="padding-top:42.85%;"><img id="sG2fsV4Z2onmrx84YtCwuT" name="Honor Magic V6 hands-on_HERO" alt="Honor Magic V6 in tent position" src="https://cdn.mos.cms.futurecdn.net/sG2fsV4Z2onmrx84YtCwuT-1920-80.jpg" mos="" align="middle" fullscreen="" width="4595" height="1969" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/phones/android-phones/honor-magic-v6-hands-on-review">Honor Magic V6</a> is a foldable that aims to be as premium as possible, particularly in the camera department. This thing packs in 50MP main and ultrawide lenses, alongside a 64MP telephoto camera with 3x optical zoom and a pair of 20MP selfie cameras — one on each screen. </p><p>The software is very reminiscent of iOS, and it features a bunch of stuff that you'd normally only get from an iPhone. That includes the ability to use the V6 as a secondary Mac screen, the inclusion of an Apple-like interface for AirPods and even Apple Watch notification support. Which is astounding for an Android</p><p>As for the screens, you get a 7.95-inch foldable display with anti-reflective coating and a 6.52-inch cover display with anti-scratch coating. Both screens are rated for a respective 5,000 and 6,000 nits. You get stylus support on both displays, and they come wrapped in a shiny gold casing. Add in the swift Snapdragon 8 Elite Gen 5 and up to 16GB of RAM and you have a powerful phone that's ready for AI.</p><div data-widget-type="review" data-model-name="Honor Magic V6"></div><h3 class="article-body__section" id="section-oppo-find-n6"><span>Oppo Find N6 </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="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>Oppo's Find N series has been the gold standard for crease elimination for the past couple of generations, and the <a href="https://www.tomsguide.com/phones/android-phones/i-have-been-testing-oppo-find-n6-crease-free-foldable-phone">Oppo Find N6</a> is the bar at which the iPhone Duo's lack of crease will be judged by. The 8.12-inch foldable screen also features a "self-healing memory glass" which is said to keep that crease away for good. Both it and the 6.62-inch cover display offer stylus support, as well as Dolby Vision and HDR10+.</p><p>As for cameras, you're looking at a 200MP main lens, a 50MP ultrawide and a 50MP telephoto lens with 3x optical zoom. Selfie cameras are both 20MP, using a hole-punch design on each screen. Performance is handled by the Snapdragon 8 Elite Gen 5, in conjunction with either 12 or 16GB of RAM. Meanwhile, there's a monster 6,000 mAh battery inside, complete with 80W wired charging speeds.,</p><div data-widget-type="review" data-model-name="Oppo Find N6"></div><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/i-put-the-iphone-duo-vs-galaxy-fold-8-through-a-10-round-photo-face-off-heres-the-winner">I put the iPhone Duo vs. Galaxy Fold 8 through a 10-round photo face-off — here’s the winner</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-duo-full-benchmarks-the-worlds-fastest-foldable-but-how-does-it-stack-up-to-iphone-18-pro">iPhone Duo full benchmarks — the world's fastest foldable, but how does it stack up to iPhone 18 Pro?</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ive-been-testing-dozens-of-iphone-duo-apps-heres-my-top-15-picks-so-far">I’ve been testing dozens of iPhone Duo apps — here’s my top 15 picks so far</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Forget iPhone Duo, Samsung could release six different foldable phones next year — including the mysterious 'Galaxy Z Slide' ]]></title>
                                                                                                <dc:content><![CDATA[ <p>2026 has been a big year for foldable phones, especially with the launch 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. But it sounds like Samsung isn't going to let Apple take the glory. After a successful launch of the passport-shaped <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a>, it's been claimed that Samsung could launch six foldables devices next year — including a new "Galaxy Z Slide."</p><p>This rumor comes from <a href="https://x.com/TheGalox_/status/2110224762198687930" target="_blank">TheGalox on X,</a> who claims that Samsung is prepping its biggest foldable lineup ever." Apparently the 2027 lineup will start with the launch of the Galaxy Z TriFold 2, and will be followed by a Galaxy Z Slide, Z Fold 9 Ultra, Z Fold 9 Pro, Z Fold 9 and the Z Flip 9. </p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2110224762198687930"><p lang="en" dir="ltr">Galaxy Z SlideGalaxy Z TriFold2Galaxy Z Fold9 UltraGalaxy Z Fold9 ProGalaxy Z Fold9Galaxy Z Flip9The 2027 Galaxy Z lineup will be the biggest foldable lineup ever, with battery, thickness & weight improvements across the board.Z TriFold2 will kick things off https://t.co/VM1N3IIIkT<a href="https://twitter.com/cantworkitout/status/2110224762198687930">October 14, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>That certainly is an interesting lineup of new phones. The two things that stand out most are the inclusion of the Z Fold 9 Pro and the Z Flip 9 — the latter of which is <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-tipster-says-galaxy-z-flip-9-could-be-cancelled-heres-why-thats-a-terrible-idea">rumored to have been canceled</a>. Likewise the "Pro" is not something we've heard of yet, and I'm curious to hear what kind of niche it might fill in the Z Fold 9 lineup. </p><p>There isn't a whole lot of difference between the Z Fold 8 and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Z Fold 8 Ultra</a>, after all, and the last thing Samsung needs is to confuse people with multiple foldables that are too similar to one another.</p><p>The Z Slide is another mystery, and this is the first we've actually heard about such a device. If I were to guess, this is some kind of extendable phone with an extending screen, similar to various concept devices Samsung (and others) have produced over the years.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Od2QAe"></div>                            </div>                            <script src="https://kwizly.com/embed/Od2QAe.js" async></script><h2 id="what-we-think-is-coming">What we think is coming</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GoHwVgvWMokxkhACFLnnAE" name="Samsung Display Slidable Flex Duet" alt="Samsung Display Slidable Flex Duet" src="https://cdn.mos.cms.futurecdn.net/GoHwVgvWMokxkhACFLnnAE-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 last time we saw one <a href="https://www.tomsguide.com/phones/samsung-phones/forget-galaxy-s25-i-just-saw-samsung-displays-wild-new-slidables-and-foldables-and-this-is-my-favorite">was back at CES 2025</a>, with a number of different "slidable" phones. There was the Slidable Flex Duet, which extended  its screen from 8.1-inches to a massive 12.4-inches, as well as the Slidable Flex Solo which grew from 8-inches to a mammoth 17-inches. Then there was the Flex Vertical, which grew vertically from 5.1-inches to 6.7-inches.</p><p>The question is whether or not these designs will be utilized for the Galaxy Z Slide, and if so which one will actually go on sale. My first guess would be some kind of smartphone-sized device, similar to the Flex Vertical, though that all depends on whether Samsung could make those smaller extendable displays at scale. </p><p>It's quite possible that a larger screen is easier (and therefore cheaper) to mass produce, which would see one of the tablet-inspired designs arrive first. @TheGalox has not elaborated on what's to come, and that means all we can do at this stage is guess. </p><p>As for the TriFold 2, it's no huge surprise that a sequel triple-foldable is coming. We've <a href="https://www.cnet.com/tech/mobile/samsung-is-fast-tracking-galaxy-z-trifold-2-after-iphone-duo-reveal-according-to-leaks/">heard rumors about that already,</a> but it's unclear how easy it will be to get hold of. The original TriFold was only available in limited quantities, and Samsung completely <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-kills-the-galaxy-z-trifold-after-just-three-months-and-im-hardly-surprised-heres-why">canceled production back in March.</a> Here's hoping the sequel is a little easier to purchase. </p><p>It's still very early days for Samsung's 2027 foldables, and until we hear more there's no telling how accurate any of this information might actually be. So we're just going to have to wait and see what the rumor mill produces in the coming months.</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/my-iphone-18-pro-max-just-got-delivered-and-i-immediately-regret-the-purchase-and-i-think-iphone-duo-is-to-blame">My iPhone 18 Pro Max just got delivered and I immediately regret the purchase — and I think iPhone Duo is to blame</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-duos-battery-is-officially-bigger-than-galaxy-z-fold-8-heres-how-it-compares-to-other-foldables">iPhone Duo's battery is officially bigger than Galaxy Z Fold 8 — here's how it compares to other foldables</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-duo-modes-explained-6-ways-you-can-use-apples-new-foldable">iPhone Duo modes explained — 6 ways you can use Apple's new foldable</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/forget-iphone-duo-samsung-could-release-six-different-foldable-phones-next-year-including-the-mysterious-galaxy-z-slide</link>
                                                                            <description>
                            <![CDATA[ 2027 could see Samsung nearly double the size of its foldable line-up, and that makes Apple's solo foldable feel a little lonely. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">dDHeu2UNdmjfnepTdsshFA</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/YqjnZw2B5sUj3Cvpn3g9nX-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 20 Oct 2026 11:05:05 +0000</pubDate>                                                                                                                                <updated>Tue, 20 Oct 2026 23:01:08 +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/YqjnZw2B5sUj3Cvpn3g9nX-1920-80.jpg">
                                                            <media:credit><![CDATA[Samsung]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Display Flex Duet slidable display concept]]></media:description>                                                            <media:text><![CDATA[Samsung Display Flex Duet slidable display concept]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Display Flex Duet slidable display concept]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/YqjnZw2B5sUj3Cvpn3g9nX-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>2026 has been a big year for foldable phones, especially with the launch 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. But it sounds like Samsung isn't going to let Apple take the glory. After a successful launch of the passport-shaped <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a>, it's been claimed that Samsung could launch six foldables devices next year — including a new "Galaxy Z Slide."</p><p>This rumor comes from <a href="https://x.com/TheGalox_/status/2110224762198687930" target="_blank">TheGalox on X,</a> who claims that Samsung is prepping its biggest foldable lineup ever." Apparently the 2027 lineup will start with the launch of the Galaxy Z TriFold 2, and will be followed by a Galaxy Z Slide, Z Fold 9 Ultra, Z Fold 9 Pro, Z Fold 9 and the Z Flip 9. </p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2110224762198687930"><p lang="en" dir="ltr">Galaxy Z SlideGalaxy Z TriFold2Galaxy Z Fold9 UltraGalaxy Z Fold9 ProGalaxy Z Fold9Galaxy Z Flip9The 2027 Galaxy Z lineup will be the biggest foldable lineup ever, with battery, thickness & weight improvements across the board.Z TriFold2 will kick things off https://t.co/VM1N3IIIkT<a href="https://twitter.com/cantworkitout/status/2110224762198687930">October 14, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>That certainly is an interesting lineup of new phones. The two things that stand out most are the inclusion of the Z Fold 9 Pro and the Z Flip 9 — the latter of which is <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-tipster-says-galaxy-z-flip-9-could-be-cancelled-heres-why-thats-a-terrible-idea">rumored to have been canceled</a>. Likewise the "Pro" is not something we've heard of yet, and I'm curious to hear what kind of niche it might fill in the Z Fold 9 lineup. </p><p>There isn't a whole lot of difference between the Z Fold 8 and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Z Fold 8 Ultra</a>, after all, and the last thing Samsung needs is to confuse people with multiple foldables that are too similar to one another.</p><p>The Z Slide is another mystery, and this is the first we've actually heard about such a device. If I were to guess, this is some kind of extendable phone with an extending screen, similar to various concept devices Samsung (and others) have produced over the years.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Od2QAe"></div>                            </div>                            <script src="https://kwizly.com/embed/Od2QAe.js" async></script><h2 id="what-we-think-is-coming">What we think is coming</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GoHwVgvWMokxkhACFLnnAE" name="Samsung Display Slidable Flex Duet" alt="Samsung Display Slidable Flex Duet" src="https://cdn.mos.cms.futurecdn.net/GoHwVgvWMokxkhACFLnnAE-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 last time we saw one <a href="https://www.tomsguide.com/phones/samsung-phones/forget-galaxy-s25-i-just-saw-samsung-displays-wild-new-slidables-and-foldables-and-this-is-my-favorite">was back at CES 2025</a>, with a number of different "slidable" phones. There was the Slidable Flex Duet, which extended  its screen from 8.1-inches to a massive 12.4-inches, as well as the Slidable Flex Solo which grew from 8-inches to a mammoth 17-inches. Then there was the Flex Vertical, which grew vertically from 5.1-inches to 6.7-inches.</p><p>The question is whether or not these designs will be utilized for the Galaxy Z Slide, and if so which one will actually go on sale. My first guess would be some kind of smartphone-sized device, similar to the Flex Vertical, though that all depends on whether Samsung could make those smaller extendable displays at scale. </p><p>It's quite possible that a larger screen is easier (and therefore cheaper) to mass produce, which would see one of the tablet-inspired designs arrive first. @TheGalox has not elaborated on what's to come, and that means all we can do at this stage is guess. </p><p>As for the TriFold 2, it's no huge surprise that a sequel triple-foldable is coming. We've <a href="https://www.cnet.com/tech/mobile/samsung-is-fast-tracking-galaxy-z-trifold-2-after-iphone-duo-reveal-according-to-leaks/">heard rumors about that already,</a> but it's unclear how easy it will be to get hold of. The original TriFold was only available in limited quantities, and Samsung completely <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-kills-the-galaxy-z-trifold-after-just-three-months-and-im-hardly-surprised-heres-why">canceled production back in March.</a> Here's hoping the sequel is a little easier to purchase. </p><p>It's still very early days for Samsung's 2027 foldables, and until we hear more there's no telling how accurate any of this information might actually be. So we're just going to have to wait and see what the rumor mill produces in the coming months.</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/my-iphone-18-pro-max-just-got-delivered-and-i-immediately-regret-the-purchase-and-i-think-iphone-duo-is-to-blame">My iPhone 18 Pro Max just got delivered and I immediately regret the purchase — and I think iPhone Duo is to blame</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-duos-battery-is-officially-bigger-than-galaxy-z-fold-8-heres-how-it-compares-to-other-foldables">iPhone Duo's battery is officially bigger than Galaxy Z Fold 8 — here's how it compares to other foldables</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-duo-modes-explained-6-ways-you-can-use-apples-new-foldable">iPhone Duo modes explained — 6 ways you can use Apple's new foldable</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Best Buy just slashed up to $600 off LG and Samsung gaming monitors — here are 9 deals I'd buy right now ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If you're an avid gamer then you will know the value of a good monitor. A great screen doesn't just give you better visuals, it can drastically improve your entire gaming experience and performance thanks to reduced input lag and high refresh rates. </p><p>In this article I've picked out nine of the best deals on gaming monitors currently available from online giant Best Buy. There's a range of manufacturers here, including ASUS, Samsung and LG. </p><p>I've picked out some smaller, entry level screens that come in at just over $100. Then we move to several great mid-priced displays that are packed with features. Finally, we've got a selection of wide screens that typically cost more than $2000, now with some huge savings. Check them out and see how you can upgrade your gaming setup today. </p>        <div class="featured_product_block featured_block_hero" data-id="e9b4d678-c7d4-11f1-ad2f-19b553217c55">            <a href="https://www.bestbuy.com/product/samsung-27-odyssey-g4-g40h-fast-ips-fhd-300hz-1ms-amd-freesync-prem-gaming-monitor-with-hdr-10-displayport-hdmi-black/JJGRF3QVV2" data-model-name="Samsung 27-inch Odyssey G4 Fast IPS Gaming Monitor" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:81.95%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/pm37niFB5EQU4kR6pqeeWW.jpg" alt="Samsung - 27" Odyssey G4 (g40h) Fast Ips Fhd 300hz 1ms Amd Freesync Prem Gaming Monitor With Hdr 10 (displayport, Hdmi) - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Samsung 27-inch Odyssey G4 Fast IPS Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4d5ba-c7d4-11f1-9cf9-0b5fe3cfe417">            <a href="https://www.bestbuy.com/product/samsung-odyssey-g30d-24-led-fhd-amd-freesync-premium-180hz-1ms-gaming-monitor-displayport-hdmi-black/J3ZYG2T9FJ" data-model-name="Samsung Odyssey 24-inch LED Freesync Gaming Monitor" 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/igNfMRLZcqqQc25y6meGyZ.jpg" alt="Samsung - Odyssey G30d 24" Led Fhd Amd Freesync Premium 180hz 1ms Gaming Monitor (displayport, Hdmi) - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Samsung Odyssey 24-inch LED Freesync Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4d740-c7d4-11f1-9e51-4b46fa561ded">            <a href="https://www.bestbuy.com/product/aoc-c27g4hx-27-va-panel-curved-gaming-monitor-led-fhd-1920x1080-200hz-0-5ms-freesync-black/JX9GSKPHLR" data-model-name="AOC Gaming 27-inch Curved Gaming Monitor" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:81.30%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/uBAVsgYcbBZrDTnDwhDmHW.jpg" alt="Aoc - C27g4hx 27" Va Panel Curved Gaming Monitor, Led, Fhd (1920x1080), 200hz, 0.5ms, Freesync - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">AOC Gaming 27-inch Curved Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4d808-c7d4-11f1-bc78-0906b1073fcf">            <a href="https://www.bestbuy.com/product/asus-tuf-gaming-32-fhd-va-250hz-0-5ms-curved-gaming-monitor-with-freesync-premium-and-hdr-displayport-hdmi-black/JJGGLH8GWS" data-model-name="ASUS Series 5 Tuf Gaming 320-inch Curved Gaming Monitor" 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/GSLDFYKwBBWtBgdRVqZa4i.jpg" alt="ASUS, Asus - Tuf Gaming 32" Fhd Va 250hz 0.5ms Curved Gaming Monitor With Freesync Premium and Hdr (displayport, Hdmi) - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">ASUS Series 5 Tuf Gaming 320-inch Curved Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4d8c6-c7d4-11f1-a98b-5f93840abebf">            <a href="https://www.bestbuy.com/product/asus-rog-strix-27-2k-oled-280hz-0-03ms-gaming-monitor-with-g-sync-freesync-premium-pro-and-hdr-displayport-hdmi-black/JJGGLH7K2P" data-model-name="ASUS Rog Strix 27-inch 2K OLED Gaming Monitor" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:83.73%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/n6cAZaz29ZoR9Gs6phxVpW.jpg" alt="Asus - Rog Strix 27" 2k Oled 280hz 0.03ms Gaming Monitor With G-Sync/freesync Premium Pro and Hdr (displayport, Hdmi) - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">ASUS Rog Strix 27-inch 2K OLED Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4d98e-c7d4-11f1-8fb2-91cabf312ee3">            <a href="https://www.bestbuy.com/product/samsung-27-odyssey-oled-g6-g60sf-qhd-500hz-0-03ms-gsync-compatible-and-freesync-prem-pro-gaming-monitor-with-hdr-500-silver/JJGRF33H72" data-model-name="Samsung 27-inch Odyssey OLED G6 Gaming Monitor" 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/mRAbcA4zz4SWuDk8kkgnjP.jpg" alt="Samsung - 27" Odyssey Oled G6 (g60sf) Qhd 500hz 0.03ms Gsync Compatible and Freesync Prem Pro Gaming Monitor With Hdr 500 - Silver"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Samsung 27-inch Odyssey OLED G6 Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4da42-c7d4-11f1-9b2f-71b323a45ecc">            <a href="https://www.bestbuy.com/product/lg-ultragear-evo-ai-gm9-27-5k-hyper-mini-led-165hz-1ms-g-sync-freesync-premium-gaming-monitor-with-displayhdr1000-black/JJ8VPZZSYJ" data-model-name="LG UltraGear evo AI 27-inch 5K Mini LED Gaming Monitor" 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/CLLHuiMRHoZKR3VTbrMPhX.jpg" alt="Lg - Ultragear Evo Ai Gm9 27" 5k Hyper Mini Led 165hz 1ms G-Sync Freesync Premium Gaming Monitor With Displayhdr1000 - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">LG UltraGear evo AI 27-inch 5K Mini LED Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4db00-c7d4-11f1-be27-cf0c7aa2d4d0">            <a href="https://www.bestbuy.com/product/samsung-49-odyssey-oled-g9-g93sd-dual-qhd-240hz-0-03ms-g-sync-compatible-curved-glare-free-gaming-monitor-silver/J3ZYG2Z8Y3" data-model-name="Samsung 49-inch Odyssey OLED G9 Glare Free Gaming Monitor" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:50.13%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/RQjf7t9YqnZPEhqE97EvyX.jpg" alt="Samsung - 49" Odyssey Oled G9 (g93sd) Dual-Qhd 240hz 0.03ms G-Sync Compatible Curved Glare Free Gaming Monitor - Silver"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Samsung 49-inch Odyssey OLED G9 Glare Free Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4dbc8-c7d4-11f1-aca3-bd5d766515ee">            <a href="https://www.bestbuy.com/product/samsung-57-odyssey-neo-g9-dual-4k-uhd-quantum-mini-led-240hz-1ms-hdr-1000-curved-gaming-monitor-hdmi-2-1-dp-2-1-usb-3-0-black/J3ZYG29PK6" data-model-name="Samsung 57-inch Odyssey Neo G9 Mini-LED Curved Monitor" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:44.30%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/juErrw8U55pggbCEYSyXpa.jpg" alt="Samsung - 57" Odyssey Neo G9 Dual 4k Uhd Quantum Mini-Led 240hz 1ms Hdr 1000 Curved Gaming Monitor (hdmi 2.1, Dp 2.1, Usb 3.0) - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Samsung 57-inch Odyssey Neo G9 Mini-LED Curved Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/monitors/best-buy-just-slashed-up-to-usd600-off-lg-and-samsung-gaming-monitors-here-are-9-deals-id-buy-right-now</link>
                                                                            <description>
                            <![CDATA[ Best Buy is slashing prices on gaming monitors right now! I've rounded up nine of the best deals on screens from LG, Samsung, ASUS and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">rorZgSSJW4QxHqZrCUwGbj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/YLk7ZSu6UGKCmAJVMQEwGg-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 14 Oct 2026 15:02:26 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Monitors]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Computing Hardware]]></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/YLk7ZSu6UGKCmAJVMQEwGg-1920-80.jpg">
                                                            <media:credit><![CDATA[Samsung, LG, ASUS / Edited with Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A selection of gaming monitors.]]></media:description>                                                            <media:text><![CDATA[A selection of gaming monitors.]]></media:text>
                                <media:title type="plain"><![CDATA[A selection of gaming monitors.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/YLk7ZSu6UGKCmAJVMQEwGg-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you're an avid gamer then you will know the value of a good monitor. A great screen doesn't just give you better visuals, it can drastically improve your entire gaming experience and performance thanks to reduced input lag and high refresh rates. </p><p>In this article I've picked out nine of the best deals on gaming monitors currently available from online giant Best Buy. There's a range of manufacturers here, including ASUS, Samsung and LG. </p><p>I've picked out some smaller, entry level screens that come in at just over $100. Then we move to several great mid-priced displays that are packed with features. Finally, we've got a selection of wide screens that typically cost more than $2000, now with some huge savings. Check them out and see how you can upgrade your gaming setup today. </p>        <div class="featured_product_block featured_block_hero" data-id="e9b4d678-c7d4-11f1-ad2f-19b553217c55">            <a href="https://www.bestbuy.com/product/samsung-27-odyssey-g4-g40h-fast-ips-fhd-300hz-1ms-amd-freesync-prem-gaming-monitor-with-hdr-10-displayport-hdmi-black/JJGRF3QVV2" data-model-name="Samsung 27-inch Odyssey G4 Fast IPS Gaming Monitor" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:81.95%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/pm37niFB5EQU4kR6pqeeWW.jpg" alt="Samsung - 27" Odyssey G4 (g40h) Fast Ips Fhd 300hz 1ms Amd Freesync Prem Gaming Monitor With Hdr 10 (displayport, Hdmi) - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Samsung 27-inch Odyssey G4 Fast IPS Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4d5ba-c7d4-11f1-9cf9-0b5fe3cfe417">            <a href="https://www.bestbuy.com/product/samsung-odyssey-g30d-24-led-fhd-amd-freesync-premium-180hz-1ms-gaming-monitor-displayport-hdmi-black/J3ZYG2T9FJ" data-model-name="Samsung Odyssey 24-inch LED Freesync Gaming Monitor" 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/igNfMRLZcqqQc25y6meGyZ.jpg" alt="Samsung - Odyssey G30d 24" Led Fhd Amd Freesync Premium 180hz 1ms Gaming Monitor (displayport, Hdmi) - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Samsung Odyssey 24-inch LED Freesync Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4d740-c7d4-11f1-9e51-4b46fa561ded">            <a href="https://www.bestbuy.com/product/aoc-c27g4hx-27-va-panel-curved-gaming-monitor-led-fhd-1920x1080-200hz-0-5ms-freesync-black/JX9GSKPHLR" data-model-name="AOC Gaming 27-inch Curved Gaming Monitor" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:81.30%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/uBAVsgYcbBZrDTnDwhDmHW.jpg" alt="Aoc - C27g4hx 27" Va Panel Curved Gaming Monitor, Led, Fhd (1920x1080), 200hz, 0.5ms, Freesync - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">AOC Gaming 27-inch Curved Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4d808-c7d4-11f1-bc78-0906b1073fcf">            <a href="https://www.bestbuy.com/product/asus-tuf-gaming-32-fhd-va-250hz-0-5ms-curved-gaming-monitor-with-freesync-premium-and-hdr-displayport-hdmi-black/JJGGLH8GWS" data-model-name="ASUS Series 5 Tuf Gaming 320-inch Curved Gaming Monitor" 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/GSLDFYKwBBWtBgdRVqZa4i.jpg" alt="ASUS, Asus - Tuf Gaming 32" Fhd Va 250hz 0.5ms Curved Gaming Monitor With Freesync Premium and Hdr (displayport, Hdmi) - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">ASUS Series 5 Tuf Gaming 320-inch Curved Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4d8c6-c7d4-11f1-a98b-5f93840abebf">            <a href="https://www.bestbuy.com/product/asus-rog-strix-27-2k-oled-280hz-0-03ms-gaming-monitor-with-g-sync-freesync-premium-pro-and-hdr-displayport-hdmi-black/JJGGLH7K2P" data-model-name="ASUS Rog Strix 27-inch 2K OLED Gaming Monitor" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:83.73%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/n6cAZaz29ZoR9Gs6phxVpW.jpg" alt="Asus - Rog Strix 27" 2k Oled 280hz 0.03ms Gaming Monitor With G-Sync/freesync Premium Pro and Hdr (displayport, Hdmi) - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">ASUS Rog Strix 27-inch 2K OLED Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4d98e-c7d4-11f1-8fb2-91cabf312ee3">            <a href="https://www.bestbuy.com/product/samsung-27-odyssey-oled-g6-g60sf-qhd-500hz-0-03ms-gsync-compatible-and-freesync-prem-pro-gaming-monitor-with-hdr-500-silver/JJGRF33H72" data-model-name="Samsung 27-inch Odyssey OLED G6 Gaming Monitor" 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/mRAbcA4zz4SWuDk8kkgnjP.jpg" alt="Samsung - 27" Odyssey Oled G6 (g60sf) Qhd 500hz 0.03ms Gsync Compatible and Freesync Prem Pro Gaming Monitor With Hdr 500 - Silver"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Samsung 27-inch Odyssey OLED G6 Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4da42-c7d4-11f1-9b2f-71b323a45ecc">            <a href="https://www.bestbuy.com/product/lg-ultragear-evo-ai-gm9-27-5k-hyper-mini-led-165hz-1ms-g-sync-freesync-premium-gaming-monitor-with-displayhdr1000-black/JJ8VPZZSYJ" data-model-name="LG UltraGear evo AI 27-inch 5K Mini LED Gaming Monitor" 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/CLLHuiMRHoZKR3VTbrMPhX.jpg" alt="Lg - Ultragear Evo Ai Gm9 27" 5k Hyper Mini Led 165hz 1ms G-Sync Freesync Premium Gaming Monitor With Displayhdr1000 - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">LG UltraGear evo AI 27-inch 5K Mini LED Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4db00-c7d4-11f1-be27-cf0c7aa2d4d0">            <a href="https://www.bestbuy.com/product/samsung-49-odyssey-oled-g9-g93sd-dual-qhd-240hz-0-03ms-g-sync-compatible-curved-glare-free-gaming-monitor-silver/J3ZYG2Z8Y3" data-model-name="Samsung 49-inch Odyssey OLED G9 Glare Free Gaming Monitor" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:50.13%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/RQjf7t9YqnZPEhqE97EvyX.jpg" alt="Samsung - 49" Odyssey Oled G9 (g93sd) Dual-Qhd 240hz 0.03ms G-Sync Compatible Curved Glare Free Gaming Monitor - Silver"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Samsung 49-inch Odyssey OLED G9 Glare Free Gaming Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b4dbc8-c7d4-11f1-aca3-bd5d766515ee">            <a href="https://www.bestbuy.com/product/samsung-57-odyssey-neo-g9-dual-4k-uhd-quantum-mini-led-240hz-1ms-hdr-1000-curved-gaming-monitor-hdmi-2-1-dp-2-1-usb-3-0-black/J3ZYG29PK6" data-model-name="Samsung 57-inch Odyssey Neo G9 Mini-LED Curved Monitor" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:44.30%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/juErrw8U55pggbCEYSyXpa.jpg" alt="Samsung - 57" Odyssey Neo G9 Dual 4k Uhd Quantum Mini-Led 240hz 1ms Hdr 1000 Curved Gaming Monitor (hdmi 2.1, Dp 2.1, Usb 3.0) - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Samsung 57-inch Odyssey Neo G9 Mini-LED Curved Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I used my iPhone to photograph the stars — here are the subtle tweaks that produced stunning results ]]></title>
                                                                                                <dc:content><![CDATA[ <p>You don’t need an expensive digital camera and heavy lenses to capture the night sky. With modern low-light processing, the iPhone in your pocket is fully capable of taking detailed photos of stars, constellations, and even the faint glow of the Milky Way.</p><p>While these tips work across most recent Apple models with Night Mode, dialing in a few specific camera settings before heading outside makes the difference between a grainy blur and a sharp nightscape.</p><p>Here is how to set up your iPhone for night sky photography.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eMPKlX"></div>                            </div>                            <script src="https://kwizly.com/embed/eMPKlX.js" async></script><h2 id="why-these-simple-tweaks-work-and-the-results-to-prove-it">Why these simple tweaks work (and the results to prove it)</h2><p>My camera roll is already full of shots of the sun setting over the hills and the moon hanging clear in the sky, but pinpointing actual stars on an iPhone had always been surprisingly elusive.</p><p>That finally changed on a recent camping trip I took. The night sky was completely clear, a pitch-black canvas filled with constellations and even the occasional shooting star. It felt like the absolute best time to put my phone to the test. My very first attempt, however, turned out to be a total disappointment: you could only make out one or two stars, faintly illuminated against an expanse of black. </p><p>It wasn't until I changed my techniques and eliminated the physical tap on the screen that everything snapped into focus. You can see the results below.  </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="52BVcrMJp5BFZcNnteYNdK" name="Before and after iPhone astrophotography_ a sharp, detailed night sky captured using a short timer and raw photo mode." alt="Before and after iPhone astrophotography: a sharp, detailed night sky captured using a short timer and raw photo mode." src="https://cdn.mos.cms.futurecdn.net/52BVcrMJp5BFZcNnteYNdK-1920-80.jpg" 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">Before and after iPhone astrophotography: a sharp, detailed night sky captured using a short timer and raw photo mode. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Kaycee Hill)</span></figcaption></figure><p>Once the micro-vibrations were gone, the sensor finally captured the rich depth of the night sky — revealing dense star clusters, subtle nebular glow, and tight, needle-sharp points of light with zero motion blur.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="i2tDtenLTexC5rPzQjZb2L" name="Starry night sky" alt="Starry night sky" src="https://cdn.mos.cms.futurecdn.net/i2tDtenLTexC5rPzQjZb2L-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 / Kaycee Hill )</span></figcaption></figure><p>There is something immensely satisfying about capturing a photo that actually matches the awe of standing under a dark, star-filled sky in person. Here are the exact camera adjustments you need to make to get the same results on your next clear night.</p><section class="howto-block">                    <h3>1. Lock your iPhone into a tripod to unlock 30-second exposures</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/69bGo3sSVN8auVnAxJYnkG.jpg"                                        alt="iPhone 16 being used for astrophotography."                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/69bGo3sSVN8auVnAxJYnkG.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide )</div></figure>                    <p><p>When you shoot in Night Mode by hand, your iPhone caps the exposure time at 10 seconds to avoid handheld blur. However, the internal gyroscopes automatically detect when the phone is locked down on a tripod.</p><p><strong>Mounting your device unlocks the full</strong> <strong>30-second Max exposure</strong> <strong>setting</strong>, giving the sensor enough time to gather faint starlight and pull hidden details out of the dark.</p></p>                </section><section class="howto-block">                    <h3>2. Stick strictly to 1x lens and turn on RAW</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/wLAzVWFtZ7oCMX6ygqYuXU.jpg"                                        alt="RAW turned on in iPhone 15 Pro camera settings"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/wLAzVWFtZ7oCMX6ygqYuXU.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Your iPhone opens to the primary 1x wide lens by default, which features the camera's largest physical sensor and aperture for gathering light. <strong>Make sure not to pinch to zoom or switch to the 0.5x ultra-wide lens</strong>, as those smaller sensors produce grainier night shots. </p><p>Then <strong>tap the six-dot menu and select your format to switch to RAW</strong>, or simply t<strong>ap the RAW indicator in the top corner </strong>before shooting to save uncompressed image data for cleaner editing later.</p></p>                </section><section class="howto-block">                    <h3>3. Set a timer to eliminate shutter shake</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/zpnNVLubaRh4jwLASHfgK5.jpg"                                        alt="3 second timer set on iPhone camera"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/zpnNVLubaRh4jwLASHfgK5.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p><strong>Set your iPhone’s built-in self-timer to a 3-second delay </strong>to keep your shots razor-sharp. Even on a sturdy tripod, tapping the screen creates micro-vibrations that travel through the phone. Because long exposures are sensitive to movement, that split-second shake can easily blur the final image.</p><p>The brief countdown gives those physical vibrations time to completely die down before the camera begins capturing, ensuring crisp details.</p><p>To bypass the countdown altogether,<strong> you can always trigger the shutter hands-free</strong> using the Apple Watch Camera Remote app, Voice Control, or the volume button on a pair of wired headphones.</p></p>                </section><h2 id="how-to-do-this-on-samsung-or-google-pixel-phones">How to do this on Samsung or Google Pixel 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:3089px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="FrhS2ng2iec3yh87YUtvp9" name="Samsung-Galaxy-S25-Ultra-astrophotography" alt="Samsung Galaxy S25 Ultra astrophotography." src="https://cdn.mos.cms.futurecdn.net/FrhS2ng2iec3yh87YUtvp9-1920-80.jpg" mos="" align="middle" fullscreen="" width="3089" height="1737" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Toms Guide / John Velasco)</span></figcaption></figure><p>If you or a friend are shooting on Android, the same core principles apply using native tools. <strong>Google Pixel users can switch to Night Sight and secure the phone on a tripod</strong> to automatically trigger Astrophotography mode, which shoots a 4-minute exposure sequence. </p><p><strong>Samsung Galaxy users can opt for a similar automated experience using Astrophoto Mode inside Samsung's</strong> <strong>Expert RAW app</strong>, which stacks exposures over 4 to 10 minutes and even includes an on-screen constellation guide. </p><p>Alternatively, <strong>you can use manual controls by swiping to Pro Mode in the Camera app</strong>: set your shutter speed to 10 to 15 seconds to capture the starlight, and dial your ISO to 800–1600 to keep the image sharp. </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/start-using-these-3-iphone-camera-features-youll-wonder-how-you-lived-without-them">Start using these 3 iPhone camera features — you'll wonder how you lived without them</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-added-a-suite-of-photo-editing-tools-in-ios-27-and-theyre-absolute-game-changers">iOS 27 Photos features that transform your pictures — here's how to use them</a></li><li><a href="https://www.tomsguide.com/phones/iphones/how-to-use-every-iphone-camera-mode-to-take-better-photos">How to use every iPhone camera mode to take better photos</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/i-used-my-iphone-to-photograph-the-stars-here-are-the-subtle-tweaks-that-produced-stunning-results</link>
                                                                            <description>
                            <![CDATA[ Skip the expensive camera gear — adjusting your phone's exposure times, lens settings, and stability is all it takes to capture gorgeous starscapes. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">RCk2Z79MoycWdKhrGxwNSH</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/eqbKC6bHRZ3Ac2cWkozvkG-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 13 Oct 2026 04:30:00 +0000</pubDate>                                                                                                                                <updated>Tue, 13 Oct 2026 13:03:08 +0000</updated>
                                                                                                                                            <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G-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/eqbKC6bHRZ3Ac2cWkozvkG-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 16 being used for astrophotography.]]></media:description>                                                            <media:text><![CDATA[iPhone 16 being used for astrophotography.]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 16 being used for astrophotography.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/eqbKC6bHRZ3Ac2cWkozvkG-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>You don’t need an expensive digital camera and heavy lenses to capture the night sky. With modern low-light processing, the iPhone in your pocket is fully capable of taking detailed photos of stars, constellations, and even the faint glow of the Milky Way.</p><p>While these tips work across most recent Apple models with Night Mode, dialing in a few specific camera settings before heading outside makes the difference between a grainy blur and a sharp nightscape.</p><p>Here is how to set up your iPhone for night sky photography.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eMPKlX"></div>                            </div>                            <script src="https://kwizly.com/embed/eMPKlX.js" async></script><h2 id="why-these-simple-tweaks-work-and-the-results-to-prove-it">Why these simple tweaks work (and the results to prove it)</h2><p>My camera roll is already full of shots of the sun setting over the hills and the moon hanging clear in the sky, but pinpointing actual stars on an iPhone had always been surprisingly elusive.</p><p>That finally changed on a recent camping trip I took. The night sky was completely clear, a pitch-black canvas filled with constellations and even the occasional shooting star. It felt like the absolute best time to put my phone to the test. My very first attempt, however, turned out to be a total disappointment: you could only make out one or two stars, faintly illuminated against an expanse of black. </p><p>It wasn't until I changed my techniques and eliminated the physical tap on the screen that everything snapped into focus. You can see the results below.  </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="52BVcrMJp5BFZcNnteYNdK" name="Before and after iPhone astrophotography_ a sharp, detailed night sky captured using a short timer and raw photo mode." alt="Before and after iPhone astrophotography: a sharp, detailed night sky captured using a short timer and raw photo mode." src="https://cdn.mos.cms.futurecdn.net/52BVcrMJp5BFZcNnteYNdK-1920-80.jpg" 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">Before and after iPhone astrophotography: a sharp, detailed night sky captured using a short timer and raw photo mode. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Kaycee Hill)</span></figcaption></figure><p>Once the micro-vibrations were gone, the sensor finally captured the rich depth of the night sky — revealing dense star clusters, subtle nebular glow, and tight, needle-sharp points of light with zero motion blur.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="i2tDtenLTexC5rPzQjZb2L" name="Starry night sky" alt="Starry night sky" src="https://cdn.mos.cms.futurecdn.net/i2tDtenLTexC5rPzQjZb2L-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 / Kaycee Hill )</span></figcaption></figure><p>There is something immensely satisfying about capturing a photo that actually matches the awe of standing under a dark, star-filled sky in person. Here are the exact camera adjustments you need to make to get the same results on your next clear night.</p><section class="howto-block">                    <h3>1. Lock your iPhone into a tripod to unlock 30-second exposures</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/69bGo3sSVN8auVnAxJYnkG.jpg"                                        alt="iPhone 16 being used for astrophotography."                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/69bGo3sSVN8auVnAxJYnkG.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide )</div></figure>                    <p><p>When you shoot in Night Mode by hand, your iPhone caps the exposure time at 10 seconds to avoid handheld blur. However, the internal gyroscopes automatically detect when the phone is locked down on a tripod.</p><p><strong>Mounting your device unlocks the full</strong> <strong>30-second Max exposure</strong> <strong>setting</strong>, giving the sensor enough time to gather faint starlight and pull hidden details out of the dark.</p></p>                </section><section class="howto-block">                    <h3>2. Stick strictly to 1x lens and turn on RAW</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/wLAzVWFtZ7oCMX6ygqYuXU.jpg"                                        alt="RAW turned on in iPhone 15 Pro camera settings"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/wLAzVWFtZ7oCMX6ygqYuXU.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Your iPhone opens to the primary 1x wide lens by default, which features the camera's largest physical sensor and aperture for gathering light. <strong>Make sure not to pinch to zoom or switch to the 0.5x ultra-wide lens</strong>, as those smaller sensors produce grainier night shots. </p><p>Then <strong>tap the six-dot menu and select your format to switch to RAW</strong>, or simply t<strong>ap the RAW indicator in the top corner </strong>before shooting to save uncompressed image data for cleaner editing later.</p></p>                </section><section class="howto-block">                    <h3>3. Set a timer to eliminate shutter shake</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/zpnNVLubaRh4jwLASHfgK5.jpg"                                        alt="3 second timer set on iPhone camera"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/zpnNVLubaRh4jwLASHfgK5.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p><strong>Set your iPhone’s built-in self-timer to a 3-second delay </strong>to keep your shots razor-sharp. Even on a sturdy tripod, tapping the screen creates micro-vibrations that travel through the phone. Because long exposures are sensitive to movement, that split-second shake can easily blur the final image.</p><p>The brief countdown gives those physical vibrations time to completely die down before the camera begins capturing, ensuring crisp details.</p><p>To bypass the countdown altogether,<strong> you can always trigger the shutter hands-free</strong> using the Apple Watch Camera Remote app, Voice Control, or the volume button on a pair of wired headphones.</p></p>                </section><h2 id="how-to-do-this-on-samsung-or-google-pixel-phones">How to do this on Samsung or Google Pixel 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:3089px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="FrhS2ng2iec3yh87YUtvp9" name="Samsung-Galaxy-S25-Ultra-astrophotography" alt="Samsung Galaxy S25 Ultra astrophotography." src="https://cdn.mos.cms.futurecdn.net/FrhS2ng2iec3yh87YUtvp9-1920-80.jpg" mos="" align="middle" fullscreen="" width="3089" height="1737" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Toms Guide / John Velasco)</span></figcaption></figure><p>If you or a friend are shooting on Android, the same core principles apply using native tools. <strong>Google Pixel users can switch to Night Sight and secure the phone on a tripod</strong> to automatically trigger Astrophotography mode, which shoots a 4-minute exposure sequence. </p><p><strong>Samsung Galaxy users can opt for a similar automated experience using Astrophoto Mode inside Samsung's</strong> <strong>Expert RAW app</strong>, which stacks exposures over 4 to 10 minutes and even includes an on-screen constellation guide. </p><p>Alternatively, <strong>you can use manual controls by swiping to Pro Mode in the Camera app</strong>: set your shutter speed to 10 to 15 seconds to capture the starlight, and dial your ISO to 800–1600 to keep the image sharp. </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/start-using-these-3-iphone-camera-features-youll-wonder-how-you-lived-without-them">Start using these 3 iPhone camera features — you'll wonder how you lived without them</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-added-a-suite-of-photo-editing-tools-in-ios-27-and-theyre-absolute-game-changers">iOS 27 Photos features that transform your pictures — here's how to use them</a></li><li><a href="https://www.tomsguide.com/phones/iphones/how-to-use-every-iphone-camera-mode-to-take-better-photos">How to use every iPhone camera mode to take better photos</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung’s latest Secret Sale has some of its best devices on sale: Galaxy S26, Watch 8, Tab S10 and Buds 4 Pro are up to 35% off ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Hey there! You look trustworthy, so I'm going to give you the inside scoop on <a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank">Samsung's latest Secret Sale</a> in Australia: right now, the electronics giant is holding a 48-hour flash sale — ending at 11am (AEDT) on Wednesday, October 14 — that's slashing prices on top smartphones, tablets, earbuds and more. </p><p>We're talking savings of up to 35% off Galaxy S26, Watch 8, Tab S10 and Buds 4 Pro, and all you have to do is apply the code <strong>SECRETGALAXY</strong> at checkout. I trust you'll keep that info between you and me.</p><p>In terms of big-ticket items, the largest discount can be found on the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-plus-review">Galaxy S26+</a>, which usually starts at AU$1,949 but can now be nabbed from only <a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank">AU$1,266.85</a> — that's a tidy saving of AU$682.15. Of course, you could use the same code on the top-end <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Galaxy S26 Ultra</a> or the entry-level <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-fe-review-the-perfect-cure-for-samsungs-recent-price-hike-frenzy">Galaxy S26 FE</a>, now discounted by 30% and 25%, respectively. </p><div class="product"><a data-dimension112="683a02d8-c5f6-11f1-a608-59f24f520603" data-action="Deal Block" data-label="Galaxy S26 Plus (256GB)" data-dimension48="Galaxy S26 Plus (256GB)" data-dimension25="$1266.85" href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:898px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="7r8MAhWYUVBxvimJVTiKaT" name="Samsung Galaxy S26 Plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7r8MAhWYUVBxvimJVTiKaT-1920-80.jpg" mos="" align="middle" fullscreen="" width="898" height="898" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow" data-dimension112="683a02d8-c5f6-11f1-a608-59f24f520603" data-action="Deal Block" data-label="Galaxy S26 Plus (256GB)" data-dimension48="Galaxy S26 Plus (256GB)" data-dimension25="$1266.85">Galaxy S26 Plus (256GB): was $1949 now $1266.85</a></strong><br>If you're after a flagship phone upgrade, the biggest saving in Samsung's Secret Sale is on the Galaxy S26 Plus. Usually priced from AU$1,949, it's dropped to just AU$1,266.85 when you apply the code <strong>SECRETGALAXY</strong> at checkout, shaving a sizeable AU$682.15 off the usual asking price.<a class="view-deal button" href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow" data-dimension112="683a02d8-c5f6-11f1-a608-59f24f520603" data-action="Deal Block" data-label="Galaxy S26 Plus (256GB)" data-dimension48="Galaxy S26 Plus (256GB)" data-dimension25="$1266.85">View Deal</a></p></div><p>If a new tablet is what you're after, you're in luck — <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review">Samsung's Galaxy Tab S10 FE+</a> is also discounted by a hefty 30%, now starting at just <del>AU$1,099</del> <a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank">AU$769.30</a> for the 128GB model with 8GB of RAM, and topping out at only <del>AU$1,499</del> <a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank">AU$1,049.30</a> for the 256GB version with 12GB of RAM.</p><div class="product"><a data-dimension112="683a03c8-c5f6-11f1-b614-6f4910806a16" data-action="Deal Block" data-label="Galaxy Tab S10 FE Plus (128GB)" data-dimension48="Galaxy Tab S10 FE Plus (128GB)" data-dimension25="$769.30" href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="SrCgxi7AvcPGqXWv24WMaM" name="Samsung Galaxy S10 FE Plus deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SrCgxi7AvcPGqXWv24WMaM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow" data-dimension112="683a03c8-c5f6-11f1-b614-6f4910806a16" data-action="Deal Block" data-label="Galaxy Tab S10 FE Plus (128GB)" data-dimension48="Galaxy Tab S10 FE Plus (128GB)" data-dimension25="$769.30">Galaxy Tab S10 FE Plus (128GB): was $1099 now $769.30</a></strong><br>Looking for a new tablet? Samsung's Galaxy Tab S10 FE+ is another standout deal in the Secret Sale. Normally priced from AU$1,099, the 128GB model with 8GB of RAM drops to just AU$769.30 when you use the code <strong>SECRETGALAXY</strong> at checkout, knocking an impressive AU$329.70 off the RRP. <a class="view-deal button" href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow" data-dimension112="683a03c8-c5f6-11f1-b614-6f4910806a16" data-action="Deal Block" data-label="Galaxy Tab S10 FE Plus (128GB)" data-dimension48="Galaxy Tab S10 FE Plus (128GB)" data-dimension25="$769.30">View Deal</a></p></div><p>And if you've been waiting for a good time to upgrade your smartwatch, this flash sale is a great excuse to grab Samsung's Galaxy Watch 8 Classic (46mm) at a sweet 25% discount, with the Bluetooth model currently priced at <del>AU$770</del> <a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank">AU$577.50</a> and the LTE version now down to <del>AU$870</del> <a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank">AU$652.50</a>.</p><div class="product"><a data-dimension112="683a0436-c5f6-11f1-bad5-f7890eafb32e" data-action="Deal Block" data-label="Galaxy Watch 8 Classic (46mm, Bluetooth)" data-dimension48="Galaxy Watch 8 Classic (46mm, Bluetooth)" data-dimension25="$577.50" href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:359px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="VwYWMMThR3if3E5rhCpjtn" name="Galaxy-W8-C" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/VwYWMMThR3if3E5rhCpjtn-1920-80.jpg" mos="" align="middle" fullscreen="" width="359" height="359" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow" data-dimension112="683a0436-c5f6-11f1-bad5-f7890eafb32e" data-action="Deal Block" data-label="Galaxy Watch 8 Classic (46mm, Bluetooth)" data-dimension48="Galaxy Watch 8 Classic (46mm, Bluetooth)" data-dimension25="$577.50">Galaxy Watch 8 Classic (46mm, Bluetooth): was $770 now $577.50</a></strong><br>The Galaxy Watch 8 Classic has received a 25% price cut in Samsung's Secret Sale. Normally AU$770, the 46mm Bluetooth model drops to just AU$577.50 when you apply the code <strong>SECRETGALAXY</strong> at checkout, saving you AU$192.50 off the regular price. Alternatively, you can nab the LTE version for AU$652.50 (down from AU$870), delivering an even bigger AU$217.50 saving while giving you the freedom to stay connected without your phone nearby.<a class="view-deal button" href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow" data-dimension112="683a0436-c5f6-11f1-bad5-f7890eafb32e" data-action="Deal Block" data-label="Galaxy Watch 8 Classic (46mm, Bluetooth)" data-dimension48="Galaxy Watch 8 Classic (46mm, Bluetooth)" data-dimension25="$577.50">View Deal</a></p></div><p>While the deals mentioned above offer the most savings, there are plenty more available on <a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank">Samsung's Secret Sale landing page</a>, including big discounts on Samsung's <a href="https://www.tomsguide.com/audio/earbuds/samsung-galaxy-buds-4-pro-review">Galaxy Buds 4 Pro</a>, SmartTags, clear cases, and more. Just remember to use the code <strong>SECRETGALAXY</strong> at checkout if you’re planning to buy anything.</p><p>Just make sure you act quickly — Samsung's Secret Sale wraps up at 11am (AEDT) on Wednesday, October 14, 2026.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-preorders">iPhone 18 Pro deals in Australia — top offers and plans</a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-deals-au">Google Pixel 11 deals— top plans and offers in Australia</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/sales-events/samsungs-latest-secret-sale-has-some-of-its-best-devices-on-sale-galaxy-s26-watch-8-tab-s10-and-buds-4-pro-are-up-to-35-percent-off</link>
                                                                            <description>
                            <![CDATA[ Samsung tried to keep this on the down-low, but it's just slashed hundreds from the price of some of its top tech products of the year. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LiRFoFqDEXKCUqbNz2L9ZL</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/XnLXyj9aUc5y3gNkuQizBD-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 12 Oct 2026 05:45:49 +0000</pubDate>                                                                                                                                <updated>Mon, 12 Oct 2026 22:16:23 +0000</updated>
                                                                                                                                            <category><![CDATA[Sales Events]]></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/XnLXyj9aUc5y3gNkuQizBD-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Hand holding Samsung Galaxy S26 Plus with killer deals badge overlaid]]></media:description>                                                            <media:text><![CDATA[Hand holding Samsung Galaxy S26 Plus with killer deals badge overlaid]]></media:text>
                                <media:title type="plain"><![CDATA[Hand holding Samsung Galaxy S26 Plus with killer deals badge overlaid]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/XnLXyj9aUc5y3gNkuQizBD-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Hey there! You look trustworthy, so I'm going to give you the inside scoop on <a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank">Samsung's latest Secret Sale</a> in Australia: right now, the electronics giant is holding a 48-hour flash sale — ending at 11am (AEDT) on Wednesday, October 14 — that's slashing prices on top smartphones, tablets, earbuds and more. </p><p>We're talking savings of up to 35% off Galaxy S26, Watch 8, Tab S10 and Buds 4 Pro, and all you have to do is apply the code <strong>SECRETGALAXY</strong> at checkout. I trust you'll keep that info between you and me.</p><p>In terms of big-ticket items, the largest discount can be found on the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-plus-review">Galaxy S26+</a>, which usually starts at AU$1,949 but can now be nabbed from only <a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank">AU$1,266.85</a> — that's a tidy saving of AU$682.15. Of course, you could use the same code on the top-end <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Galaxy S26 Ultra</a> or the entry-level <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-fe-review-the-perfect-cure-for-samsungs-recent-price-hike-frenzy">Galaxy S26 FE</a>, now discounted by 30% and 25%, respectively. </p><div class="product"><a data-dimension112="683a02d8-c5f6-11f1-a608-59f24f520603" data-action="Deal Block" data-label="Galaxy S26 Plus (256GB)" data-dimension48="Galaxy S26 Plus (256GB)" data-dimension25="$1266.85" href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:898px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="7r8MAhWYUVBxvimJVTiKaT" name="Samsung Galaxy S26 Plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7r8MAhWYUVBxvimJVTiKaT-1920-80.jpg" mos="" align="middle" fullscreen="" width="898" height="898" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow" data-dimension112="683a02d8-c5f6-11f1-a608-59f24f520603" data-action="Deal Block" data-label="Galaxy S26 Plus (256GB)" data-dimension48="Galaxy S26 Plus (256GB)" data-dimension25="$1266.85">Galaxy S26 Plus (256GB): was $1949 now $1266.85</a></strong><br>If you're after a flagship phone upgrade, the biggest saving in Samsung's Secret Sale is on the Galaxy S26 Plus. Usually priced from AU$1,949, it's dropped to just AU$1,266.85 when you apply the code <strong>SECRETGALAXY</strong> at checkout, shaving a sizeable AU$682.15 off the usual asking price.<a class="view-deal button" href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow" data-dimension112="683a02d8-c5f6-11f1-a608-59f24f520603" data-action="Deal Block" data-label="Galaxy S26 Plus (256GB)" data-dimension48="Galaxy S26 Plus (256GB)" data-dimension25="$1266.85">View Deal</a></p></div><p>If a new tablet is what you're after, you're in luck — <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review">Samsung's Galaxy Tab S10 FE+</a> is also discounted by a hefty 30%, now starting at just <del>AU$1,099</del> <a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank">AU$769.30</a> for the 128GB model with 8GB of RAM, and topping out at only <del>AU$1,499</del> <a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank">AU$1,049.30</a> for the 256GB version with 12GB of RAM.</p><div class="product"><a data-dimension112="683a03c8-c5f6-11f1-b614-6f4910806a16" data-action="Deal Block" data-label="Galaxy Tab S10 FE Plus (128GB)" data-dimension48="Galaxy Tab S10 FE Plus (128GB)" data-dimension25="$769.30" href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="SrCgxi7AvcPGqXWv24WMaM" name="Samsung Galaxy S10 FE Plus deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SrCgxi7AvcPGqXWv24WMaM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow" data-dimension112="683a03c8-c5f6-11f1-b614-6f4910806a16" data-action="Deal Block" data-label="Galaxy Tab S10 FE Plus (128GB)" data-dimension48="Galaxy Tab S10 FE Plus (128GB)" data-dimension25="$769.30">Galaxy Tab S10 FE Plus (128GB): was $1099 now $769.30</a></strong><br>Looking for a new tablet? Samsung's Galaxy Tab S10 FE+ is another standout deal in the Secret Sale. Normally priced from AU$1,099, the 128GB model with 8GB of RAM drops to just AU$769.30 when you use the code <strong>SECRETGALAXY</strong> at checkout, knocking an impressive AU$329.70 off the RRP. <a class="view-deal button" href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow" data-dimension112="683a03c8-c5f6-11f1-b614-6f4910806a16" data-action="Deal Block" data-label="Galaxy Tab S10 FE Plus (128GB)" data-dimension48="Galaxy Tab S10 FE Plus (128GB)" data-dimension25="$769.30">View Deal</a></p></div><p>And if you've been waiting for a good time to upgrade your smartwatch, this flash sale is a great excuse to grab Samsung's Galaxy Watch 8 Classic (46mm) at a sweet 25% discount, with the Bluetooth model currently priced at <del>AU$770</del> <a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank">AU$577.50</a> and the LTE version now down to <del>AU$870</del> <a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank">AU$652.50</a>.</p><div class="product"><a data-dimension112="683a0436-c5f6-11f1-bad5-f7890eafb32e" data-action="Deal Block" data-label="Galaxy Watch 8 Classic (46mm, Bluetooth)" data-dimension48="Galaxy Watch 8 Classic (46mm, Bluetooth)" data-dimension25="$577.50" href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:359px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="VwYWMMThR3if3E5rhCpjtn" name="Galaxy-W8-C" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/VwYWMMThR3if3E5rhCpjtn-1920-80.jpg" mos="" align="middle" fullscreen="" width="359" height="359" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow" data-dimension112="683a0436-c5f6-11f1-bad5-f7890eafb32e" data-action="Deal Block" data-label="Galaxy Watch 8 Classic (46mm, Bluetooth)" data-dimension48="Galaxy Watch 8 Classic (46mm, Bluetooth)" data-dimension25="$577.50">Galaxy Watch 8 Classic (46mm, Bluetooth): was $770 now $577.50</a></strong><br>The Galaxy Watch 8 Classic has received a 25% price cut in Samsung's Secret Sale. Normally AU$770, the 46mm Bluetooth model drops to just AU$577.50 when you apply the code <strong>SECRETGALAXY</strong> at checkout, saving you AU$192.50 off the regular price. Alternatively, you can nab the LTE version for AU$652.50 (down from AU$870), delivering an even bigger AU$217.50 saving while giving you the freedom to stay connected without your phone nearby.<a class="view-deal button" href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank" rel="nofollow" data-dimension112="683a0436-c5f6-11f1-bad5-f7890eafb32e" data-action="Deal Block" data-label="Galaxy Watch 8 Classic (46mm, Bluetooth)" data-dimension48="Galaxy Watch 8 Classic (46mm, Bluetooth)" data-dimension25="$577.50">View Deal</a></p></div><p>While the deals mentioned above offer the most savings, there are plenty more available on <a href="https://www.samsung.com/au/multistore/secret-sale/" target="_blank">Samsung's Secret Sale landing page</a>, including big discounts on Samsung's <a href="https://www.tomsguide.com/audio/earbuds/samsung-galaxy-buds-4-pro-review">Galaxy Buds 4 Pro</a>, SmartTags, clear cases, and more. Just remember to use the code <strong>SECRETGALAXY</strong> at checkout if you’re planning to buy anything.</p><p>Just make sure you act quickly — Samsung's Secret Sale wraps up at 11am (AEDT) on Wednesday, October 14, 2026.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-preorders">iPhone 18 Pro deals in Australia — top offers and plans</a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-deals-au">Google Pixel 11 deals— top plans and offers in Australia</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Prime Day phone deals aren't all gone just yet — grab these 13 discounts while you still can ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Amazon's October Prime Day may be over already, but that doesn't mean all the deals have vanished. If you're still looking for a new phone, and don't want to wait until Black Friday sales start in earnest, then you can still save some money on the latest handsets. Both from lingering sales on Amazon and from discounts at retailers like Best Buy.</p><p>Some of these deals aren't quite as good <a href="https://www.tomsguide.com/phones/17-prime-day-phone-deals-to-help-you-beat-the-price-hikes-galaxy-s26-iphone-air-pixel-11-galaxy-z-fold-8-and-more">as they were for Prime Day</a>, but other phones have stuck to the same low price — like the <a href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Charging-Warranty/dp/B0G4SWDH8P/" target="_blank" rel="nofollow">$949 Samsung Galaxy S26 Ultra</a>, which is $450 off the current retail price. </p><p>Here are the best phone discounts you can still get, even though Prime Day is technically over.</p><div class="product"><a data-dimension112="c3f4e7b0-c2f8-11f1-a687-8fc53646177d" data-action="Deal Block" data-label="iPhone 16e" data-dimension48="iPhone 16e" data-dimension25="$519" href="https://www.bestbuy.com/product/apple-iphone-16e-128gb-apple-intelligence-unlocked-white/JJGCQG2GTF" 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="6XDDGA8kCSFrs9m2vXphbQ" name="iphone16e-bb" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6XDDGA8kCSFrs9m2vXphbQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.tomsguide.com/phones/iphones/apple-iphone-16e-review" data-dimension112="c3f4e7b0-c2f8-11f1-a687-8fc53646177d" data-action="Deal Block" data-label="iPhone 16e" data-dimension48="iPhone 16e" data-dimension25="$519">iPhone 16e</a>, Apple's cheapest phone, is a little cheaper over at Best Buy, offering the most cost-effective way to join the Apple ecosystem. You do need to make some sacrifices, though. There's only a single camera, no MagSafe and the notched display is still kicking around. But it is still an excellent phone with access to most Apple Intelligence features.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-iphone-16e-128gb-apple-intelligence-unlocked-white/JJGCQG2GTF" target="_blank" rel="nofollow" data-dimension112="c3f4e7b0-c2f8-11f1-a687-8fc53646177d" data-action="Deal Block" data-label="iPhone 16e" data-dimension48="iPhone 16e" data-dimension25="$519">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4e828-c2f8-11f1-80da-17cc71bdead6" data-action="Deal Block" data-label="Phone 4a Pro" data-dimension48="Phone 4a Pro" data-dimension25="$419" href="https://www.bestbuy.com/product/nothing-phone-4a-pro-128gb-unlocked-silver/CZTTGJQQJ2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="D7yfN6qubYsNKDFyhBH2e8" name="Phone-4a-Pro-White" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/D7yfN6qubYsNKDFyhBH2e8-1920-80.webp" mos="" align="middle" fullscreen="" width="2048" height="2048" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>One of our favorite<a href="https://www.tomsguide.com/best-picks/best-cheap-phones" data-dimension112="c3f4e828-c2f8-11f1-80da-17cc71bdead6" data-action="Deal Block" data-label="Phone 4a Pro" data-dimension48="Phone 4a Pro" data-dimension25="$419"> cheap phones,</a> the <a href="https://www.tomsguide.com/phones/android-phones/nothing-phone-4a-pro-review-a-solid-sub-usd500-phone-let-down-by-its-altered-looks">Nothing Phone 4a Pro</a> offers incredible value, especially at this price tag. It offers solid camera quality, a unique design, strong AI features, reasonable performance and battery life, plus the customizable Glyph Matrix LED display.<a class="view-deal button" href="https://www.bestbuy.com/product/nothing-phone-4a-pro-128gb-unlocked-silver/CZTTGJQQJ2" target="_blank" rel="nofollow" data-dimension112="c3f4e828-c2f8-11f1-80da-17cc71bdead6" data-action="Deal Block" data-label="Phone 4a Pro" data-dimension48="Phone 4a Pro" data-dimension25="$419">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4e8b4-c2f8-11f1-879c-7bfb4a3ee07b" data-action="Deal Block" data-label="Pixel 10a" data-dimension48="Pixel 10a" data-dimension25="$524" href="https://www.amazon.com/dp/B0GHRHXVN1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1243px;"><p class="vanilla-image-block" style="padding-top:120.68%;"><img id="HeYsLX4yTgWGZz9Yq5NJFM" name="Pixel 10a deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HeYsLX4yTgWGZz9Yq5NJFM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1243" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10a-review" data-dimension112="c3f4e8b4-c2f8-11f1-879c-7bfb4a3ee07b" data-action="Deal Block" data-label="Pixel 10a" data-dimension48="Pixel 10a" data-dimension25="$524">Pixel 10a </a>may not have been the most impressive upgrade, even by Google standards, but it offers a lot. Good battery life and camera performance, a flush design with no camera bump and a bunch of the best AI features Google has to offer. It's not as cheap as the pre-price hike cost, but it's still a nice discount.<a class="view-deal button" href="https://www.amazon.com/dp/B0GHRHXVN1" target="_blank" rel="nofollow" data-dimension112="c3f4e8b4-c2f8-11f1-879c-7bfb4a3ee07b" data-action="Deal Block" data-label="Pixel 10a" data-dimension48="Pixel 10a" data-dimension25="$524">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4e918-c2f8-11f1-ade2-2b35e122374c" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$574" href="https://www.amazon.com/dp/B0H7SLXZPB" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1055px;"><p class="vanilla-image-block" style="padding-top:121.14%;"><img id="3P6jH9V8UzMwnSzb52ADW3" name="Galaxy S26 FE" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3P6jH9V8UzMwnSzb52ADW3-1920-80.png" mos="" align="middle" fullscreen="" width="1055" height="1278" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The low-cost flagship <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-fe-review-the-perfect-cure-for-samsungs-recent-price-hike-frenzy" data-dimension112="c3f4e918-c2f8-11f1-ade2-2b35e122374c" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$574">Samsung Galaxy S26 FE</a> is enticing because that even-lower Prime Day price is hanging around for a little while longer. It's not as good as the Galaxy S26, but you still get good cameras and battery life, as well as a premium design and the all-important telephoto lens — something a lot of cheap phones tend to skip.<a class="view-deal button" href="https://www.amazon.com/dp/B0H7SLXZPB" target="_blank" rel="nofollow" data-dimension112="c3f4e918-c2f8-11f1-ade2-2b35e122374c" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$574">View Deal</a></p></div><div class="product"><a data-dimension112="d5f3eb94-c2fa-11f1-9370-fd2f49a0a980" data-action="Deal Block" data-label="Pixel 10" data-dimension48="Pixel 10" data-dimension25="$649" href="https://www.amazon.com/Google-Pixel-Smartphone-Assistant-Fast-Charging/dp/B0FFTRPM4K" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="bpTaV2HQDC8Bt3dMMYCbnS" name="61OyKi98IuL._AC_SL1500_ copy" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bpTaV2HQDC8Bt3dMMYCbnS-1920-80.jpg" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The difference between the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-review" data-dimension112="d5f3eb94-c2fa-11f1-9370-fd2f49a0a980" data-action="Deal Block" data-label="Pixel 10" data-dimension48="Pixel 10" data-dimension25="$649">Pixel 10</a> and Pixel 11 isn't that extreme, not where hardware is concerned anyway. Actual performance and daily usage is pretty similar, and that means you could get a comparable experience for a much lower price tag — $150 less than the Pixel 11's sale price.<a class="view-deal button" href="https://www.amazon.com/Google-Pixel-Smartphone-Assistant-Fast-Charging/dp/B0FFTRPM4K" target="_blank" rel="nofollow" data-dimension112="d5f3eb94-c2fa-11f1-9370-fd2f49a0a980" data-action="Deal Block" data-label="Pixel 10" data-dimension48="Pixel 10" data-dimension25="$649">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4e986-c2f8-11f1-b8e5-b9490c6c219e" data-action="Deal Block" data-label="Pixel 11" data-dimension48="Pixel 11" data-dimension25="$799" href="https://www.amazon.com/Google-Pixel-11-Unlocked-Smartphone/dp/B0H836MLYT?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1252px;"><p class="vanilla-image-block" style="padding-top:119.81%;"><img id="HU5623EmmcxWKvimncgZqE" name="Pixel 11 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HU5623EmmcxWKvimncgZqE-1920-80.jpg" mos="" align="middle" fullscreen="" width="1252" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you do want the latest and best Pixel, the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-review" data-dimension112="c3f4e986-c2f8-11f1-b8e5-b9490c6c219e" data-action="Deal Block" data-label="Pixel 11" data-dimension48="Pixel 11" data-dimension25="$799">Pixel 11</a> can still be purchased for less than its retail price. Google hiked prices this year, so you're not saving a whole lot, but this device is now the same price as a Pixel 10 would have cost you last year. With it you get a triple-lens camera, the latest and best Google AI features like Magic Capture and almost-instant access to new Android updates as they release.<a class="view-deal button" href="https://www.amazon.com/Google-Pixel-11-Unlocked-Smartphone/dp/B0H836MLYT?th=1" target="_blank" rel="nofollow" data-dimension112="c3f4e986-c2f8-11f1-b8e5-b9490c6c219e" data-action="Deal Block" data-label="Pixel 11" data-dimension48="Pixel 11" data-dimension25="$799">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4e9f4-c2f8-11f1-8f73-9947d938b32a" data-action="Deal Block" data-label="Pixel 11 Pro" data-dimension48="Pixel 11 Pro" data-dimension25="$849" href="https://www.amazon.com/dp/B0H832JH4Z" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1239px;"><p class="vanilla-image-block" style="padding-top:121.07%;"><img id="FrEQh6QFhVjxEGTiUafDmn" name="Pixel 11 Pro deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FrEQh6QFhVjxEGTiUafDmn-1920-80.jpg" mos="" align="middle" fullscreen="" width="1239" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you want a little more out of your Pixel, including the HiLight notification light, then the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-pro-xl-review" data-dimension112="c3f4e9f4-c2f8-11f1-8f73-9947d938b32a" data-action="Deal Block" data-label="Pixel 11 Pro" data-dimension48="Pixel 11 Pro" data-dimension25="$849">Pixel 11 Pro or Pro XL</a> might be your best option. It also features brighter displays, 256GB of storage as standard and some welcome improvements to the camera.</p><p>If you want a larger screen and better battery life, the <a href="https://www.amazon.com/dp/B0H8387SYN?th=1" target="_blank" rel="nofollow">Pixel 11 Pro XL is also on sale for $999</a> — down from $1,299.<a class="view-deal button" href="https://www.amazon.com/dp/B0H832JH4Z" target="_blank" rel="nofollow" data-dimension112="c3f4e9f4-c2f8-11f1-8f73-9947d938b32a" data-action="Deal Block" data-label="Pixel 11 Pro" data-dimension48="Pixel 11 Pro" data-dimension25="$849">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4ea58-c2f8-11f1-b46b-336daec8d6f9" data-action="Deal Block" data-label="iPhone Air" data-dimension48="iPhone Air" data-dimension25="$839" href="https://www.bestbuy.com/product/apple-iphone-air-256gb-unlocked-sky-blue/JJGCQLRKGJ" 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="dm4kNuPysTLWPR7Yz6XnsB" name="iphone-air-bb" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dm4kNuPysTLWPR7Yz6XnsB-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review" data-dimension112="c3f4ea58-c2f8-11f1-b46b-336daec8d6f9" data-action="Deal Block" data-label="iPhone Air" data-dimension48="iPhone Air" data-dimension25="$839">iPhone Air </a>is all about style over substance, but that doesn't mean it's a bad phone. Not only is it the thinnest and lightest iPhone ever made, it's also absurdly durable, to the point where you wouldn't believe it unless you saw it. On top of that you get solid A19 performance, reasonable battery life, good quality photos from the solo camera and a a great screen.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-iphone-air-256gb-unlocked-sky-blue/JJGCQLRKGJ" target="_blank" rel="nofollow" data-dimension112="c3f4ea58-c2f8-11f1-b46b-336daec8d6f9" data-action="Deal Block" data-label="iPhone Air" data-dimension48="iPhone Air" data-dimension25="$839">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4eb20-c2f8-11f1-970e-9bbdedb04018" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$824" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Processor-Immersive/dp/B0G4SW96R4" 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="82idHUPd6dizKAJwshQ8mk" name="Galaxy S26 (256GB) 'Cobalt Violet'" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/82idHUPd6dizKAJwshQ8mk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Samsung recently hiked the prices of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review" data-dimension112="c3f4eb20-c2f8-11f1-970e-9bbdedb04018" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$824">Galaxy S26</a>, but Prime Day deals brought the price well below the new $999 price tag. The price may not be as cheap as it was earlier in the week, but it's still less than you would have paid at the start of the year. Which is great, considering Samsung makes some of the best Android phones around.<a class="view-deal button" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Processor-Immersive/dp/B0G4SW96R4" target="_blank" rel="nofollow" data-dimension112="c3f4eb20-c2f8-11f1-970e-9bbdedb04018" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$824">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4eb8e-c2f8-11f1-bd2f-4d3bd4a9711c" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$949" href="https://www.amazon.com/dp/B0G4SWDH8P" 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>If the regular S26 isn't enough for you, then the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review" data-dimension112="c3f4eb8e-c2f8-11f1-bd2f-4d3bd4a9711c" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$949">Galaxy S26 Ultra</a> is still at its Prime Day price — saving you a whopping $450 off the newly hiked price tag. For that you get S Pen support, a larger screen, an extra telephoto camera, and all the Galaxy AI features you can ask for.<a class="view-deal button" href="https://www.amazon.com/dp/B0G4SWDH8P" target="_blank" rel="nofollow" data-dimension112="c3f4eb8e-c2f8-11f1-bd2f-4d3bd4a9711c" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$949">View Deal</a></p></div><div class="product"><a data-dimension112="d5f3ec48-c2fa-11f1-8649-ab28508b60fd" data-action="Deal Block" data-label="iPhone 18 Pro" data-dimension48="iPhone 18 Pro" data-dimension25="$1099" href="https://www.walmart.com/ip/Straight-Talk-Apple-iPhone-5G-256GB-Black-Includes-120-Unlimited-Airtime-90-Days-Prepaid-Smartphone-Locked-to-Straight-Talk/20994173854" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:573px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="3s5RsfeNFKZJaUA5jMMin8" name="iPhone 18 Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3s5RsfeNFKZJaUA5jMMin8-1920-80.png" mos="" align="middle" fullscreen="" width="573" height="573" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The<a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-and-pro-max-review" data-dimension112="d5f3ec48-c2fa-11f1-8649-ab28508b60fd" data-action="Deal Block" data-label="iPhone 18 Pro" data-dimension48="iPhone 18 Pro" data-dimension25="$1099"> iPhone 18 Pro </a>may be brand new, but you can get a discount at Walmart — with the caveat that this device is locked to Walmart's MVNO Straight Talk. this new phone comes with better battery life, the all-powerful A20 Pro chipset, a variable aperture camera lens, and the best Apple Intelligence features Apple has to offer.<a class="view-deal button" href="https://www.walmart.com/ip/Straight-Talk-Apple-iPhone-5G-256GB-Black-Includes-120-Unlimited-Airtime-90-Days-Prepaid-Smartphone-Locked-to-Straight-Talk/20994173854" target="_blank" rel="nofollow" data-dimension112="d5f3ec48-c2fa-11f1-8649-ab28508b60fd" data-action="Deal Block" data-label="iPhone 18 Pro" data-dimension48="iPhone 18 Pro" data-dimension25="$1099">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4ebf2-c2f8-11f1-93cb-6903c44a0616" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Android-Smartphone/dp/B0H12M2TY4" 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>The iPhone Duo may be coming very soon, but Samsung isn't going to let it win without a fight. The passport-shaped<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win" data-dimension112="c3f4ebf2-c2f8-11f1-93cb-6903c44a0616" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549"> Galaxy Z Fold 8</a> is now $350 off after Prime Day, which makes it $450 cheaper than Apple's first foldable — and you get the same comfortable design and a similar creaseless screen to go with it.<a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Android-Smartphone/dp/B0H12M2TY4" target="_blank" rel="nofollow" data-dimension112="c3f4ebf2-c2f8-11f1-93cb-6903c44a0616" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4ec60-c2f8-11f1-a1ba-09af498a5836" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699" href="https://www.amazon.com/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>If you want the best possible foldable, then the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review" data-dimension112="c3f4ec60-c2f8-11f1-a1ba-09af498a5836" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699">Galaxy Z Fold 8 Ultra</a> might be the one for you — especially with its Prime Day price sticking around. With a larger foldable screen, telephoto camera lens and incredible performance, all for $300 less than an iPhone Duo will cost.<a class="view-deal button" href="https://www.amazon.com/dp/B0H12DXK8J" target="_blank" rel="nofollow" data-dimension112="c3f4ec60-c2f8-11f1-a1ba-09af498a5836" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699">View Deal</a></p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/prime-day-phone-deals-arent-all-gone-just-yet-grab-these-13-discounts-while-you-still-can</link>
                                                                            <description>
                            <![CDATA[ Prime Day is over, but these 13 phone deals are still available. So grab them while you can. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Nvty5bZVqjqGVPjoY8UTsc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/pdRafqLYYAHsudn3hRik8X-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 08 Oct 2026 11:04:21 +0000</pubDate>                                                                                                                                <updated>Thu, 08 Oct 2026 11:04:31 +0000</updated>
                                                                                                                                            <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-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/pdRafqLYYAHsudn3hRik8X-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[samsung galaxy z fold 8 prime day]]></media:description>                                                            <media:text><![CDATA[samsung galaxy z fold 8 prime day]]></media:text>
                                <media:title type="plain"><![CDATA[samsung galaxy z fold 8 prime day]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/pdRafqLYYAHsudn3hRik8X-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Amazon's October Prime Day may be over already, but that doesn't mean all the deals have vanished. If you're still looking for a new phone, and don't want to wait until Black Friday sales start in earnest, then you can still save some money on the latest handsets. Both from lingering sales on Amazon and from discounts at retailers like Best Buy.</p><p>Some of these deals aren't quite as good <a href="https://www.tomsguide.com/phones/17-prime-day-phone-deals-to-help-you-beat-the-price-hikes-galaxy-s26-iphone-air-pixel-11-galaxy-z-fold-8-and-more">as they were for Prime Day</a>, but other phones have stuck to the same low price — like the <a href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Charging-Warranty/dp/B0G4SWDH8P/" target="_blank" rel="nofollow">$949 Samsung Galaxy S26 Ultra</a>, which is $450 off the current retail price. </p><p>Here are the best phone discounts you can still get, even though Prime Day is technically over.</p><div class="product"><a data-dimension112="c3f4e7b0-c2f8-11f1-a687-8fc53646177d" data-action="Deal Block" data-label="iPhone 16e" data-dimension48="iPhone 16e" data-dimension25="$519" href="https://www.bestbuy.com/product/apple-iphone-16e-128gb-apple-intelligence-unlocked-white/JJGCQG2GTF" 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="6XDDGA8kCSFrs9m2vXphbQ" name="iphone16e-bb" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6XDDGA8kCSFrs9m2vXphbQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.tomsguide.com/phones/iphones/apple-iphone-16e-review" data-dimension112="c3f4e7b0-c2f8-11f1-a687-8fc53646177d" data-action="Deal Block" data-label="iPhone 16e" data-dimension48="iPhone 16e" data-dimension25="$519">iPhone 16e</a>, Apple's cheapest phone, is a little cheaper over at Best Buy, offering the most cost-effective way to join the Apple ecosystem. You do need to make some sacrifices, though. There's only a single camera, no MagSafe and the notched display is still kicking around. But it is still an excellent phone with access to most Apple Intelligence features.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-iphone-16e-128gb-apple-intelligence-unlocked-white/JJGCQG2GTF" target="_blank" rel="nofollow" data-dimension112="c3f4e7b0-c2f8-11f1-a687-8fc53646177d" data-action="Deal Block" data-label="iPhone 16e" data-dimension48="iPhone 16e" data-dimension25="$519">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4e828-c2f8-11f1-80da-17cc71bdead6" data-action="Deal Block" data-label="Phone 4a Pro" data-dimension48="Phone 4a Pro" data-dimension25="$419" href="https://www.bestbuy.com/product/nothing-phone-4a-pro-128gb-unlocked-silver/CZTTGJQQJ2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="D7yfN6qubYsNKDFyhBH2e8" name="Phone-4a-Pro-White" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/D7yfN6qubYsNKDFyhBH2e8-1920-80.webp" mos="" align="middle" fullscreen="" width="2048" height="2048" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>One of our favorite<a href="https://www.tomsguide.com/best-picks/best-cheap-phones" data-dimension112="c3f4e828-c2f8-11f1-80da-17cc71bdead6" data-action="Deal Block" data-label="Phone 4a Pro" data-dimension48="Phone 4a Pro" data-dimension25="$419"> cheap phones,</a> the <a href="https://www.tomsguide.com/phones/android-phones/nothing-phone-4a-pro-review-a-solid-sub-usd500-phone-let-down-by-its-altered-looks">Nothing Phone 4a Pro</a> offers incredible value, especially at this price tag. It offers solid camera quality, a unique design, strong AI features, reasonable performance and battery life, plus the customizable Glyph Matrix LED display.<a class="view-deal button" href="https://www.bestbuy.com/product/nothing-phone-4a-pro-128gb-unlocked-silver/CZTTGJQQJ2" target="_blank" rel="nofollow" data-dimension112="c3f4e828-c2f8-11f1-80da-17cc71bdead6" data-action="Deal Block" data-label="Phone 4a Pro" data-dimension48="Phone 4a Pro" data-dimension25="$419">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4e8b4-c2f8-11f1-879c-7bfb4a3ee07b" data-action="Deal Block" data-label="Pixel 10a" data-dimension48="Pixel 10a" data-dimension25="$524" href="https://www.amazon.com/dp/B0GHRHXVN1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1243px;"><p class="vanilla-image-block" style="padding-top:120.68%;"><img id="HeYsLX4yTgWGZz9Yq5NJFM" name="Pixel 10a deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HeYsLX4yTgWGZz9Yq5NJFM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1243" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10a-review" data-dimension112="c3f4e8b4-c2f8-11f1-879c-7bfb4a3ee07b" data-action="Deal Block" data-label="Pixel 10a" data-dimension48="Pixel 10a" data-dimension25="$524">Pixel 10a </a>may not have been the most impressive upgrade, even by Google standards, but it offers a lot. Good battery life and camera performance, a flush design with no camera bump and a bunch of the best AI features Google has to offer. It's not as cheap as the pre-price hike cost, but it's still a nice discount.<a class="view-deal button" href="https://www.amazon.com/dp/B0GHRHXVN1" target="_blank" rel="nofollow" data-dimension112="c3f4e8b4-c2f8-11f1-879c-7bfb4a3ee07b" data-action="Deal Block" data-label="Pixel 10a" data-dimension48="Pixel 10a" data-dimension25="$524">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4e918-c2f8-11f1-ade2-2b35e122374c" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$574" href="https://www.amazon.com/dp/B0H7SLXZPB" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1055px;"><p class="vanilla-image-block" style="padding-top:121.14%;"><img id="3P6jH9V8UzMwnSzb52ADW3" name="Galaxy S26 FE" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3P6jH9V8UzMwnSzb52ADW3-1920-80.png" mos="" align="middle" fullscreen="" width="1055" height="1278" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The low-cost flagship <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-fe-review-the-perfect-cure-for-samsungs-recent-price-hike-frenzy" data-dimension112="c3f4e918-c2f8-11f1-ade2-2b35e122374c" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$574">Samsung Galaxy S26 FE</a> is enticing because that even-lower Prime Day price is hanging around for a little while longer. It's not as good as the Galaxy S26, but you still get good cameras and battery life, as well as a premium design and the all-important telephoto lens — something a lot of cheap phones tend to skip.<a class="view-deal button" href="https://www.amazon.com/dp/B0H7SLXZPB" target="_blank" rel="nofollow" data-dimension112="c3f4e918-c2f8-11f1-ade2-2b35e122374c" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$574">View Deal</a></p></div><div class="product"><a data-dimension112="d5f3eb94-c2fa-11f1-9370-fd2f49a0a980" data-action="Deal Block" data-label="Pixel 10" data-dimension48="Pixel 10" data-dimension25="$649" href="https://www.amazon.com/Google-Pixel-Smartphone-Assistant-Fast-Charging/dp/B0FFTRPM4K" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="bpTaV2HQDC8Bt3dMMYCbnS" name="61OyKi98IuL._AC_SL1500_ copy" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bpTaV2HQDC8Bt3dMMYCbnS-1920-80.jpg" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The difference between the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-review" data-dimension112="d5f3eb94-c2fa-11f1-9370-fd2f49a0a980" data-action="Deal Block" data-label="Pixel 10" data-dimension48="Pixel 10" data-dimension25="$649">Pixel 10</a> and Pixel 11 isn't that extreme, not where hardware is concerned anyway. Actual performance and daily usage is pretty similar, and that means you could get a comparable experience for a much lower price tag — $150 less than the Pixel 11's sale price.<a class="view-deal button" href="https://www.amazon.com/Google-Pixel-Smartphone-Assistant-Fast-Charging/dp/B0FFTRPM4K" target="_blank" rel="nofollow" data-dimension112="d5f3eb94-c2fa-11f1-9370-fd2f49a0a980" data-action="Deal Block" data-label="Pixel 10" data-dimension48="Pixel 10" data-dimension25="$649">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4e986-c2f8-11f1-b8e5-b9490c6c219e" data-action="Deal Block" data-label="Pixel 11" data-dimension48="Pixel 11" data-dimension25="$799" href="https://www.amazon.com/Google-Pixel-11-Unlocked-Smartphone/dp/B0H836MLYT?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1252px;"><p class="vanilla-image-block" style="padding-top:119.81%;"><img id="HU5623EmmcxWKvimncgZqE" name="Pixel 11 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HU5623EmmcxWKvimncgZqE-1920-80.jpg" mos="" align="middle" fullscreen="" width="1252" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you do want the latest and best Pixel, the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-review" data-dimension112="c3f4e986-c2f8-11f1-b8e5-b9490c6c219e" data-action="Deal Block" data-label="Pixel 11" data-dimension48="Pixel 11" data-dimension25="$799">Pixel 11</a> can still be purchased for less than its retail price. Google hiked prices this year, so you're not saving a whole lot, but this device is now the same price as a Pixel 10 would have cost you last year. With it you get a triple-lens camera, the latest and best Google AI features like Magic Capture and almost-instant access to new Android updates as they release.<a class="view-deal button" href="https://www.amazon.com/Google-Pixel-11-Unlocked-Smartphone/dp/B0H836MLYT?th=1" target="_blank" rel="nofollow" data-dimension112="c3f4e986-c2f8-11f1-b8e5-b9490c6c219e" data-action="Deal Block" data-label="Pixel 11" data-dimension48="Pixel 11" data-dimension25="$799">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4e9f4-c2f8-11f1-8f73-9947d938b32a" data-action="Deal Block" data-label="Pixel 11 Pro" data-dimension48="Pixel 11 Pro" data-dimension25="$849" href="https://www.amazon.com/dp/B0H832JH4Z" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1239px;"><p class="vanilla-image-block" style="padding-top:121.07%;"><img id="FrEQh6QFhVjxEGTiUafDmn" name="Pixel 11 Pro deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FrEQh6QFhVjxEGTiUafDmn-1920-80.jpg" mos="" align="middle" fullscreen="" width="1239" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you want a little more out of your Pixel, including the HiLight notification light, then the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-pro-xl-review" data-dimension112="c3f4e9f4-c2f8-11f1-8f73-9947d938b32a" data-action="Deal Block" data-label="Pixel 11 Pro" data-dimension48="Pixel 11 Pro" data-dimension25="$849">Pixel 11 Pro or Pro XL</a> might be your best option. It also features brighter displays, 256GB of storage as standard and some welcome improvements to the camera.</p><p>If you want a larger screen and better battery life, the <a href="https://www.amazon.com/dp/B0H8387SYN?th=1" target="_blank" rel="nofollow">Pixel 11 Pro XL is also on sale for $999</a> — down from $1,299.<a class="view-deal button" href="https://www.amazon.com/dp/B0H832JH4Z" target="_blank" rel="nofollow" data-dimension112="c3f4e9f4-c2f8-11f1-8f73-9947d938b32a" data-action="Deal Block" data-label="Pixel 11 Pro" data-dimension48="Pixel 11 Pro" data-dimension25="$849">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4ea58-c2f8-11f1-b46b-336daec8d6f9" data-action="Deal Block" data-label="iPhone Air" data-dimension48="iPhone Air" data-dimension25="$839" href="https://www.bestbuy.com/product/apple-iphone-air-256gb-unlocked-sky-blue/JJGCQLRKGJ" 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="dm4kNuPysTLWPR7Yz6XnsB" name="iphone-air-bb" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dm4kNuPysTLWPR7Yz6XnsB-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review" data-dimension112="c3f4ea58-c2f8-11f1-b46b-336daec8d6f9" data-action="Deal Block" data-label="iPhone Air" data-dimension48="iPhone Air" data-dimension25="$839">iPhone Air </a>is all about style over substance, but that doesn't mean it's a bad phone. Not only is it the thinnest and lightest iPhone ever made, it's also absurdly durable, to the point where you wouldn't believe it unless you saw it. On top of that you get solid A19 performance, reasonable battery life, good quality photos from the solo camera and a a great screen.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-iphone-air-256gb-unlocked-sky-blue/JJGCQLRKGJ" target="_blank" rel="nofollow" data-dimension112="c3f4ea58-c2f8-11f1-b46b-336daec8d6f9" data-action="Deal Block" data-label="iPhone Air" data-dimension48="iPhone Air" data-dimension25="$839">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4eb20-c2f8-11f1-970e-9bbdedb04018" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$824" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Processor-Immersive/dp/B0G4SW96R4" 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="82idHUPd6dizKAJwshQ8mk" name="Galaxy S26 (256GB) 'Cobalt Violet'" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/82idHUPd6dizKAJwshQ8mk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Samsung recently hiked the prices of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review" data-dimension112="c3f4eb20-c2f8-11f1-970e-9bbdedb04018" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$824">Galaxy S26</a>, but Prime Day deals brought the price well below the new $999 price tag. The price may not be as cheap as it was earlier in the week, but it's still less than you would have paid at the start of the year. Which is great, considering Samsung makes some of the best Android phones around.<a class="view-deal button" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Processor-Immersive/dp/B0G4SW96R4" target="_blank" rel="nofollow" data-dimension112="c3f4eb20-c2f8-11f1-970e-9bbdedb04018" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$824">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4eb8e-c2f8-11f1-bd2f-4d3bd4a9711c" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$949" href="https://www.amazon.com/dp/B0G4SWDH8P" 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>If the regular S26 isn't enough for you, then the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review" data-dimension112="c3f4eb8e-c2f8-11f1-bd2f-4d3bd4a9711c" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$949">Galaxy S26 Ultra</a> is still at its Prime Day price — saving you a whopping $450 off the newly hiked price tag. For that you get S Pen support, a larger screen, an extra telephoto camera, and all the Galaxy AI features you can ask for.<a class="view-deal button" href="https://www.amazon.com/dp/B0G4SWDH8P" target="_blank" rel="nofollow" data-dimension112="c3f4eb8e-c2f8-11f1-bd2f-4d3bd4a9711c" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$949">View Deal</a></p></div><div class="product"><a data-dimension112="d5f3ec48-c2fa-11f1-8649-ab28508b60fd" data-action="Deal Block" data-label="iPhone 18 Pro" data-dimension48="iPhone 18 Pro" data-dimension25="$1099" href="https://www.walmart.com/ip/Straight-Talk-Apple-iPhone-5G-256GB-Black-Includes-120-Unlimited-Airtime-90-Days-Prepaid-Smartphone-Locked-to-Straight-Talk/20994173854" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:573px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="3s5RsfeNFKZJaUA5jMMin8" name="iPhone 18 Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3s5RsfeNFKZJaUA5jMMin8-1920-80.png" mos="" align="middle" fullscreen="" width="573" height="573" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The<a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-and-pro-max-review" data-dimension112="d5f3ec48-c2fa-11f1-8649-ab28508b60fd" data-action="Deal Block" data-label="iPhone 18 Pro" data-dimension48="iPhone 18 Pro" data-dimension25="$1099"> iPhone 18 Pro </a>may be brand new, but you can get a discount at Walmart — with the caveat that this device is locked to Walmart's MVNO Straight Talk. this new phone comes with better battery life, the all-powerful A20 Pro chipset, a variable aperture camera lens, and the best Apple Intelligence features Apple has to offer.<a class="view-deal button" href="https://www.walmart.com/ip/Straight-Talk-Apple-iPhone-5G-256GB-Black-Includes-120-Unlimited-Airtime-90-Days-Prepaid-Smartphone-Locked-to-Straight-Talk/20994173854" target="_blank" rel="nofollow" data-dimension112="d5f3ec48-c2fa-11f1-8649-ab28508b60fd" data-action="Deal Block" data-label="iPhone 18 Pro" data-dimension48="iPhone 18 Pro" data-dimension25="$1099">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4ebf2-c2f8-11f1-93cb-6903c44a0616" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Android-Smartphone/dp/B0H12M2TY4" 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>The iPhone Duo may be coming very soon, but Samsung isn't going to let it win without a fight. The passport-shaped<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win" data-dimension112="c3f4ebf2-c2f8-11f1-93cb-6903c44a0616" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549"> Galaxy Z Fold 8</a> is now $350 off after Prime Day, which makes it $450 cheaper than Apple's first foldable — and you get the same comfortable design and a similar creaseless screen to go with it.<a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Android-Smartphone/dp/B0H12M2TY4" target="_blank" rel="nofollow" data-dimension112="c3f4ebf2-c2f8-11f1-93cb-6903c44a0616" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549">View Deal</a></p></div><div class="product"><a data-dimension112="c3f4ec60-c2f8-11f1-a1ba-09af498a5836" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699" href="https://www.amazon.com/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>If you want the best possible foldable, then the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review" data-dimension112="c3f4ec60-c2f8-11f1-a1ba-09af498a5836" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699">Galaxy Z Fold 8 Ultra</a> might be the one for you — especially with its Prime Day price sticking around. With a larger foldable screen, telephoto camera lens and incredible performance, all for $300 less than an iPhone Duo will cost.<a class="view-deal button" href="https://www.amazon.com/dp/B0H12DXK8J" target="_blank" rel="nofollow" data-dimension112="c3f4ec60-c2f8-11f1-a1ba-09af498a5836" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 17 Prime Day phone deals to help you beat the price hikes — Galaxy S26, iPhone Air, Pixel 11, Galaxy Z Fold 8 and more ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Smartphones are expensive purchases, prohibitively expensive in the case of some ultra premium models. To make matters worse, the prices keep going up, sometimes with no warning, and makes even the most basic devices feel less affordable than ever. Thankfully, the big sales events are stepping in to help out.</p><p><a href="https://www.tomsguide.com/live/news/october-prime-day-value-deals-best-picks-2026">Amazon's Prime Day</a> sales are now live, as are rival sales at other retailers. This means a bunch of phones have been discounted — including phones that recently suffered big price hikes, like the Samsung Galaxy S26 and Pixel 10a. In some cases the phones are actually cheaper than they were before the price hike, which makes shopping now a great way to pick up that new phone without feeling like you overpaid.</p><p>Here are the best price hike-beating phone deals we've seen at Amazon and other retailers.</p><div class="product"><a data-dimension112="49715d96-c17e-11f1-9560-d97aab5d1969" data-action="Deal Block" data-label="Galaxy A57" data-dimension48="Galaxy A57" data-dimension25="$399" href="https://www.amazon.com/Samsung-Unlocked-Android-Smartphone-Warranty/dp/B0GW9TVHJB" 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="RMbad6Nr8mEHoYfsXTBHye" name="Galaxy A57 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/RMbad6Nr8mEHoYfsXTBHye-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>There's no denying that the mid-range <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-a57-review" data-dimension112="49715d96-c17e-11f1-9560-d97aab5d1969" data-action="Deal Block" data-label="Galaxy A57" data-dimension48="Galaxy A57" data-dimension25="$399">Samsung Galaxy A57</a> is one of the best cheap phones you can buy — with good cameras, solid battery life, helpful AI features and a durable design. Now, with $200 off the regular price, this is an unbeatably good value for the money.<a class="view-deal button" href="https://www.amazon.com/Samsung-Unlocked-Android-Smartphone-Warranty/dp/B0GW9TVHJB" target="_blank" rel="nofollow" data-dimension112="49715d96-c17e-11f1-9560-d97aab5d1969" data-action="Deal Block" data-label="Galaxy A57" data-dimension48="Galaxy A57" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="2a646a94-c181-11f1-82b1-edc12bd7f149" data-action="Deal Block" data-label="iPhone 16e" data-dimension48="iPhone 16e" data-dimension25="$489" href="https://www.bestbuy.com/product/apple-iphone-16e-128gb-apple-intelligence-unlocked-white/JJGCQG2GTF" 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="6XDDGA8kCSFrs9m2vXphbQ" name="iphone16e-bb" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6XDDGA8kCSFrs9m2vXphbQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>It's rare to see iPhones get any kind of meaningful discounts, but Best Buy has just knocked $110 off the cost of the <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-16e-review" data-dimension112="2a646a94-c181-11f1-82b1-edc12bd7f149" data-action="Deal Block" data-label="iPhone 16e" data-dimension48="iPhone 16e" data-dimension25="$489">iPhone 16e</a>. It's not as powerful as the 17e, and doesn't include MagSafe, but it does offer most Apple Intelligence features (including Siri AI). You also get solid battery life, a good solo camera and Apple's trademark Face ID feature.</p><p>It's not the lowest price we've seen, but it is one of the cheapest ways to get an iPhone right now.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-iphone-16e-128gb-apple-intelligence-unlocked-white/JJGCQG2GTF" target="_blank" rel="nofollow" data-dimension112="2a646a94-c181-11f1-82b1-edc12bd7f149" data-action="Deal Block" data-label="iPhone 16e" data-dimension48="iPhone 16e" data-dimension25="$489">View Deal</a></p></div><div class="product"><a data-dimension112="16836342-c18e-11f1-a396-03ff0c160a74" data-action="Deal Block" data-label="Phone 4a Pro" data-dimension48="Phone 4a Pro" data-dimension25="$419" href="https://www.bestbuy.com/product/nothing-phone-4a-pro-128gb-unlocked-silver/CZTTGJQQJ2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="D7yfN6qubYsNKDFyhBH2e8" name="Phone-4a-Pro-White" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/D7yfN6qubYsNKDFyhBH2e8-1920-80.webp" mos="" align="middle" fullscreen="" width="2048" height="2048" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This may not be a huge discount compared to others on this list, but it's still worth checking out. The Nothing Phone 4a Pro is an excellent budget phone, with great battery life, a unique design, good camera quality and a bunch of cool AI features. Plus, there's a Dot Matrix Glyph Display that can be customized to your liking.<a class="view-deal button" href="https://www.bestbuy.com/product/nothing-phone-4a-pro-128gb-unlocked-silver/CZTTGJQQJ2" target="_blank" rel="nofollow" data-dimension112="16836342-c18e-11f1-a396-03ff0c160a74" data-action="Deal Block" data-label="Phone 4a Pro" data-dimension48="Phone 4a Pro" data-dimension25="$419">View Deal</a></p></div><div class="product"><a data-dimension112="168363ce-c18e-11f1-8ad0-79052ce6e428" data-action="Deal Block" data-label="Pixel 10a" data-dimension48="Pixel 10a" data-dimension25="$524" href="https://www.amazon.com/dp/B0GHRHXVN1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1243px;"><p class="vanilla-image-block" style="padding-top:120.68%;"><img id="HeYsLX4yTgWGZz9Yq5NJFM" name="Pixel 10a deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HeYsLX4yTgWGZz9Yq5NJFM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1243" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10a-review" data-dimension112="168363ce-c18e-11f1-8ad0-79052ce6e428" data-action="Deal Block" data-label="Pixel 10a" data-dimension48="Pixel 10a" data-dimension25="$524">Pixel 10a</a> is one of the latest phones to suffer a mid-life price hike, rising from $499 to $599 in recent weeks. Obviously, a $524 price doesn't quite make up for that, but saving that extra $75 is still important. </p><p>This phone offers great AI features, longer battery life and faster charging speed than previous A-series Pixels, and a flush rear design that doesn't feature any kind of camera bump.<a class="view-deal button" href="https://www.amazon.com/dp/B0GHRHXVN1" target="_blank" rel="nofollow" data-dimension112="168363ce-c18e-11f1-8ad0-79052ce6e428" data-action="Deal Block" data-label="Pixel 10a" data-dimension48="Pixel 10a" data-dimension25="$524">View Deal</a></p></div><div class="product"><a data-dimension112="a9d90098-c18e-11f1-a190-73f6322a39f3" data-action="Deal Block" data-label="Gen 6+" data-dimension48="Gen 6+" data-dimension25="$552" href="https://www.amazon.com/dp/B0H9M1V2BK" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1203px;"><p class="vanilla-image-block" style="padding-top:124.69%;"><img id="Rz84Qi5jdQFDSJGJ5mPHfX" name="Gen 6+" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Rz84Qi5jdQFDSJGJ5mPHfX-1920-80.png" mos="" align="middle" fullscreen="" width="1203" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0H9M1V2BK" target="_blank" rel="nofollow" data-dimension112="a9d90098-c18e-11f1-a190-73f6322a39f3" data-action="Deal Block" data-label="Gen 6+" data-dimension48="Gen 6+" data-dimension25="$552">Gen 6+: was $649 now $552</a></strong><br>Fairphones are not known for having the best hardware or high-end AI features. Instead they focus on offering a phone that is going to last, with easy repairability, long-lasting software support, long battery life and everything both Android and Gemini have to offer.<a class="view-deal button" href="https://www.amazon.com/dp/B0H9M1V2BK" target="_blank" rel="nofollow" data-dimension112="a9d90098-c18e-11f1-a190-73f6322a39f3" data-action="Deal Block" data-label="Gen 6+" data-dimension48="Gen 6+" data-dimension25="$552">View Deal</a></p></div><div class="product"><a data-dimension112="1a6b6d86-c190-11f1-8da5-851eca475194" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$574" href="https://www.amazon.com/dp/B0H7SLXZPB" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1055px;"><p class="vanilla-image-block" style="padding-top:121.14%;"><img id="3P6jH9V8UzMwnSzb52ADW3" name="Galaxy S26 FE" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3P6jH9V8UzMwnSzb52ADW3-1920-80.png" mos="" align="middle" fullscreen="" width="1055" height="1278" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Galaxy S26 FE was $50 more expensive than the S25 FE that arrived last year — but Prime Day knocked the price much lower than that. For $574, you get a phone with solid battery life, good cameras, a nice premium design and all the hallmarks of a Samsung flagship. It isn't quite as good as a Galaxy S26, but it is still a lot cheaper — and that's what counts.<a class="view-deal button" href="https://www.amazon.com/dp/B0H7SLXZPB" target="_blank" rel="nofollow" data-dimension112="1a6b6d86-c190-11f1-8da5-851eca475194" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$574">View Deal</a></p></div><div class="product"><a data-dimension112="1a6b6dfe-c190-11f1-a19a-530cdad218bd" data-action="Deal Block" data-label="Pixel 11" data-dimension48="Pixel 11" data-dimension25="$749" href="https://www.amazon.com/Google-Pixel-11-Unlocked-Smartphone/dp/B0H836MLYT?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1252px;"><p class="vanilla-image-block" style="padding-top:119.81%;"><img id="HU5623EmmcxWKvimncgZqE" name="Pixel 11 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HU5623EmmcxWKvimncgZqE-1920-80.jpg" mos="" align="middle" fullscreen="" width="1252" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Google loves hiking up the cost of new Pixel phones each year, and the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-review" data-dimension112="1a6b6dfe-c190-11f1-a19a-530cdad218bd" data-action="Deal Block" data-label="Pixel 11" data-dimension48="Pixel 11" data-dimension25="$749">Pixel 11 </a>was no exception. Thankfully, Pixels are quick to go on sale, and you can already save $150 thanks to Prime Day. The Pixel 11 isn't the biggest upgrade, but it still offers a super-bright OLED display, helpful new Gemini features and handy AI camera tools.<a class="view-deal button" href="https://www.amazon.com/Google-Pixel-11-Unlocked-Smartphone/dp/B0H836MLYT?th=1" target="_blank" rel="nofollow" data-dimension112="1a6b6dfe-c190-11f1-a19a-530cdad218bd" data-action="Deal Block" data-label="Pixel 11" data-dimension48="Pixel 11" data-dimension25="$749">View Deal</a></p></div><div class="product"><a data-dimension112="d1effaa6-c192-11f1-926e-71635837f7a5" data-action="Deal Block" data-label="Pixel 11 Pro" data-dimension48="Pixel 11 Pro" data-dimension25="$849" href="https://www.amazon.com/dp/B0H832JH4Z" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1239px;"><p class="vanilla-image-block" style="padding-top:121.07%;"><img id="FrEQh6QFhVjxEGTiUafDmn" name="Pixel 11 Pro deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FrEQh6QFhVjxEGTiUafDmn-1920-80.jpg" mos="" align="middle" fullscreen="" width="1239" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Bringing the cost of a <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-pro-xl-review" data-dimension112="d1effaa6-c192-11f1-926e-71635837f7a5" data-action="Deal Block" data-label="Pixel 11 Pro" data-dimension48="Pixel 11 Pro" data-dimension25="$849">Pixel 11 Pro</a> down to below $1,000 makes the upgrade seem a lot more palatable — especially since Pixel 10 Pros are now much harder to come by. Like the Pixel 11, the Pro comes with a bunch more great AI features, improved cameras and a brighter display — not to mention there's a new HiLight notification light on the back.<a class="view-deal button" href="https://www.amazon.com/dp/B0H832JH4Z" target="_blank" rel="nofollow" data-dimension112="d1effaa6-c192-11f1-926e-71635837f7a5" data-action="Deal Block" data-label="Pixel 11 Pro" data-dimension48="Pixel 11 Pro" data-dimension25="$849">View Deal</a></p></div><div class="product"><a data-dimension112="d1effb3c-c192-11f1-87d6-91c22645e21d" data-action="Deal Block" data-label="iPhone Air" data-dimension48="iPhone Air" data-dimension25="$839" href="https://www.bestbuy.com/product/apple-iphone-air-256gb-unlocked-sky-blue/JJGCQLRKGJ" 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="dm4kNuPysTLWPR7Yz6XnsB" name="iphone-air-bb" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dm4kNuPysTLWPR7Yz6XnsB-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Apple's thinnest and most durable phone is $260 off for Prime Day. The <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review" data-dimension112="d1effb3c-c192-11f1-87d6-91c22645e21d" data-action="Deal Block" data-label="iPhone Air" data-dimension48="iPhone Air" data-dimension25="$839">iPhone Air</a> offers a big, bright display, with a speedy A19 Pro chipset, good camera quality and solid battery life. It's not as powerful and capable as the iPhone 18 Pro, nor does it have the benefits of extra camera lenses, but it still offers a great Apple experience in a much more portable package.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-iphone-air-256gb-unlocked-sky-blue/JJGCQLRKGJ" target="_blank" rel="nofollow" data-dimension112="d1effb3c-c192-11f1-87d6-91c22645e21d" data-action="Deal Block" data-label="iPhone Air" data-dimension48="iPhone Air" data-dimension25="$839">View Deal</a></p></div><div class="product"><a data-dimension112="d1effbaa-c192-11f1-88e7-4b1ece85ba48" data-action="Deal Block" data-label="Pixel 11 Pro XL" data-dimension48="Pixel 11 Pro XL" data-dimension25="$999" href="https://www.amazon.com/dp/B0H8387SYN?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1240px;"><p class="vanilla-image-block" style="padding-top:120.97%;"><img id="K5nrHXfiC8uPkaw7PTsEy7" name="Pixel 11 Pro XL deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/K5nrHXfiC8uPkaw7PTsEy7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1240" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-pro-xl-review" data-dimension112="d1effbaa-c192-11f1-88e7-4b1ece85ba48" data-action="Deal Block" data-label="Pixel 11 Pro XL" data-dimension48="Pixel 11 Pro XL" data-dimension25="$999">Pixel 11 Pro XL</a> is just like the Pixel 11 Pro, just with a bigger 6.8-inch display and better battery life. It has the same camera upgrades, additional AI tools and the HiLight notification alert on the back.<a class="view-deal button" href="https://www.amazon.com/dp/B0H8387SYN?" target="_blank" rel="nofollow" data-dimension112="d1effbaa-c192-11f1-88e7-4b1ece85ba48" data-action="Deal Block" data-label="Pixel 11 Pro XL" data-dimension48="Pixel 11 Pro XL" data-dimension25="$999">View Deal</a></p></div><div class="product"><a data-dimension112="24140e24-c195-11f1-863f-d355f8de7ca8" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$724" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Processor-Immersive/dp/B0G4SW96R4" 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="82idHUPd6dizKAJwshQ8mk" name="Galaxy S26 (256GB) 'Cobalt Violet'" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/82idHUPd6dizKAJwshQ8mk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Not content with hiking the price of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review" data-dimension112="24140e24-c195-11f1-863f-d355f8de7ca8" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$724">Galaxy S26 </a>at launch, making it $100 more than the S25, Samsung did it again earlier this month, A standard 256GB S26 will now cost you $999, unless you buy it on sale. </p><p>This phone has a larger and brighter display than its predecessors, alongside excellent performance, agentic AI tools as well as classic Samsung benefits like good battery and strong camera performance.<a class="view-deal button" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Processor-Immersive/dp/B0G4SW96R4" target="_blank" rel="nofollow" data-dimension112="24140e24-c195-11f1-863f-d355f8de7ca8" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$724">View Deal</a></p></div><div class="product"><a data-dimension112="24140ea6-c195-11f1-be33-7d6203aabfc1" data-action="Deal Block" data-label="Galaxy S26+" data-dimension48="Galaxy S26+" data-dimension25="$824" href="https://www.amazon.com/dp/B0G4SWQC2Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1192px;"><p class="vanilla-image-block" style="padding-top:123.07%;"><img id="nLnALydHBLsMiQiAEDTrQk" name="Galaxy S26 Plus deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/nLnALydHBLsMiQiAEDTrQk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1192" height="1467" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>While not as advanced as the Ultra, the Samsung Galaxy S26+ is still a great option if you want a little more screen space. It has new AI features with agentic capabilities, an excellent display and performance that few phones can match.<a class="view-deal button" href="https://www.amazon.com/dp/B0G4SWQC2Q" target="_blank" rel="nofollow" data-dimension112="24140ea6-c195-11f1-be33-7d6203aabfc1" data-action="Deal Block" data-label="Galaxy S26+" data-dimension48="Galaxy S26+" data-dimension25="$824">View Deal</a></p></div><div class="product"><a data-dimension112="24140f64-c195-11f1-b1c3-73d860fd2068" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$979" href="https://www.amazon.com/dp/B0G4SWDH8P" 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>If you want the most advanced Samsung experience, then the<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review" data-dimension112="24140f64-c195-11f1-b1c3-73d860fd2068" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$979"> Samsung Galaxy S26 Ultra</a> is the phone for you — and it's now over $300 off in the Prime Day sale. It has a large brighter display and agentic AI, just like the rest of the Galaxy S26 series. There are also more Ultra offerings like a built-in S Pen, 200MP main camera, secondary telephoto lens and more. All for under a thousand dollars.<a class="view-deal button" href="https://www.amazon.com/dp/B0G4SWDH8P" target="_blank" rel="nofollow" data-dimension112="24140f64-c195-11f1-b1c3-73d860fd2068" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$979">View Deal</a></p></div><div class="product"><a data-dimension112="b93e0d0a-c196-11f1-9415-09d7a55d485a" data-action="Deal Block" data-label="Razr Ultra (2026)" data-dimension48="Razr Ultra (2026)" data-dimension25="$1399" href="https://www.amazon.com/Motorola-Unlocked-Camera-Pantone-Orient/dp/B0GSH2N9P7" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1329px;"><p class="vanilla-image-block" style="padding-top:90.22%;"><img id="3SrKX7Sqj36oUdiwjwsTiW" name="Razr Ultra (2026)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3SrKX7Sqj36oUdiwjwsTiW-1920-80.png" mos="" align="middle" fullscreen="" width="1329" height="1199" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Motorola-Unlocked-Camera-Pantone-Orient/dp/B0GSH2N9P7" target="_blank" rel="nofollow" data-dimension112="b93e0d0a-c196-11f1-9415-09d7a55d485a" data-action="Deal Block" data-label="Razr Ultra (2026)" data-dimension48="Razr Ultra (2026)" data-dimension25="$1399">Razr Ultra (2026): was $1499 now $1399</a></strong><br>Samsung may be neglecting its flip phones, but Motorola certainly isn't. The <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-ultra-2026-review">Motorola Razr 2026</a> offers class-leading battery life, a premium build, excellent camera quality and a brighter screen than you'd expect. The downside is that the price went up by a lot this year, which is why deals like this are so important. It's still not quite as cheap as the Razr Ultra 2025 ($1,299 at launch), but $100 is still $100.<a class="view-deal button" href="https://www.amazon.com/Motorola-Unlocked-Camera-Pantone-Orient/dp/B0GSH2N9P7" target="_blank" rel="nofollow" data-dimension112="b93e0d0a-c196-11f1-9415-09d7a55d485a" data-action="Deal Block" data-label="Razr Ultra (2026)" data-dimension48="Razr Ultra (2026)" data-dimension25="$1399">View Deal</a></p></div><div class="product"><a data-dimension112="31e664c6-c199-11f1-b9ce-39f8266c4778" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Android-Smartphone/dp/B0H12M2TY4" 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>The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win" data-dimension112="31e664c6-c199-11f1-b9ce-39f8266c4778" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549">Galaxy Z Fold 8</a> is the closest thing Samsung has to an iPhone Duo, with a comfortable wide design that fits neatly into your hands. You only get two cameras, but Samsung has packed this thing with AI and has made a valiant effort to make the display crease almost invisible.<a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Android-Smartphone/dp/B0H12M2TY4" target="_blank" rel="nofollow" data-dimension112="31e664c6-c199-11f1-b9ce-39f8266c4778" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549">View Deal</a></p></div><div class="product"><a data-dimension112="70fa1d98-c198-11f1-b75f-d324a922b3c4" data-action="Deal Block" data-label="Razr Fold" data-dimension48="Razr Fold" data-dimension25="$1699" href="https://www.bestbuy.com/product/motorola-razr-fold-2026-512gb-unlocked-pantone-blackened-blue/J39TH6H2H3" 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="hNXqrRp93gLPxbrLLxXBeh" name="Motorola Razr Fold deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hNXqrRp93gLPxbrLLxXBeh-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If flip phones aren't your jam, then Motorola also has the Razr Fold — its first book-style foldable device. Not only do you get a larger screen, you also get considerably longer battery than a flip phone can ever hope for. Almost <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" data-dimension112="70fa1d98-c198-11f1-b75f-d324a922b3c4" data-action="Deal Block" data-label="Razr Fold" data-dimension48="Razr Fold" data-dimension25="$1699">15 hours in our testing,</a> which is on par with the Galaxy Z Fold 8 Ultra. You also get AI-enhanced camera zoom, a rugged and durable design, fast charging and great camera performance.<a class="view-deal button" href="https://www.bestbuy.com/product/motorola-razr-fold-2026-512gb-unlocked-pantone-blackened-blue/J39TH6H2H3" target="_blank" rel="nofollow" data-dimension112="70fa1d98-c198-11f1-b75f-d324a922b3c4" data-action="Deal Block" data-label="Razr Fold" data-dimension48="Razr Fold" data-dimension25="$1699">View Deal</a></p></div><div class="product"><a data-dimension112="31e66552-c199-11f1-b9a2-dd44bcb8e79a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699" href="https://www.amazon.com/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>Offering a larger screen than the Z Fold 8, alongside an extra camera and additional software features, the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review" data-dimension112="31e66552-c199-11f1-b9a2-dd44bcb8e79a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699">Samsung Galaxy Z Fold 8 Ultra</a> is the pinnacle of Samsung's foldable experience so far. It is normally very expensive, but thanks to Prime Day that price is now $400 less than you'd normally have to pay.<a class="view-deal button" href="https://www.amazon.com/dp/B0H12DXK8J" target="_blank" rel="nofollow" data-dimension112="31e66552-c199-11f1-b9a2-dd44bcb8e79a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699">View Deal</a></p></div><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><ul><li><strong></strong><a href="https://www.amazon.com/primebigdealdays?" target="_blank" rel="nofollow"><strong>See all deals in the Prime Day sale</strong></a><strong></strong></li><li><strong></strong><a href="https://www.amazon.com/amazonprime" target="_blank" rel="nofollow"><strong>Sign up for Amazon Prime</strong></a><strong></strong></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&brands=Amazon&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(item.merchant_name || item.merchant || item.retailer || 'Retailer'),            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/17-prime-day-phone-deals-to-help-you-beat-the-price-hikes-galaxy-s26-iphone-air-pixel-11-galaxy-z-fold-8-and-more</link>
                                                                            <description>
                            <![CDATA[ Phone prices keep going up, and that means the generous discounts offered by Prime Day sales are more important than ever. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">thAGgMafHd9BpCCHi9nx5F</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DzEZYK8AGTLuDqspdXMbbC-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 06 Oct 2026 15:59:32 +0000</pubDate>                                                                                                                                <updated>Tue, 06 Oct 2026 16:05:33 +0000</updated>
                                                                                                                                            <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-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/DzEZYK8AGTLuDqspdXMbbC-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[samsung galaxy s26 ultra prime day deal]]></media:description>                                                            <media:text><![CDATA[samsung galaxy s26 ultra prime day deal]]></media:text>
                                <media:title type="plain"><![CDATA[samsung galaxy s26 ultra prime day deal]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DzEZYK8AGTLuDqspdXMbbC-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Smartphones are expensive purchases, prohibitively expensive in the case of some ultra premium models. To make matters worse, the prices keep going up, sometimes with no warning, and makes even the most basic devices feel less affordable than ever. Thankfully, the big sales events are stepping in to help out.</p><p><a href="https://www.tomsguide.com/live/news/october-prime-day-value-deals-best-picks-2026">Amazon's Prime Day</a> sales are now live, as are rival sales at other retailers. This means a bunch of phones have been discounted — including phones that recently suffered big price hikes, like the Samsung Galaxy S26 and Pixel 10a. In some cases the phones are actually cheaper than they were before the price hike, which makes shopping now a great way to pick up that new phone without feeling like you overpaid.</p><p>Here are the best price hike-beating phone deals we've seen at Amazon and other retailers.</p><div class="product"><a data-dimension112="49715d96-c17e-11f1-9560-d97aab5d1969" data-action="Deal Block" data-label="Galaxy A57" data-dimension48="Galaxy A57" data-dimension25="$399" href="https://www.amazon.com/Samsung-Unlocked-Android-Smartphone-Warranty/dp/B0GW9TVHJB" 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="RMbad6Nr8mEHoYfsXTBHye" name="Galaxy A57 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/RMbad6Nr8mEHoYfsXTBHye-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>There's no denying that the mid-range <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-a57-review" data-dimension112="49715d96-c17e-11f1-9560-d97aab5d1969" data-action="Deal Block" data-label="Galaxy A57" data-dimension48="Galaxy A57" data-dimension25="$399">Samsung Galaxy A57</a> is one of the best cheap phones you can buy — with good cameras, solid battery life, helpful AI features and a durable design. Now, with $200 off the regular price, this is an unbeatably good value for the money.<a class="view-deal button" href="https://www.amazon.com/Samsung-Unlocked-Android-Smartphone-Warranty/dp/B0GW9TVHJB" target="_blank" rel="nofollow" data-dimension112="49715d96-c17e-11f1-9560-d97aab5d1969" data-action="Deal Block" data-label="Galaxy A57" data-dimension48="Galaxy A57" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="2a646a94-c181-11f1-82b1-edc12bd7f149" data-action="Deal Block" data-label="iPhone 16e" data-dimension48="iPhone 16e" data-dimension25="$489" href="https://www.bestbuy.com/product/apple-iphone-16e-128gb-apple-intelligence-unlocked-white/JJGCQG2GTF" 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="6XDDGA8kCSFrs9m2vXphbQ" name="iphone16e-bb" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6XDDGA8kCSFrs9m2vXphbQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>It's rare to see iPhones get any kind of meaningful discounts, but Best Buy has just knocked $110 off the cost of the <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-16e-review" data-dimension112="2a646a94-c181-11f1-82b1-edc12bd7f149" data-action="Deal Block" data-label="iPhone 16e" data-dimension48="iPhone 16e" data-dimension25="$489">iPhone 16e</a>. It's not as powerful as the 17e, and doesn't include MagSafe, but it does offer most Apple Intelligence features (including Siri AI). You also get solid battery life, a good solo camera and Apple's trademark Face ID feature.</p><p>It's not the lowest price we've seen, but it is one of the cheapest ways to get an iPhone right now.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-iphone-16e-128gb-apple-intelligence-unlocked-white/JJGCQG2GTF" target="_blank" rel="nofollow" data-dimension112="2a646a94-c181-11f1-82b1-edc12bd7f149" data-action="Deal Block" data-label="iPhone 16e" data-dimension48="iPhone 16e" data-dimension25="$489">View Deal</a></p></div><div class="product"><a data-dimension112="16836342-c18e-11f1-a396-03ff0c160a74" data-action="Deal Block" data-label="Phone 4a Pro" data-dimension48="Phone 4a Pro" data-dimension25="$419" href="https://www.bestbuy.com/product/nothing-phone-4a-pro-128gb-unlocked-silver/CZTTGJQQJ2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="D7yfN6qubYsNKDFyhBH2e8" name="Phone-4a-Pro-White" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/D7yfN6qubYsNKDFyhBH2e8-1920-80.webp" mos="" align="middle" fullscreen="" width="2048" height="2048" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This may not be a huge discount compared to others on this list, but it's still worth checking out. The Nothing Phone 4a Pro is an excellent budget phone, with great battery life, a unique design, good camera quality and a bunch of cool AI features. Plus, there's a Dot Matrix Glyph Display that can be customized to your liking.<a class="view-deal button" href="https://www.bestbuy.com/product/nothing-phone-4a-pro-128gb-unlocked-silver/CZTTGJQQJ2" target="_blank" rel="nofollow" data-dimension112="16836342-c18e-11f1-a396-03ff0c160a74" data-action="Deal Block" data-label="Phone 4a Pro" data-dimension48="Phone 4a Pro" data-dimension25="$419">View Deal</a></p></div><div class="product"><a data-dimension112="168363ce-c18e-11f1-8ad0-79052ce6e428" data-action="Deal Block" data-label="Pixel 10a" data-dimension48="Pixel 10a" data-dimension25="$524" href="https://www.amazon.com/dp/B0GHRHXVN1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1243px;"><p class="vanilla-image-block" style="padding-top:120.68%;"><img id="HeYsLX4yTgWGZz9Yq5NJFM" name="Pixel 10a deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HeYsLX4yTgWGZz9Yq5NJFM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1243" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10a-review" data-dimension112="168363ce-c18e-11f1-8ad0-79052ce6e428" data-action="Deal Block" data-label="Pixel 10a" data-dimension48="Pixel 10a" data-dimension25="$524">Pixel 10a</a> is one of the latest phones to suffer a mid-life price hike, rising from $499 to $599 in recent weeks. Obviously, a $524 price doesn't quite make up for that, but saving that extra $75 is still important. </p><p>This phone offers great AI features, longer battery life and faster charging speed than previous A-series Pixels, and a flush rear design that doesn't feature any kind of camera bump.<a class="view-deal button" href="https://www.amazon.com/dp/B0GHRHXVN1" target="_blank" rel="nofollow" data-dimension112="168363ce-c18e-11f1-8ad0-79052ce6e428" data-action="Deal Block" data-label="Pixel 10a" data-dimension48="Pixel 10a" data-dimension25="$524">View Deal</a></p></div><div class="product"><a data-dimension112="a9d90098-c18e-11f1-a190-73f6322a39f3" data-action="Deal Block" data-label="Gen 6+" data-dimension48="Gen 6+" data-dimension25="$552" href="https://www.amazon.com/dp/B0H9M1V2BK" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1203px;"><p class="vanilla-image-block" style="padding-top:124.69%;"><img id="Rz84Qi5jdQFDSJGJ5mPHfX" name="Gen 6+" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Rz84Qi5jdQFDSJGJ5mPHfX-1920-80.png" mos="" align="middle" fullscreen="" width="1203" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0H9M1V2BK" target="_blank" rel="nofollow" data-dimension112="a9d90098-c18e-11f1-a190-73f6322a39f3" data-action="Deal Block" data-label="Gen 6+" data-dimension48="Gen 6+" data-dimension25="$552">Gen 6+: was $649 now $552</a></strong><br>Fairphones are not known for having the best hardware or high-end AI features. Instead they focus on offering a phone that is going to last, with easy repairability, long-lasting software support, long battery life and everything both Android and Gemini have to offer.<a class="view-deal button" href="https://www.amazon.com/dp/B0H9M1V2BK" target="_blank" rel="nofollow" data-dimension112="a9d90098-c18e-11f1-a190-73f6322a39f3" data-action="Deal Block" data-label="Gen 6+" data-dimension48="Gen 6+" data-dimension25="$552">View Deal</a></p></div><div class="product"><a data-dimension112="1a6b6d86-c190-11f1-8da5-851eca475194" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$574" href="https://www.amazon.com/dp/B0H7SLXZPB" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1055px;"><p class="vanilla-image-block" style="padding-top:121.14%;"><img id="3P6jH9V8UzMwnSzb52ADW3" name="Galaxy S26 FE" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3P6jH9V8UzMwnSzb52ADW3-1920-80.png" mos="" align="middle" fullscreen="" width="1055" height="1278" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Galaxy S26 FE was $50 more expensive than the S25 FE that arrived last year — but Prime Day knocked the price much lower than that. For $574, you get a phone with solid battery life, good cameras, a nice premium design and all the hallmarks of a Samsung flagship. It isn't quite as good as a Galaxy S26, but it is still a lot cheaper — and that's what counts.<a class="view-deal button" href="https://www.amazon.com/dp/B0H7SLXZPB" target="_blank" rel="nofollow" data-dimension112="1a6b6d86-c190-11f1-8da5-851eca475194" data-action="Deal Block" data-label="Galaxy S26 FE" data-dimension48="Galaxy S26 FE" data-dimension25="$574">View Deal</a></p></div><div class="product"><a data-dimension112="1a6b6dfe-c190-11f1-a19a-530cdad218bd" data-action="Deal Block" data-label="Pixel 11" data-dimension48="Pixel 11" data-dimension25="$749" href="https://www.amazon.com/Google-Pixel-11-Unlocked-Smartphone/dp/B0H836MLYT?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1252px;"><p class="vanilla-image-block" style="padding-top:119.81%;"><img id="HU5623EmmcxWKvimncgZqE" name="Pixel 11 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HU5623EmmcxWKvimncgZqE-1920-80.jpg" mos="" align="middle" fullscreen="" width="1252" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Google loves hiking up the cost of new Pixel phones each year, and the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-review" data-dimension112="1a6b6dfe-c190-11f1-a19a-530cdad218bd" data-action="Deal Block" data-label="Pixel 11" data-dimension48="Pixel 11" data-dimension25="$749">Pixel 11 </a>was no exception. Thankfully, Pixels are quick to go on sale, and you can already save $150 thanks to Prime Day. The Pixel 11 isn't the biggest upgrade, but it still offers a super-bright OLED display, helpful new Gemini features and handy AI camera tools.<a class="view-deal button" href="https://www.amazon.com/Google-Pixel-11-Unlocked-Smartphone/dp/B0H836MLYT?th=1" target="_blank" rel="nofollow" data-dimension112="1a6b6dfe-c190-11f1-a19a-530cdad218bd" data-action="Deal Block" data-label="Pixel 11" data-dimension48="Pixel 11" data-dimension25="$749">View Deal</a></p></div><div class="product"><a data-dimension112="d1effaa6-c192-11f1-926e-71635837f7a5" data-action="Deal Block" data-label="Pixel 11 Pro" data-dimension48="Pixel 11 Pro" data-dimension25="$849" href="https://www.amazon.com/dp/B0H832JH4Z" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1239px;"><p class="vanilla-image-block" style="padding-top:121.07%;"><img id="FrEQh6QFhVjxEGTiUafDmn" name="Pixel 11 Pro deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FrEQh6QFhVjxEGTiUafDmn-1920-80.jpg" mos="" align="middle" fullscreen="" width="1239" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Bringing the cost of a <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-pro-xl-review" data-dimension112="d1effaa6-c192-11f1-926e-71635837f7a5" data-action="Deal Block" data-label="Pixel 11 Pro" data-dimension48="Pixel 11 Pro" data-dimension25="$849">Pixel 11 Pro</a> down to below $1,000 makes the upgrade seem a lot more palatable — especially since Pixel 10 Pros are now much harder to come by. Like the Pixel 11, the Pro comes with a bunch more great AI features, improved cameras and a brighter display — not to mention there's a new HiLight notification light on the back.<a class="view-deal button" href="https://www.amazon.com/dp/B0H832JH4Z" target="_blank" rel="nofollow" data-dimension112="d1effaa6-c192-11f1-926e-71635837f7a5" data-action="Deal Block" data-label="Pixel 11 Pro" data-dimension48="Pixel 11 Pro" data-dimension25="$849">View Deal</a></p></div><div class="product"><a data-dimension112="d1effb3c-c192-11f1-87d6-91c22645e21d" data-action="Deal Block" data-label="iPhone Air" data-dimension48="iPhone Air" data-dimension25="$839" href="https://www.bestbuy.com/product/apple-iphone-air-256gb-unlocked-sky-blue/JJGCQLRKGJ" 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="dm4kNuPysTLWPR7Yz6XnsB" name="iphone-air-bb" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dm4kNuPysTLWPR7Yz6XnsB-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Apple's thinnest and most durable phone is $260 off for Prime Day. The <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review" data-dimension112="d1effb3c-c192-11f1-87d6-91c22645e21d" data-action="Deal Block" data-label="iPhone Air" data-dimension48="iPhone Air" data-dimension25="$839">iPhone Air</a> offers a big, bright display, with a speedy A19 Pro chipset, good camera quality and solid battery life. It's not as powerful and capable as the iPhone 18 Pro, nor does it have the benefits of extra camera lenses, but it still offers a great Apple experience in a much more portable package.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-iphone-air-256gb-unlocked-sky-blue/JJGCQLRKGJ" target="_blank" rel="nofollow" data-dimension112="d1effb3c-c192-11f1-87d6-91c22645e21d" data-action="Deal Block" data-label="iPhone Air" data-dimension48="iPhone Air" data-dimension25="$839">View Deal</a></p></div><div class="product"><a data-dimension112="d1effbaa-c192-11f1-88e7-4b1ece85ba48" data-action="Deal Block" data-label="Pixel 11 Pro XL" data-dimension48="Pixel 11 Pro XL" data-dimension25="$999" href="https://www.amazon.com/dp/B0H8387SYN?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1240px;"><p class="vanilla-image-block" style="padding-top:120.97%;"><img id="K5nrHXfiC8uPkaw7PTsEy7" name="Pixel 11 Pro XL deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/K5nrHXfiC8uPkaw7PTsEy7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1240" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-pro-xl-review" data-dimension112="d1effbaa-c192-11f1-88e7-4b1ece85ba48" data-action="Deal Block" data-label="Pixel 11 Pro XL" data-dimension48="Pixel 11 Pro XL" data-dimension25="$999">Pixel 11 Pro XL</a> is just like the Pixel 11 Pro, just with a bigger 6.8-inch display and better battery life. It has the same camera upgrades, additional AI tools and the HiLight notification alert on the back.<a class="view-deal button" href="https://www.amazon.com/dp/B0H8387SYN?" target="_blank" rel="nofollow" data-dimension112="d1effbaa-c192-11f1-88e7-4b1ece85ba48" data-action="Deal Block" data-label="Pixel 11 Pro XL" data-dimension48="Pixel 11 Pro XL" data-dimension25="$999">View Deal</a></p></div><div class="product"><a data-dimension112="24140e24-c195-11f1-863f-d355f8de7ca8" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$724" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Processor-Immersive/dp/B0G4SW96R4" 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="82idHUPd6dizKAJwshQ8mk" name="Galaxy S26 (256GB) 'Cobalt Violet'" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/82idHUPd6dizKAJwshQ8mk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Not content with hiking the price of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review" data-dimension112="24140e24-c195-11f1-863f-d355f8de7ca8" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$724">Galaxy S26 </a>at launch, making it $100 more than the S25, Samsung did it again earlier this month, A standard 256GB S26 will now cost you $999, unless you buy it on sale. </p><p>This phone has a larger and brighter display than its predecessors, alongside excellent performance, agentic AI tools as well as classic Samsung benefits like good battery and strong camera performance.<a class="view-deal button" href="https://www.amazon.com/Samsung-Unlocked-Smartphone-Processor-Immersive/dp/B0G4SW96R4" target="_blank" rel="nofollow" data-dimension112="24140e24-c195-11f1-863f-d355f8de7ca8" data-action="Deal Block" data-label="Galaxy S26" data-dimension48="Galaxy S26" data-dimension25="$724">View Deal</a></p></div><div class="product"><a data-dimension112="24140ea6-c195-11f1-be33-7d6203aabfc1" data-action="Deal Block" data-label="Galaxy S26+" data-dimension48="Galaxy S26+" data-dimension25="$824" href="https://www.amazon.com/dp/B0G4SWQC2Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1192px;"><p class="vanilla-image-block" style="padding-top:123.07%;"><img id="nLnALydHBLsMiQiAEDTrQk" name="Galaxy S26 Plus deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/nLnALydHBLsMiQiAEDTrQk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1192" height="1467" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>While not as advanced as the Ultra, the Samsung Galaxy S26+ is still a great option if you want a little more screen space. It has new AI features with agentic capabilities, an excellent display and performance that few phones can match.<a class="view-deal button" href="https://www.amazon.com/dp/B0G4SWQC2Q" target="_blank" rel="nofollow" data-dimension112="24140ea6-c195-11f1-be33-7d6203aabfc1" data-action="Deal Block" data-label="Galaxy S26+" data-dimension48="Galaxy S26+" data-dimension25="$824">View Deal</a></p></div><div class="product"><a data-dimension112="24140f64-c195-11f1-b1c3-73d860fd2068" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$979" href="https://www.amazon.com/dp/B0G4SWDH8P" 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>If you want the most advanced Samsung experience, then the<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review" data-dimension112="24140f64-c195-11f1-b1c3-73d860fd2068" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$979"> Samsung Galaxy S26 Ultra</a> is the phone for you — and it's now over $300 off in the Prime Day sale. It has a large brighter display and agentic AI, just like the rest of the Galaxy S26 series. There are also more Ultra offerings like a built-in S Pen, 200MP main camera, secondary telephoto lens and more. All for under a thousand dollars.<a class="view-deal button" href="https://www.amazon.com/dp/B0G4SWDH8P" target="_blank" rel="nofollow" data-dimension112="24140f64-c195-11f1-b1c3-73d860fd2068" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$979">View Deal</a></p></div><div class="product"><a data-dimension112="b93e0d0a-c196-11f1-9415-09d7a55d485a" data-action="Deal Block" data-label="Razr Ultra (2026)" data-dimension48="Razr Ultra (2026)" data-dimension25="$1399" href="https://www.amazon.com/Motorola-Unlocked-Camera-Pantone-Orient/dp/B0GSH2N9P7" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1329px;"><p class="vanilla-image-block" style="padding-top:90.22%;"><img id="3SrKX7Sqj36oUdiwjwsTiW" name="Razr Ultra (2026)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3SrKX7Sqj36oUdiwjwsTiW-1920-80.png" mos="" align="middle" fullscreen="" width="1329" height="1199" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Motorola-Unlocked-Camera-Pantone-Orient/dp/B0GSH2N9P7" target="_blank" rel="nofollow" data-dimension112="b93e0d0a-c196-11f1-9415-09d7a55d485a" data-action="Deal Block" data-label="Razr Ultra (2026)" data-dimension48="Razr Ultra (2026)" data-dimension25="$1399">Razr Ultra (2026): was $1499 now $1399</a></strong><br>Samsung may be neglecting its flip phones, but Motorola certainly isn't. The <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-ultra-2026-review">Motorola Razr 2026</a> offers class-leading battery life, a premium build, excellent camera quality and a brighter screen than you'd expect. The downside is that the price went up by a lot this year, which is why deals like this are so important. It's still not quite as cheap as the Razr Ultra 2025 ($1,299 at launch), but $100 is still $100.<a class="view-deal button" href="https://www.amazon.com/Motorola-Unlocked-Camera-Pantone-Orient/dp/B0GSH2N9P7" target="_blank" rel="nofollow" data-dimension112="b93e0d0a-c196-11f1-9415-09d7a55d485a" data-action="Deal Block" data-label="Razr Ultra (2026)" data-dimension48="Razr Ultra (2026)" data-dimension25="$1399">View Deal</a></p></div><div class="product"><a data-dimension112="31e664c6-c199-11f1-b9ce-39f8266c4778" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Android-Smartphone/dp/B0H12M2TY4" 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>The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win" data-dimension112="31e664c6-c199-11f1-b9ce-39f8266c4778" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549">Galaxy Z Fold 8</a> is the closest thing Samsung has to an iPhone Duo, with a comfortable wide design that fits neatly into your hands. You only get two cameras, but Samsung has packed this thing with AI and has made a valiant effort to make the display crease almost invisible.<a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Android-Smartphone/dp/B0H12M2TY4" target="_blank" rel="nofollow" data-dimension112="31e664c6-c199-11f1-b9ce-39f8266c4778" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549">View Deal</a></p></div><div class="product"><a data-dimension112="70fa1d98-c198-11f1-b75f-d324a922b3c4" data-action="Deal Block" data-label="Razr Fold" data-dimension48="Razr Fold" data-dimension25="$1699" href="https://www.bestbuy.com/product/motorola-razr-fold-2026-512gb-unlocked-pantone-blackened-blue/J39TH6H2H3" 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="hNXqrRp93gLPxbrLLxXBeh" name="Motorola Razr Fold deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hNXqrRp93gLPxbrLLxXBeh-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If flip phones aren't your jam, then Motorola also has the Razr Fold — its first book-style foldable device. Not only do you get a larger screen, you also get considerably longer battery than a flip phone can ever hope for. Almost <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" data-dimension112="70fa1d98-c198-11f1-b75f-d324a922b3c4" data-action="Deal Block" data-label="Razr Fold" data-dimension48="Razr Fold" data-dimension25="$1699">15 hours in our testing,</a> which is on par with the Galaxy Z Fold 8 Ultra. You also get AI-enhanced camera zoom, a rugged and durable design, fast charging and great camera performance.<a class="view-deal button" href="https://www.bestbuy.com/product/motorola-razr-fold-2026-512gb-unlocked-pantone-blackened-blue/J39TH6H2H3" target="_blank" rel="nofollow" data-dimension112="70fa1d98-c198-11f1-b75f-d324a922b3c4" data-action="Deal Block" data-label="Razr Fold" data-dimension48="Razr Fold" data-dimension25="$1699">View Deal</a></p></div><div class="product"><a data-dimension112="31e66552-c199-11f1-b9a2-dd44bcb8e79a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699" href="https://www.amazon.com/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>Offering a larger screen than the Z Fold 8, alongside an extra camera and additional software features, the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review" data-dimension112="31e66552-c199-11f1-b9a2-dd44bcb8e79a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699">Samsung Galaxy Z Fold 8 Ultra</a> is the pinnacle of Samsung's foldable experience so far. It is normally very expensive, but thanks to Prime Day that price is now $400 less than you'd normally have to pay.<a class="view-deal button" href="https://www.amazon.com/dp/B0H12DXK8J" target="_blank" rel="nofollow" data-dimension112="31e66552-c199-11f1-b9a2-dd44bcb8e79a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699">View Deal</a></p></div><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><ul><li><strong></strong><a href="https://www.amazon.com/primebigdealdays?" target="_blank" rel="nofollow"><strong>See all deals in the Prime Day sale</strong></a><strong></strong></li><li><strong></strong><a href="https://www.amazon.com/amazonprime" target="_blank" rel="nofollow"><strong>Sign up for Amazon Prime</strong></a><strong></strong></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&brands=Amazon&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(item.merchant_name || item.merchant || item.retailer || 'Retailer'),            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Forget the Samsung Galaxy Watch 9: The Watch 8 is just as good and $114 off right now ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">Grab your 30-day free Amazon Prime trial to buy this deal!</div><div class="fancy_box_body"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' ><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5kW5FPjJh56uhEpdPfwfeF" name="Amazon End of Summer Sale Pool.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/5kW5FPjJh56uhEpdPfwfeF-1920-80.jpg" mos="" link="" align="" fullscreen="" width="" height="" attribution="" endorsement="" class="pinterest-pin-exclude"></p></div></div><figcaption itemprop="caption description" class=""><span class="credit" itemprop="copyrightHolder">(Image credit: Amazon)</span></figcaption></figure><p class="fancy-box__body-text">As well as access to these exclusive Prime Big Deal Days savings, you can get free Prime shipping, access to Prime Video streaming, Prime Music, Amazon Luna gaming, unlimited cloud photo storage and a whole lot more.</p><p class="fancy-box__body-text"><a data-analytics-id="inline-link" href="https://www.amazon.com/amazonprime" target="_blank" rel="nofollow"><strong>Sign up for Amazon Prime</strong></a></p></div></div><p>The<a href="https://www.tomsguide.com/wellness/smartwatches/i-wore-the-samsung-galaxy-watch-9-for-a-month-the-new-health-tools-impress-but-that-doesnt-mean-you-should-upgrade"> Samsung Galaxy Watch 9 </a>is out now, but my wearables expert colleague Dan didn't think it was necessarily worth upgrading for, and smart shoppers can actually grab its predecessor, the <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-8-review">Galaxy Watch 8</a>, for <a href="https://www.amazon.com/Samsung-Bluetooth-Smartwatch-Rotating-Coaching/dp/B0F7PS35R2/" target="_blank" rel="nofollow">$114 off during Prime Day sales</a>.</p><p>The Samsung Galaxy Watch 9 is very similar to the Galaxy Watch 8, with a few extra features that ultimately may or may not come to older models via future firmware. Yes, the 9 does have a faster processor, but battery life (versus capacity) remains at 30 hours for the smaller model and 40 hours for the larger one, and the 9 costs more.</p><p>Let's look at why this is a deal worth shopping for, and I've popped the deal below so you can shop it right now.</p><div class="product"><a data-dimension112="098e18a6-c186-11f1-8514-373ce373facf" data-action="Deal Block" data-label="Galaxy Watch 8" data-dimension48="Galaxy Watch 8" data-dimension25="$264" href="https://www.amazon.com/Samsung-Bluetooth-Smartwatch-Rotating-Coaching/dp/B0F7PS35R2/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:900px;"><p class="vanilla-image-block" style="padding-top:117.78%;"><img id="z5tRCg7DAN2rkCMArSyKGi" name="Galaxy Watch 8" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/z5tRCg7DAN2rkCMArSyKGi-1920-80.png" mos="" align="middle" fullscreen="" width="900" height="1060" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Samsung Galaxy Watch 8 is on sale, so you can scoop up one of the watch's best iterations at a lower price. It has the same design and size options as the 9 (the 9 doesn't have a Classic model) and the same max brightness. The 9 has a new Vitals dashboard with your key metrics, and new fitness features like Cardio Load insights and Fitness Index. While the 9 has a very slight increase in battery capacity, battery life remains unchanged from the 8, and they also share the same water resistance. <a class="view-deal button" href="https://www.amazon.com/Samsung-Bluetooth-Smartwatch-Rotating-Coaching/dp/B0F7PS35R2/" target="_blank" rel="nofollow" data-dimension112="098e18a6-c186-11f1-8514-373ce373facf" data-action="Deal Block" data-label="Galaxy Watch 8" data-dimension48="Galaxy Watch 8" data-dimension25="$264">View Deal</a></p></div><h2 id="reasons-to-buy-the-8">Reasons to buy the 8</h2><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="hhmZN8g6gWaALLmLedMty4" name="Galaxy Watch 8 Classic BPM" alt="Samsung Galaxy Watch 8 Classic showing the BPM 'Complication' on its watch face" src="https://cdn.mos.cms.futurecdn.net/hhmZN8g6gWaALLmLedMty4-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>My colleague Dan rated the Samsung Galaxy Watch 8 as 4 out of 5 stars and says he is a "big fan" of the watch, particularly the Classic model, "which sports a bidirectional clicky bezel for navigation and an additional customizable button compared to the standard Galaxy Watch 8 models." There's no Samsung Galaxy Watch 9 Classic. </p><p>The Watch 8 includes a built-in Gemini AI assistant, the same battery life as the 9, plus sleep insights and useful wellness and fitness tracking. Health tracking is Samsung’s comfort zone, built around the Samsung Health app. The Watch 8 has a few headline features across activity, sleep, and nutrition, plus FDA-authorized sleep apnea detection, energy scores, BIA body composition analysis, temperature-based cycle tracking, metabolic health indexing, and more.</p><p>The Galaxy Watch 8 tracks a wide range of workouts and activity types. The device can automatically detect common exercise types, so you don’t need to remember to start a workout tracking session; runners also get access to a personalized run coach.</p><h2 id="reasons-to-skip-the-8">Reasons to skip the 8</h2><p><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 spent a month exercising with the Samsung Galaxy Watch 9</a>, and I personally didn't find it very user-friendly during workouts where I had to navigate settings on my watch.</p><p>The Watch 9 does have useful new wellness and fitness metrics and a redesigned health app that better tracks trend data. My colleague Dan also noted a softer, more comfortable strap, plus a raise-to-talk gesture that launches Gemini AI Assistant. </p><p>Overall, he didn't necessarily think the upgrade was worth it for everyone. The design, display, and battery life all remain unchanged, but the Galaxy Watch 9 supports a handful of useful new features, a slightly faster processor, and a comfier strap.</p><p>Some of those features include a new Vitals tab for better visibility of metrics and long-term trend data; a new Heart Health score from 1-100; and an FDA-cleared sleep apnea detection feature. When it comes to sleep tracking, not much has changed from the Galaxy Watch 8. </p><p>So, if you don't want to pay $379 for the 40mm or $409 for the 44mm models, this could be your chance to grab one of the best Samsung Galaxy smartwatches during sales.</p><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><ul><li><strong></strong><a href="https://www.amazon.com/primebigdealdays?" target="_blank" rel="nofollow"><strong>See all deals in the Prime Day sale</strong></a><strong></strong></li><li><a href="https://www.amazon.com/headphones-sale/s?k=headphones+on+sale" target="_blank" rel="nofollow"><strong>All headphones on sale at Amazon</strong></a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&brands=Amazon&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(item.merchant_name || item.merchant || item.retailer || 'Retailer'),            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/smartwatches/forget-the-samsung-galaxy-watch-9-the-watch-8-is-just-as-good-and-usd114-off-right-now</link>
                                                                            <description>
                            <![CDATA[ Samsung’s Galaxy Watch 9 is out, but smart shoppers are buying the Watch 8 at $114 off thanks to Prime Day. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">y8vnnzwCueQtLBetTCQzh3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/UDj3Hza2NQYncd7sMFqWZX-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Tue, 06 Oct 2026 13:30:46 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ sam.hopes@futurenet.com (Sam Hopes) ]]></author>                    <dc:creator><![CDATA[ Sam Hopes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jZ88qJqvjWaCXXv3qvUQPA-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Sam Hopes is a level 3 qualified trainer, a level 2 Reiki practitioner and a fitness editor at Tom&#039;s Guide. She is also currently undertaking her Yoga For Athletes training course. Sam has written for various fitness brands and websites over the years and has experience across brands at Future, such as &lt;a href=&quot;https://www.livescience.com/author/sam-hopes&quot;&gt;Live Science&lt;/a&gt;,&lt;a href=&quot;https://www.fitandwell.com/author/sam-hopes&quot;&gt; Fit&amp;amp;Well&lt;/a&gt;,&lt;a href=&quot;https://www.coachweb.com/author/sam-hopes&quot;&gt; Coach&lt;/a&gt;, and T3. &lt;/p&gt;&lt;p&gt;Having worked with fitness studios like F45 and Virgin Active and trained both group and 1:1, Sam now primarily teaches outdoor bootcamps, bodyweight, and kettlebells. She also coaches mobility and flexibility classes several times a week and believes that true strength comes from a holistic approach to training your body. &lt;/p&gt;&lt;p&gt;Sam has completed two mixed doubles Hyrox competitions in London and the Netherlands and finished her first doubles attempt in 1:11.&lt;/p&gt;&lt;p&gt;In her spare time, she enjoys CrossFit, hot yoga, Pilates and running and can be found perfecting her handstand walks and handstand push-ups in the gym whenever she has the chance to be upside down. At work, she can be found testing the latest in fitness technology and wearables, anything yoga and CrossFit-related and has a keen interest in nutrition, mindfulness, sleep and recovery.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/UDj3Hza2NQYncd7sMFqWZX-1920-80.png">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Watches 8 and 8 Classic side by side on hand with a deal badge in blue bottom right]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Watches 8 and 8 Classic side by side on hand with a deal badge in blue bottom right]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Watches 8 and 8 Classic side by side on hand with a deal badge in blue bottom right]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/UDj3Hza2NQYncd7sMFqWZX-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Grab your 30-day free Amazon Prime trial to buy this deal!</div><div class="fancy_box_body"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' ><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5kW5FPjJh56uhEpdPfwfeF" name="Amazon End of Summer Sale Pool.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/5kW5FPjJh56uhEpdPfwfeF-1920-80.jpg" mos="" link="" align="" fullscreen="" width="" height="" attribution="" endorsement="" class="pinterest-pin-exclude"></p></div></div><figcaption itemprop="caption description" class=""><span class="credit" itemprop="copyrightHolder">(Image credit: Amazon)</span></figcaption></figure><p class="fancy-box__body-text">As well as access to these exclusive Prime Big Deal Days savings, you can get free Prime shipping, access to Prime Video streaming, Prime Music, Amazon Luna gaming, unlimited cloud photo storage and a whole lot more.</p><p class="fancy-box__body-text"><a data-analytics-id="inline-link" href="https://www.amazon.com/amazonprime" target="_blank" rel="nofollow"><strong>Sign up for Amazon Prime</strong></a></p></div></div><p>The<a href="https://www.tomsguide.com/wellness/smartwatches/i-wore-the-samsung-galaxy-watch-9-for-a-month-the-new-health-tools-impress-but-that-doesnt-mean-you-should-upgrade"> Samsung Galaxy Watch 9 </a>is out now, but my wearables expert colleague Dan didn't think it was necessarily worth upgrading for, and smart shoppers can actually grab its predecessor, the <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-8-review">Galaxy Watch 8</a>, for <a href="https://www.amazon.com/Samsung-Bluetooth-Smartwatch-Rotating-Coaching/dp/B0F7PS35R2/" target="_blank" rel="nofollow">$114 off during Prime Day sales</a>.</p><p>The Samsung Galaxy Watch 9 is very similar to the Galaxy Watch 8, with a few extra features that ultimately may or may not come to older models via future firmware. Yes, the 9 does have a faster processor, but battery life (versus capacity) remains at 30 hours for the smaller model and 40 hours for the larger one, and the 9 costs more.</p><p>Let's look at why this is a deal worth shopping for, and I've popped the deal below so you can shop it right now.</p><div class="product"><a data-dimension112="098e18a6-c186-11f1-8514-373ce373facf" data-action="Deal Block" data-label="Galaxy Watch 8" data-dimension48="Galaxy Watch 8" data-dimension25="$264" href="https://www.amazon.com/Samsung-Bluetooth-Smartwatch-Rotating-Coaching/dp/B0F7PS35R2/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:900px;"><p class="vanilla-image-block" style="padding-top:117.78%;"><img id="z5tRCg7DAN2rkCMArSyKGi" name="Galaxy Watch 8" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/z5tRCg7DAN2rkCMArSyKGi-1920-80.png" mos="" align="middle" fullscreen="" width="900" height="1060" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Samsung Galaxy Watch 8 is on sale, so you can scoop up one of the watch's best iterations at a lower price. It has the same design and size options as the 9 (the 9 doesn't have a Classic model) and the same max brightness. The 9 has a new Vitals dashboard with your key metrics, and new fitness features like Cardio Load insights and Fitness Index. While the 9 has a very slight increase in battery capacity, battery life remains unchanged from the 8, and they also share the same water resistance. <a class="view-deal button" href="https://www.amazon.com/Samsung-Bluetooth-Smartwatch-Rotating-Coaching/dp/B0F7PS35R2/" target="_blank" rel="nofollow" data-dimension112="098e18a6-c186-11f1-8514-373ce373facf" data-action="Deal Block" data-label="Galaxy Watch 8" data-dimension48="Galaxy Watch 8" data-dimension25="$264">View Deal</a></p></div><h2 id="reasons-to-buy-the-8">Reasons to buy the 8</h2><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="hhmZN8g6gWaALLmLedMty4" name="Galaxy Watch 8 Classic BPM" alt="Samsung Galaxy Watch 8 Classic showing the BPM 'Complication' on its watch face" src="https://cdn.mos.cms.futurecdn.net/hhmZN8g6gWaALLmLedMty4-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>My colleague Dan rated the Samsung Galaxy Watch 8 as 4 out of 5 stars and says he is a "big fan" of the watch, particularly the Classic model, "which sports a bidirectional clicky bezel for navigation and an additional customizable button compared to the standard Galaxy Watch 8 models." There's no Samsung Galaxy Watch 9 Classic. </p><p>The Watch 8 includes a built-in Gemini AI assistant, the same battery life as the 9, plus sleep insights and useful wellness and fitness tracking. Health tracking is Samsung’s comfort zone, built around the Samsung Health app. The Watch 8 has a few headline features across activity, sleep, and nutrition, plus FDA-authorized sleep apnea detection, energy scores, BIA body composition analysis, temperature-based cycle tracking, metabolic health indexing, and more.</p><p>The Galaxy Watch 8 tracks a wide range of workouts and activity types. The device can automatically detect common exercise types, so you don’t need to remember to start a workout tracking session; runners also get access to a personalized run coach.</p><h2 id="reasons-to-skip-the-8">Reasons to skip the 8</h2><p><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 spent a month exercising with the Samsung Galaxy Watch 9</a>, and I personally didn't find it very user-friendly during workouts where I had to navigate settings on my watch.</p><p>The Watch 9 does have useful new wellness and fitness metrics and a redesigned health app that better tracks trend data. My colleague Dan also noted a softer, more comfortable strap, plus a raise-to-talk gesture that launches Gemini AI Assistant. </p><p>Overall, he didn't necessarily think the upgrade was worth it for everyone. The design, display, and battery life all remain unchanged, but the Galaxy Watch 9 supports a handful of useful new features, a slightly faster processor, and a comfier strap.</p><p>Some of those features include a new Vitals tab for better visibility of metrics and long-term trend data; a new Heart Health score from 1-100; and an FDA-cleared sleep apnea detection feature. When it comes to sleep tracking, not much has changed from the Galaxy Watch 8. </p><p>So, if you don't want to pay $379 for the 40mm or $409 for the 44mm models, this could be your chance to grab one of the best Samsung Galaxy smartwatches during sales.</p><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><ul><li><strong></strong><a href="https://www.amazon.com/primebigdealdays?" target="_blank" rel="nofollow"><strong>See all deals in the Prime Day sale</strong></a><strong></strong></li><li><a href="https://www.amazon.com/headphones-sale/s?k=headphones+on+sale" target="_blank" rel="nofollow"><strong>All headphones on sale at Amazon</strong></a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&brands=Amazon&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(item.merchant_name || item.merchant || item.retailer || 'Retailer'),            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Act fast! Prime Day just knocked $400 off Galaxy Z Fold 8 Ultra and $350 off Galaxy Fold 8 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The iPhone Duo is set to arrive later this month, but before you go ahead and pre-order Apple's first foldable you should be aware that Samsung's latest folding phones have just had a hefty discount thanks to Prime Day. These discounts take the price of both the passport-shaped Galaxy Z Fold 8 and the larger Z Fold 8 Ultra a few hundred dollars below what Apple is charging.</p><p>Normally costing $2,099, Amazon has knocked the price of the<a href="https://www.amazon.com/dp/B0H12DXK8J" target="_blank" rel="nofollow"> Galaxy Z Fold 8 Ultra down to $1,699 for a 256GB model</a>. That's a saving of over $400, and $300 less than the iPhone Duo is set to cost. Meanwhile, the <a href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Android-Smartphone/dp/B0H12M2TY4" target="_blank" rel="nofollow">Galaxy Z Fold 8 has now dropped to $1,549</a>, which is $350 less than the usual $1,899 price tag. </p><div class="product"><a data-dimension112="6253e418-c170-11f1-b6a1-6f234d2c7e33" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Android-Smartphone/dp/B0H12M2TY4" 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>If you want the closest thing Samsung has to an iPhone Duo, but at a much lower price point, then check out this Galaxy Z Fold 8 deal. The passport-shaped Samsung foldable has two cameras, a 7.6-inch foldable display, 5.5-inch cover display and all the AI features you could dream off. It's all wrapped up in a design that's lighter and thinner than Apple's foldable.<a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Android-Smartphone/dp/B0H12M2TY4" target="_blank" rel="nofollow" data-dimension112="6253e418-c170-11f1-b6a1-6f234d2c7e33" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549">View Deal</a></p></div><div class="product"><a data-dimension112="6253e486-c170-11f1-8227-794e236ca5b1" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699" href="https://www.amazon.com/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/dp/B0H12DXK8J" target="_blank" rel="nofollow" data-dimension112="6253e486-c170-11f1-8227-794e236ca5b1" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699">Galaxy Z Fold 8 Ultra: was $2099 now $1699</a></strong><br>If you want a larger screen than the Z Fold 8 and iPhone Duo, or want an actual telephoto lens, then the Z Fold 8 Ultra could be the foldable for you. It has everything the Z Fold 8 offers, plus a larger 8-inch screen and 6.5-inch cover display, plus a 200MP main camera lens. <a class="view-deal button" href="https://www.amazon.com/dp/B0H12DXK8J" target="_blank" rel="nofollow" data-dimension112="6253e486-c170-11f1-8227-794e236ca5b1" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699">View Deal</a></p></div><p>Both Samsung foldables are powerful, offer strong battery life and feature bright anti-reflective screens that let you enjoy all the extra space regardless of the environment. Plus, Samsung has been working hard to reduce the appearance of the crease, and while not completely invisible it is much harder to see than with previous devices.</p><p>Both Samsung foldables are thinner and lighter than the iPhone Duo, while also offering better multitasking, DeX desktop mode and now a much lower price tag. Not to mention the fact that Samsung has a clear advantage when it comes to AI features, on account of its own head start and collaborative efforts with Google.</p><p>The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Z Fold 8 Ultra</a> also has the added benefit of including a 200MP main camera and a third camera lens, a 10MP telephoto shooter with 3x optical zoom. But the regular Fold 8 is the one to get if you prefer a more compact design and wider main display.</p><p><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">There are some downsides</a>, though. The main one is that Samsung doesn't offer stylus support on its latest foldables, whereas Apple does with the Apple Pencil. In addition, Apple offers faster charging, MagSafe support, IP68 dust resistance and vapor chamber cooling for improved performance. The Z Fold 8 also lacks the ability to detect the way the screen and hinge are positioned, which both the Ultra (as Flex View) and iPhone Duo offer.</p><p>There's a lot to love about foldable phones, but the prices have always been particularly excessive. With that in mind, the ability to save such a considerable amount of money on two of the latest foldables, and so soon after they first released, is a deal that most people can't afford to miss out on. </p><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><ul><li><strong></strong><a href="https://www.amazon.com/primebigdealdays?" target="_blank" rel="nofollow"><strong>See all deals in the Prime Day sale</strong></a><strong></strong></li><li><strong></strong><a href="https://www.amazon.com/amazonprime" target="_blank" rel="nofollow"><strong>Sign up for Amazon Prime</strong></a><strong></strong></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&brands=Amazon&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(item.merchant_name || item.merchant || item.retailer || 'Retailer'),            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/forget-iphone-duo-prime-day-just-knocked-usd400-off-galaxy-z-fold-8-ultra</link>
                                                                            <description>
                            <![CDATA[ iPhone Duo hasn't even been released yet, but Samsung has already dropped the price of Z Fold 8 Ultra and Z Fold 8, saving you hundreds of dollars compared to Apple's foldable. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">xG9VwEaZrLznh7qQZdYHWK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MT3j8Vh9uh4PJdSURfLQm8-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 06 Oct 2026 11:18:30 +0000</pubDate>                                                                                                                                <updated>Tue, 06 Oct 2026 13:30:58 +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/MT3j8Vh9uh4PJdSURfLQm8-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Fold 8 with Prime Day deal tag]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Fold 8 with Prime Day deal tag]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Fold 8 with Prime Day deal tag]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MT3j8Vh9uh4PJdSURfLQm8-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The iPhone Duo is set to arrive later this month, but before you go ahead and pre-order Apple's first foldable you should be aware that Samsung's latest folding phones have just had a hefty discount thanks to Prime Day. These discounts take the price of both the passport-shaped Galaxy Z Fold 8 and the larger Z Fold 8 Ultra a few hundred dollars below what Apple is charging.</p><p>Normally costing $2,099, Amazon has knocked the price of the<a href="https://www.amazon.com/dp/B0H12DXK8J" target="_blank" rel="nofollow"> Galaxy Z Fold 8 Ultra down to $1,699 for a 256GB model</a>. That's a saving of over $400, and $300 less than the iPhone Duo is set to cost. Meanwhile, the <a href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Android-Smartphone/dp/B0H12M2TY4" target="_blank" rel="nofollow">Galaxy Z Fold 8 has now dropped to $1,549</a>, which is $350 less than the usual $1,899 price tag. </p><div class="product"><a data-dimension112="6253e418-c170-11f1-b6a1-6f234d2c7e33" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Android-Smartphone/dp/B0H12M2TY4" 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>If you want the closest thing Samsung has to an iPhone Duo, but at a much lower price point, then check out this Galaxy Z Fold 8 deal. The passport-shaped Samsung foldable has two cameras, a 7.6-inch foldable display, 5.5-inch cover display and all the AI features you could dream off. It's all wrapped up in a design that's lighter and thinner than Apple's foldable.<a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Unlocked-Android-Smartphone/dp/B0H12M2TY4" target="_blank" rel="nofollow" data-dimension112="6253e418-c170-11f1-b6a1-6f234d2c7e33" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1549">View Deal</a></p></div><div class="product"><a data-dimension112="6253e486-c170-11f1-8227-794e236ca5b1" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699" href="https://www.amazon.com/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/dp/B0H12DXK8J" target="_blank" rel="nofollow" data-dimension112="6253e486-c170-11f1-8227-794e236ca5b1" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699">Galaxy Z Fold 8 Ultra: was $2099 now $1699</a></strong><br>If you want a larger screen than the Z Fold 8 and iPhone Duo, or want an actual telephoto lens, then the Z Fold 8 Ultra could be the foldable for you. It has everything the Z Fold 8 offers, plus a larger 8-inch screen and 6.5-inch cover display, plus a 200MP main camera lens. <a class="view-deal button" href="https://www.amazon.com/dp/B0H12DXK8J" target="_blank" rel="nofollow" data-dimension112="6253e486-c170-11f1-8227-794e236ca5b1" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$1699">View Deal</a></p></div><p>Both Samsung foldables are powerful, offer strong battery life and feature bright anti-reflective screens that let you enjoy all the extra space regardless of the environment. Plus, Samsung has been working hard to reduce the appearance of the crease, and while not completely invisible it is much harder to see than with previous devices.</p><p>Both Samsung foldables are thinner and lighter than the iPhone Duo, while also offering better multitasking, DeX desktop mode and now a much lower price tag. Not to mention the fact that Samsung has a clear advantage when it comes to AI features, on account of its own head start and collaborative efforts with Google.</p><p>The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Z Fold 8 Ultra</a> also has the added benefit of including a 200MP main camera and a third camera lens, a 10MP telephoto shooter with 3x optical zoom. But the regular Fold 8 is the one to get if you prefer a more compact design and wider main display.</p><p><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">There are some downsides</a>, though. The main one is that Samsung doesn't offer stylus support on its latest foldables, whereas Apple does with the Apple Pencil. In addition, Apple offers faster charging, MagSafe support, IP68 dust resistance and vapor chamber cooling for improved performance. The Z Fold 8 also lacks the ability to detect the way the screen and hinge are positioned, which both the Ultra (as Flex View) and iPhone Duo offer.</p><p>There's a lot to love about foldable phones, but the prices have always been particularly excessive. With that in mind, the ability to save such a considerable amount of money on two of the latest foldables, and so soon after they first released, is a deal that most people can't afford to miss out on. </p><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><ul><li><strong></strong><a href="https://www.amazon.com/primebigdealdays?" target="_blank" rel="nofollow"><strong>See all deals in the Prime Day sale</strong></a><strong></strong></li><li><strong></strong><a href="https://www.amazon.com/amazonprime" target="_blank" rel="nofollow"><strong>Sign up for Amazon Prime</strong></a><strong></strong></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&brands=Amazon&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(item.merchant_name || item.merchant || item.retailer || 'Retailer'),            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy S26 FE review: The perfect cure for Samsung's recent price hike frenzy ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Samsung Galaxy S26 FE is a phone that sits in a very awkward position in Samsung's phone lineup. The phone is designed to be a lower cost alternative to the standard <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review">Galaxy S26</a>, but it also faces increased competition from the, frankly excellent, mid-range <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-a57-review">Galaxy A57.</a> I've been questioning the need for a "Fan Edition" of Samsung's flagships, but with everything going on in the world it actually feels like a good mix of premium and affordable.</p><p>The price is the main factor for the S26 FE's success, especially now that Samsung has hiked prices for the rest of the Galaxy S26 series. On top of that you also have a lot of premium AI features, a solid (is imperfect) camera and a premium feel. However, that doesn't change the fact that the S26 FE has weak performance, and struggles to differentiate itself from both the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-fe-review">Galaxy S25 FE </a>and the cheaper Galaxy A57</p><p>Read our Samsung Galaxy S26 FE review to see whether this phone is right for you.</p><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-review-cheat-sheet"><span>Samsung Galaxy S26 FE review: Cheat Sheet</span></h2><ul><li><strong>What is it? </strong>The latest release in Samsung's long-running "Fan Edition" series, offering a lower price tag in exchange for slightly worse features than the standard Galaxy S26</li><li><strong>Who is it for? </strong>The people who can't justify spending the full $899 on a Galaxy S26, but don't want to deal with the larger compromises made on the cheaper Galaxy A57</li><li><strong>What does it cost? </strong>Prices for the S26 FE start at $699, for a model with 128GB of storage. A 256GB model is also available for $799, which is $200 lower than the 256GB Galaxy S26's newly-raised starting price.</li><li><strong>What do we like? </strong>The low starting price, the good battery life, solid camera quality and the number of premium AI features Samsung has included.</li><li><strong>What don't we like?</strong> The weak performance, the lack of upgrades compared to last year and the fact the Samsung Galaxy A57 isn't that far behind.</li></ul><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-review-specifications"><span>Samsung Galaxy S26 FE 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-review-the-ups"><span>Samsung Galaxy S26 FE review: The ups</span></h2><h2 id="699-starting-price">$699 starting price</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QCieA8sWMFWrAohkRSWHkW" name="Galaxy S26 FE-2" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/QCieA8sWMFWrAohkRSWHkW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>When I first went<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-fe-review"> hands-on with the Galaxy S26 FE </a>I commented on the fact that the phone wasn't actually that much cheaper than the Galaxy S26. In fact, at the time, a 256GB S26 FE cost the same amount as a 256GB Galaxy S26. Things have changed since then, though, thanks to S<a href="https://www.tomsguide.com/phones/samsung-phones/all-three-galaxy-s27-models-tipped-for-price-hike-and-a-key-spec-for-the-s27-ultra-just-leaked">amsung hiking the price of the entire Galaxy S26 lineup</a> — except the Galaxy S26 FE.</p><p>This means that the cheapest Galaxy S26 is now $999, complete with 256GB of storage. Meanwhile the cheapest S26 FE is $699, while the larger 256GB storage option will set you back $799. That's a $200-$300 difference, depending on how much storage you actually require.</p><p>With the cost of entry suddenly much higher, that gives a huge advantage to the Galaxy S26 FE since it offers a lot of the same features as the Galaxy S26 but for a much lower price tag.</p><h2 id="premium-feeling-design">Premium-feeling design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="42GPZk9YWHpPdjA446KThW" name="Galaxy S26 FE-7" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/42GPZk9YWHpPdjA446KThW-1920-80.jpg" mos="" align="middle" fullscreen="" width="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'll caveat this by saying that the Galaxy S26 FE is not as premium as past fan edition phones. The S25 FE has the same matte glass back as the Galaxy S25 FE, but that isn't the case with the S26 equivalents. Instead, the S26 FE has a glossy glass back that looks more like the Galaxy A57 — to the point where I struggle to tell them apart. </p><p>That said, the design is more premium than your typical cheap phone. There's a large 6.9-inch display (rated up to 1,900 nits), and a brushed metal frame that helps the phone avoid feeling like it's a cheap device. The same goes for the solid glass camera bump, which is a trait Samsung usually reserves for other Galaxy S-series devices.</p><p>There's some weight to the S26 FE that makes it feel like it's got some solid construction. While lightweight designs are all the rage in certain circles, the extra half ounce the S26 FE has over the A57 goes a long way. Not to mention that the weight is fairly evenly distributed, giving the phone a more balanced feel. The mid-range Samsung feels a little too light for its size, and doesn't balance as well, which means it feels a little more flimsy as a result.</p><h2 id="solid-ai-features">Solid 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="ZpLZgKww3FodYhpzabGRmW" name="Galaxy S26 FE-9" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/ZpLZgKww3FodYhpzabGRmW-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>It isn't a Samsung phone release without AI playing a key role in everything going forward, and the Galaxy S26 FE is no different. Samsung didn't add anything new and exclusive, which shouldn't surprise anyone, but it still added a bunch of Galaxy AI features we've tried and enjoyed on both the Galaxy S26 and 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>Included here is <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>, which follows human beings to turn existing video into something brand new, the literally-named <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>, <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's 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>, <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's AI editing tools,</a> Now Brief and the contextually aware <a href="https://www.tomsguide.com/phones/samsung-phones/how-to-turn-on-galaxy-s26s-now-nudge-and-how-it-works">Now Nudge</a>, as well as the currently Samsung-exclusive <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> upgrade that lets you scan multiple objects at once.</p><p>All of which makes this a solid low-cost choice for those of you that want access to Galaxy AI features.</p><h2 id="good-battery-life">Good 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="NGm4z9bEjvJgmm9rRwkGeW" name="Galaxy S26 FE-5" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/NGm4z9bEjvJgmm9rRwkGeW-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>We haven't been able to do our full battery life test on the Galaxy S26 FE just yet, but I have performed a rougher version to gauge just how much battery is lost when streaming video. That test involved streaming this YouTube video for three hours, with brightness set to 50%. For comparison's sake, I also ran the same test on the Samsung Galaxy S26 and Galaxy A57.</p><p>The Galaxy S26 FE was the worst of the three, which is bizarre considering it has a 4,900 mAh battery. At the end of the video stream it came out with 82%, compared to 85% on the 4,300 mAh Galaxy S26 and 87% on the 5,000 mAh Galaxy A57. That said, with an average battery loss of 6% per hour, that's not a huge amount of battery drain. </p><p>If that power consumption holds steady, it means the Galaxy S26 FE should last almost 17 hours in the same conditions. It's far from the best battery life we've seen, and logic dictates that the regular S26 should last 20 hours. But that should keep you going throughout the day.</p><p>As for charging, the Galaxy S26 FE promises up to 45W wired charging speeds. My USB-C power meter, paired with a 60W charging brick, saw the incoming power hit a high of 41W which is pretty close. As for actual recharging time, I found the S26 FE reached 39% after 15 minutes and 72% after half an hour. </p><p>That's faster than the S26 and A57, and only slightly behind the Galaxy S26 Ultra (77% in 30 minutes). The S26 FE hit 100% charge after 58 and a half minutes during my testing. This means that while the battery life could be better, at least you'll be able to recharge pretty quickly.</p><h2 id="camera-quality-is-mostly-good-for-the-price">Camera quality is (mostly) good for the price</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5uowZSC6w5vq5opwQCLRhW" name="Galaxy S26 FE-4" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/5uowZSC6w5vq5opwQCLRhW-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>Since the Galaxy S26 FE is designed to sit between the Galaxy A57 and Galaxy S26, I decided that the fairest way to test the cameras was to compare all three phones together. To get an idea of just how much of a difference there is when the phones themselves sit a few hundred dollars apart from one another.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/vvWz4QL6os4TmcUzt9cJLB-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/X6PC9VnpBdtbNApWnP6kiR-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/bz2ct4ZeMgwLFXeLAkNUvj-1920-80.jpg" alt="samsung galaxy a57 vs s26 fe photo comparisson" /><figcaption>Samsung Galaxy A57 <small role="credit">Future</small></figcaption></figure></figure><p>With the main camera lens, you can't see a whole lot of difference in the three, or at least you can't see them on my dog sitting in the foreground. At a glance the quality is generally pretty good, but if you look a little closer the A57 dips considerably compared to the S26 FE — which manages to capture more detail (especially in the background) and a higher quality. </p><p>It's a lot closer in quality to the standard S26, though I'd say the flagship model clinches it in terms of overall quality — despite the fact I can't see much difference on the dog.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/7HZtT9KffiatGDn2XZna3B-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/W6C6TNAACMAvB6LTcqXfBR-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ADkZCx2ch5yUmXVDgTPNgj-1920-80.jpg" alt="samsung galaxy a57 vs s26 fe photo comparisson" /><figcaption>Samsung Galaxy A57 <small role="credit">Future</small></figcaption></figure></figure><p>The ultrawide lenses are easily the mostly evenly matched lenses on the three phones, and the quality is surprisingly uniform. I'd go so far as to say that the quality does improve as the price does, and both the S26 FE and S26 highlight the red spray paint a lot more clearly than the A57. However, the actual difference is not that noticeable unless you look super closely.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/sNMoE4cG3HgyqygF3YdpMB-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/YfKgDo5kT4HFoxtR8jAmhR-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Xs43HpzEamRh4KKxDUm7xj-1920-80.jpg" alt="samsung galaxy a57 vs s26 fe photo comparisson" /><figcaption>Samsung Galaxy A57 <small role="credit">Future</small></figcaption></figure></figure><p>Sadly all three phones do a pretty poor job with zoom, no doubt thanks to the A57's lack of optical zoom and the S26 and FE's weak telephoto cameras. The S26 probably has the edge, especially since the S26 FE added a weird warm color hue to the photo, but none of them are particularly great when you crank magnification up to 3x.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/RyH5LazqbXoa6KfJQXtPaA-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/4zpksCZkXtnjaWjkvSRiwQ-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/NYMHdbdzprb4Dusif39AKj-1920-80.jpg" alt="samsung galaxy a57 vs s26 fe photo comparisson" /><figcaption>Samsung Galaxy A57 <small role="credit">Future</small></figcaption></figure></figure><p>Crank things up to 10x magnification and things are a lot worse. The A57 turned the tower into a fuzzy mess, while the S26 and S26 FE are more evenly matched — though not by a lot. The FE seemed to add a bunch of detail that the S26 didn't pick up. But considering the quality of the photo itself, I can't really say that's an improvement.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/w5BiVu5FVhb6wJu4TgNhaA-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Q4Vria3EdVfAKVhhxmDYsQ-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure></figure><p>It's a similar story for both S26 models at 30x zoom — the maximum you can get on both these phones. The S26 FE looks a little washed out, and picked up darker coloring in the bricks, but the actual quality is on par with the standard S26. Though, this is not meant as a compliment.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/4zVycBQwcy7hZd2TAmWoMB-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/XxCQw2B7XzPe96N3ZmjzTR-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/kYkgyHKigTSczvsktoctpj-1920-80.jpg" alt="samsung galaxy a57 vs s26 fe photo comparisson" /><figcaption>Samsung Galaxy A57 <small role="credit">Future</small></figcaption></figure></figure><p>When it comes to selfies, things are much the same. The overall quality isn't bad, but the level of detail you get improves as the phones get more expensive. The A57 is blurrier and captures far less, while the S26 FE looks a little more like a competent photo. However the S26 captures it the best, and you can make out the individual hair strands a lot more easily. Alongside improved background details.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/XAdDhx7JvWWPPgrsBbxjnA-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/JmNoX3Vz3DoqGSjSzMQq3R-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/hMNgeaY2EaBXazvZSoFpXj-1920-80.jpg" alt="samsung galaxy a57 vs s26 fe photo comparisson" /><figcaption>Samsung Galaxy A57 <small role="credit">Future</small></figcaption></figure></figure><p>Weirdly, though, things are a little different when Portrait mode is involved. Somehow the quality on the A57 seems to have been ramped up, to the point where I'd say the sharpness of the photo exceeds that of the S26 FE. Even the S26 seems to be struggling to visualize my facial hair and various facial details that the S26 FE manages without issue.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/vKN2qhBJ7AJBxgVxR953zA-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/JS99GzFyVTB8NYbbDzAyQR-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Lrk3pYB2pksrGoESL9zJij-1920-80.jpg" alt="samsung galaxy a57 vs s26 fe photo comparisson" /><figcaption>Samsung Galaxy A57 <small role="credit">Future</small></figcaption></figure></figure><p>Things are more or less back to normal with low light photography. The S26 comes out on top in the detail department, though the difference between it and the S26 FE is not that severe. The two certainly managed to capture a similar amount of light to illuminate the final product. As for the A57, the quality isn't there and the lighting has been processed in a way that makes the photo look a lot colder. Almost as though the tomato plant is being illuminated by fluorescent lights.</p><p>Overall I'd say the S26 FE sits in a comfortable position between the A57 and the Galaxy S26. The S26 certainly has the edge in most areas, but the quality difference isn't actually that severe compared to the S26 FE's camera. There's also a noticeable difference between the FE and the Galaxy A57, even though the A57 isn't a bad camera for its price tag. </p><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-review-the-downs"><span>Samsung Galaxy S26 FE review: The downs</span></h2><h2 id="minimal-hardware-upgrades">Minimal hardware upgrades</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TKQnPRTkfTFqUX3jQWEAmW" name="Galaxy S26 FE-8" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/TKQnPRTkfTFqUX3jQWEAmW-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 many phones, the Galaxy S26 FE doesn't have a whole lot to offer when it comes to actual upgrades. The differences in comparison to the Galaxy S25 FE are minimal, and the only tangible changes are the upgraded Exynos chipset and the glass enclosure around the rear camera lens.</p><p>The rest of the hardware is basically identical, which shows Samsung is leaning more onto the software upgrades to try and sell the S26 FE. That's not bad, per se, and the S26 FE does have a heck of a lot of useful features you'd normally only find on flagship phones. However, there's no telling how many of those will make their way to S25 FE at some point. </p><p>In that respect, the S26 FE doesn't feel like a "must-have" device. Not unless you have a super-old Fan Edition phone, or some kind of mid-ranger that desperately needs upgrading.</p><h2 id="middling-performance">Middling performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GgBDE9LH5sg9HTudN2huDW" name="LISTGalaxy S26 FE-1-LIST" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/GgBDE9LH5sg9HTudN2huDW-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 it comes to making phones cheap, compromises have to be made, and in the case of the Galaxy S26 FE Samsung appears to have nerfed the performance in a big way. The fact is, while the rest of the S26 series gets the custom Snapdragon 8 Elite Gen 5 for Galaxy chips (or the latest Exynos 2600), the S26 FE is stuck with the Exynos 2500 — a chip that debuted at the start of 2025.</p><p>Obviously this means that the phone does not have the same level of computing or graphics power as more expensive phones. </p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench 6 (Single/Multi)</strong></p></td><td  ><p><strong>Wild Life Extreme Unlimited (Score/FPS)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy S26 FE</strong></p></td><td  ><p>2,444 / 7,958</p></td><td  ><p>5,318 (31.85)</p></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy S26 (Snapdragon)</strong></p></td><td  ><p>3.531 / 10,778</p></td><td  ><p>7,059 (42.27)</p></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy S26 (Exynos)</strong></p></td><td  ><p>3,197 / 11,065</p></td><td  ><p>7,250  (43.42)</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17e</strong></p></td><td  ><p>3,606 / 9,229</p></td><td  ><p>3,997 (23.9)</p></td></tr><tr><td class="firstcol " ><p><strong>Google Pixel 10a</strong></p></td><td  ><p>1,694 / 4,501</p></td><td  ><p>2,667 (15.97)</p></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy A57</strong></p></td><td  ><p>1,385 / 4,508</p></td><td  ><p>1,765 (10.57)</p></td></tr></tbody></table></div><p>As you can see, the Galaxy S26 FE trails quite far behind both variants of the Galaxy S26. Likewise it falls quite far behind the iPhone 17e, which is powered by Apple's A18 chipset. However, the older Apple chipset always struggled with the graphics side of things, which means it lags quite far behind the S26 FE in that area.</p><p>Performance is one area that the S26 FE truly beats out the A57. The mid-range phone's performance is very poor by comparison, especially where graphics are concerned. However, considering the A57 is $150 cheaper, that's not a huge surprise. In any case, if you were hoping for flagship performance from the Galaxy S26 FE, you are out of luck.</p><h2 id="the-a57-isn-39-t-too-far-behind">The A57 isn't too far behind</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iXTaGrvCpggSdsLL3t9osi" name="Galaxy A57--3" alt="samsung galaxy a57 review images" src="https://cdn.mos.cms.futurecdn.net/iXTaGrvCpggSdsLL3t9osi-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>Having tested both the Galaxy A57 and the Galaxy S26 FE, I can tell you that the lived experience of using both phones is very different. That said, the Galaxy A57 is still an excellent phone for its price, and on paper the differences between it and the Galaxy S26 FE are fairly minimal — especially for casual users who prioritize value and battery life over raw power.</p><p>While I personally think the extra $150 you pay for a Galaxy S26 FE is justifiable, my finances are different than yours — and Samsung is going a lot to make its mid-range phones a heck of a lot more appealing. To the point where it's essentially competing with itself on multiple fronts. Frankly, Samsung should have done more to help the S26 FE stand out on its own more, rather than being compared to lesser phones.</p><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-review-verdict"><span>Samsung Galaxy S26 FE 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PcUMJw4EB7neFQeNu97yjW" name="Galaxy S26 FE-3" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/PcUMJw4EB7neFQeNu97yjW-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 didn't have high hopes for the Samsung Galaxy S26 FE when Samsung first announced it. Personally, I felt as though the Fan Edition series was being awkwardly stuffed into a niche that didn't really need to be filled, to its own detriment. But actually using the phone, combined with Samsung's unceremonious price hike for the rest of the S26 series, has softened me up a bit. There's more to a phone than the basic hardware specs, and you don't really get to experience that without having it in your hand.</p><p>The Galaxy S26 FE offers a flagship experience that you just don't get on Samsung's cheaper phones right now. The experience has been nerfed slightly, in order to save money, but you still get a lot of the best parts of having a premium phone without the high price tag. Considering a regular Galaxy S26 now costs $999, the willingness to accept some of those compromises can now save you a bunch of extra money.</p><p>The lack of meaningful updates is not ideal, though, and if Samsung wants the Fan Edition series to continue long into the future, it's going to have to step up and not let it get <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-tipster-says-galaxy-z-flip-9-could-be-cancelled-heres-why-thats-a-terrible-idea">neglected and end up the same way as the Galaxy Z Flip lineup.</a></p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-fe-review-the-perfect-cure-for-samsungs-recent-price-hike-frenzy</link>
                                                                            <description>
                            <![CDATA[ The Samsung Galaxy S26 FE feels like an awkward release at first glance, but it may just be the low-cost flagship we need right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7x8L4DQw44rH3LML3rDszH</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/eRNhEQXvoG7LJYhGiKVy6W-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 04 Oct 2026 04:45: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/eRNhEQXvoG7LJYhGiKVy6W-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[samsung galaxy s26 fe review shots]]></media:description>                                                            <media:text><![CDATA[samsung galaxy s26 fe review shots]]></media:text>
                                <media:title type="plain"><![CDATA[samsung galaxy s26 fe review shots]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/eRNhEQXvoG7LJYhGiKVy6W-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Samsung Galaxy S26 FE is a phone that sits in a very awkward position in Samsung's phone lineup. The phone is designed to be a lower cost alternative to the standard <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review">Galaxy S26</a>, but it also faces increased competition from the, frankly excellent, mid-range <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-a57-review">Galaxy A57.</a> I've been questioning the need for a "Fan Edition" of Samsung's flagships, but with everything going on in the world it actually feels like a good mix of premium and affordable.</p><p>The price is the main factor for the S26 FE's success, especially now that Samsung has hiked prices for the rest of the Galaxy S26 series. On top of that you also have a lot of premium AI features, a solid (is imperfect) camera and a premium feel. However, that doesn't change the fact that the S26 FE has weak performance, and struggles to differentiate itself from both the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-fe-review">Galaxy S25 FE </a>and the cheaper Galaxy A57</p><p>Read our Samsung Galaxy S26 FE review to see whether this phone is right for you.</p><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-review-cheat-sheet"><span>Samsung Galaxy S26 FE review: Cheat Sheet</span></h2><ul><li><strong>What is it? </strong>The latest release in Samsung's long-running "Fan Edition" series, offering a lower price tag in exchange for slightly worse features than the standard Galaxy S26</li><li><strong>Who is it for? </strong>The people who can't justify spending the full $899 on a Galaxy S26, but don't want to deal with the larger compromises made on the cheaper Galaxy A57</li><li><strong>What does it cost? </strong>Prices for the S26 FE start at $699, for a model with 128GB of storage. A 256GB model is also available for $799, which is $200 lower than the 256GB Galaxy S26's newly-raised starting price.</li><li><strong>What do we like? </strong>The low starting price, the good battery life, solid camera quality and the number of premium AI features Samsung has included.</li><li><strong>What don't we like?</strong> The weak performance, the lack of upgrades compared to last year and the fact the Samsung Galaxy A57 isn't that far behind.</li></ul><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-review-specifications"><span>Samsung Galaxy S26 FE 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-review-the-ups"><span>Samsung Galaxy S26 FE review: The ups</span></h2><h2 id="699-starting-price">$699 starting price</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QCieA8sWMFWrAohkRSWHkW" name="Galaxy S26 FE-2" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/QCieA8sWMFWrAohkRSWHkW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>When I first went<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-fe-review"> hands-on with the Galaxy S26 FE </a>I commented on the fact that the phone wasn't actually that much cheaper than the Galaxy S26. In fact, at the time, a 256GB S26 FE cost the same amount as a 256GB Galaxy S26. Things have changed since then, though, thanks to S<a href="https://www.tomsguide.com/phones/samsung-phones/all-three-galaxy-s27-models-tipped-for-price-hike-and-a-key-spec-for-the-s27-ultra-just-leaked">amsung hiking the price of the entire Galaxy S26 lineup</a> — except the Galaxy S26 FE.</p><p>This means that the cheapest Galaxy S26 is now $999, complete with 256GB of storage. Meanwhile the cheapest S26 FE is $699, while the larger 256GB storage option will set you back $799. That's a $200-$300 difference, depending on how much storage you actually require.</p><p>With the cost of entry suddenly much higher, that gives a huge advantage to the Galaxy S26 FE since it offers a lot of the same features as the Galaxy S26 but for a much lower price tag.</p><h2 id="premium-feeling-design">Premium-feeling design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="42GPZk9YWHpPdjA446KThW" name="Galaxy S26 FE-7" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/42GPZk9YWHpPdjA446KThW-1920-80.jpg" mos="" align="middle" fullscreen="" width="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'll caveat this by saying that the Galaxy S26 FE is not as premium as past fan edition phones. The S25 FE has the same matte glass back as the Galaxy S25 FE, but that isn't the case with the S26 equivalents. Instead, the S26 FE has a glossy glass back that looks more like the Galaxy A57 — to the point where I struggle to tell them apart. </p><p>That said, the design is more premium than your typical cheap phone. There's a large 6.9-inch display (rated up to 1,900 nits), and a brushed metal frame that helps the phone avoid feeling like it's a cheap device. The same goes for the solid glass camera bump, which is a trait Samsung usually reserves for other Galaxy S-series devices.</p><p>There's some weight to the S26 FE that makes it feel like it's got some solid construction. While lightweight designs are all the rage in certain circles, the extra half ounce the S26 FE has over the A57 goes a long way. Not to mention that the weight is fairly evenly distributed, giving the phone a more balanced feel. The mid-range Samsung feels a little too light for its size, and doesn't balance as well, which means it feels a little more flimsy as a result.</p><h2 id="solid-ai-features">Solid 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="ZpLZgKww3FodYhpzabGRmW" name="Galaxy S26 FE-9" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/ZpLZgKww3FodYhpzabGRmW-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>It isn't a Samsung phone release without AI playing a key role in everything going forward, and the Galaxy S26 FE is no different. Samsung didn't add anything new and exclusive, which shouldn't surprise anyone, but it still added a bunch of Galaxy AI features we've tried and enjoyed on both the Galaxy S26 and 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>Included here is <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>, which follows human beings to turn existing video into something brand new, the literally-named <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>, <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's 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>, <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's AI editing tools,</a> Now Brief and the contextually aware <a href="https://www.tomsguide.com/phones/samsung-phones/how-to-turn-on-galaxy-s26s-now-nudge-and-how-it-works">Now Nudge</a>, as well as the currently Samsung-exclusive <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> upgrade that lets you scan multiple objects at once.</p><p>All of which makes this a solid low-cost choice for those of you that want access to Galaxy AI features.</p><h2 id="good-battery-life">Good 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="NGm4z9bEjvJgmm9rRwkGeW" name="Galaxy S26 FE-5" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/NGm4z9bEjvJgmm9rRwkGeW-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>We haven't been able to do our full battery life test on the Galaxy S26 FE just yet, but I have performed a rougher version to gauge just how much battery is lost when streaming video. That test involved streaming this YouTube video for three hours, with brightness set to 50%. For comparison's sake, I also ran the same test on the Samsung Galaxy S26 and Galaxy A57.</p><p>The Galaxy S26 FE was the worst of the three, which is bizarre considering it has a 4,900 mAh battery. At the end of the video stream it came out with 82%, compared to 85% on the 4,300 mAh Galaxy S26 and 87% on the 5,000 mAh Galaxy A57. That said, with an average battery loss of 6% per hour, that's not a huge amount of battery drain. </p><p>If that power consumption holds steady, it means the Galaxy S26 FE should last almost 17 hours in the same conditions. It's far from the best battery life we've seen, and logic dictates that the regular S26 should last 20 hours. But that should keep you going throughout the day.</p><p>As for charging, the Galaxy S26 FE promises up to 45W wired charging speeds. My USB-C power meter, paired with a 60W charging brick, saw the incoming power hit a high of 41W which is pretty close. As for actual recharging time, I found the S26 FE reached 39% after 15 minutes and 72% after half an hour. </p><p>That's faster than the S26 and A57, and only slightly behind the Galaxy S26 Ultra (77% in 30 minutes). The S26 FE hit 100% charge after 58 and a half minutes during my testing. This means that while the battery life could be better, at least you'll be able to recharge pretty quickly.</p><h2 id="camera-quality-is-mostly-good-for-the-price">Camera quality is (mostly) good for the price</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5uowZSC6w5vq5opwQCLRhW" name="Galaxy S26 FE-4" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/5uowZSC6w5vq5opwQCLRhW-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>Since the Galaxy S26 FE is designed to sit between the Galaxy A57 and Galaxy S26, I decided that the fairest way to test the cameras was to compare all three phones together. To get an idea of just how much of a difference there is when the phones themselves sit a few hundred dollars apart from one another.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/vvWz4QL6os4TmcUzt9cJLB-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/X6PC9VnpBdtbNApWnP6kiR-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/bz2ct4ZeMgwLFXeLAkNUvj-1920-80.jpg" alt="samsung galaxy a57 vs s26 fe photo comparisson" /><figcaption>Samsung Galaxy A57 <small role="credit">Future</small></figcaption></figure></figure><p>With the main camera lens, you can't see a whole lot of difference in the three, or at least you can't see them on my dog sitting in the foreground. At a glance the quality is generally pretty good, but if you look a little closer the A57 dips considerably compared to the S26 FE — which manages to capture more detail (especially in the background) and a higher quality. </p><p>It's a lot closer in quality to the standard S26, though I'd say the flagship model clinches it in terms of overall quality — despite the fact I can't see much difference on the dog.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/7HZtT9KffiatGDn2XZna3B-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/W6C6TNAACMAvB6LTcqXfBR-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ADkZCx2ch5yUmXVDgTPNgj-1920-80.jpg" alt="samsung galaxy a57 vs s26 fe photo comparisson" /><figcaption>Samsung Galaxy A57 <small role="credit">Future</small></figcaption></figure></figure><p>The ultrawide lenses are easily the mostly evenly matched lenses on the three phones, and the quality is surprisingly uniform. I'd go so far as to say that the quality does improve as the price does, and both the S26 FE and S26 highlight the red spray paint a lot more clearly than the A57. However, the actual difference is not that noticeable unless you look super closely.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/sNMoE4cG3HgyqygF3YdpMB-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/YfKgDo5kT4HFoxtR8jAmhR-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Xs43HpzEamRh4KKxDUm7xj-1920-80.jpg" alt="samsung galaxy a57 vs s26 fe photo comparisson" /><figcaption>Samsung Galaxy A57 <small role="credit">Future</small></figcaption></figure></figure><p>Sadly all three phones do a pretty poor job with zoom, no doubt thanks to the A57's lack of optical zoom and the S26 and FE's weak telephoto cameras. The S26 probably has the edge, especially since the S26 FE added a weird warm color hue to the photo, but none of them are particularly great when you crank magnification up to 3x.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/RyH5LazqbXoa6KfJQXtPaA-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/4zpksCZkXtnjaWjkvSRiwQ-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/NYMHdbdzprb4Dusif39AKj-1920-80.jpg" alt="samsung galaxy a57 vs s26 fe photo comparisson" /><figcaption>Samsung Galaxy A57 <small role="credit">Future</small></figcaption></figure></figure><p>Crank things up to 10x magnification and things are a lot worse. The A57 turned the tower into a fuzzy mess, while the S26 and S26 FE are more evenly matched — though not by a lot. The FE seemed to add a bunch of detail that the S26 didn't pick up. But considering the quality of the photo itself, I can't really say that's an improvement.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/w5BiVu5FVhb6wJu4TgNhaA-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Q4Vria3EdVfAKVhhxmDYsQ-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure></figure><p>It's a similar story for both S26 models at 30x zoom — the maximum you can get on both these phones. The S26 FE looks a little washed out, and picked up darker coloring in the bricks, but the actual quality is on par with the standard S26. Though, this is not meant as a compliment.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/4zVycBQwcy7hZd2TAmWoMB-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/XxCQw2B7XzPe96N3ZmjzTR-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/kYkgyHKigTSczvsktoctpj-1920-80.jpg" alt="samsung galaxy a57 vs s26 fe photo comparisson" /><figcaption>Samsung Galaxy A57 <small role="credit">Future</small></figcaption></figure></figure><p>When it comes to selfies, things are much the same. The overall quality isn't bad, but the level of detail you get improves as the phones get more expensive. The A57 is blurrier and captures far less, while the S26 FE looks a little more like a competent photo. However the S26 captures it the best, and you can make out the individual hair strands a lot more easily. Alongside improved background details.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/XAdDhx7JvWWPPgrsBbxjnA-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/JmNoX3Vz3DoqGSjSzMQq3R-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/hMNgeaY2EaBXazvZSoFpXj-1920-80.jpg" alt="samsung galaxy a57 vs s26 fe photo comparisson" /><figcaption>Samsung Galaxy A57 <small role="credit">Future</small></figcaption></figure></figure><p>Weirdly, though, things are a little different when Portrait mode is involved. Somehow the quality on the A57 seems to have been ramped up, to the point where I'd say the sharpness of the photo exceeds that of the S26 FE. Even the S26 seems to be struggling to visualize my facial hair and various facial details that the S26 FE manages without issue.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/vKN2qhBJ7AJBxgVxR953zA-1920-80.jpg" alt="samsung galaxy s26 fe review" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/JS99GzFyVTB8NYbbDzAyQR-1920-80.jpg" alt="Samsung Galaxy S26 photo reviews for FE comparisson" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Lrk3pYB2pksrGoESL9zJij-1920-80.jpg" alt="samsung galaxy a57 vs s26 fe photo comparisson" /><figcaption>Samsung Galaxy A57 <small role="credit">Future</small></figcaption></figure></figure><p>Things are more or less back to normal with low light photography. The S26 comes out on top in the detail department, though the difference between it and the S26 FE is not that severe. The two certainly managed to capture a similar amount of light to illuminate the final product. As for the A57, the quality isn't there and the lighting has been processed in a way that makes the photo look a lot colder. Almost as though the tomato plant is being illuminated by fluorescent lights.</p><p>Overall I'd say the S26 FE sits in a comfortable position between the A57 and the Galaxy S26. The S26 certainly has the edge in most areas, but the quality difference isn't actually that severe compared to the S26 FE's camera. There's also a noticeable difference between the FE and the Galaxy A57, even though the A57 isn't a bad camera for its price tag. </p><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-review-the-downs"><span>Samsung Galaxy S26 FE review: The downs</span></h2><h2 id="minimal-hardware-upgrades">Minimal hardware upgrades</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TKQnPRTkfTFqUX3jQWEAmW" name="Galaxy S26 FE-8" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/TKQnPRTkfTFqUX3jQWEAmW-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 many phones, the Galaxy S26 FE doesn't have a whole lot to offer when it comes to actual upgrades. The differences in comparison to the Galaxy S25 FE are minimal, and the only tangible changes are the upgraded Exynos chipset and the glass enclosure around the rear camera lens.</p><p>The rest of the hardware is basically identical, which shows Samsung is leaning more onto the software upgrades to try and sell the S26 FE. That's not bad, per se, and the S26 FE does have a heck of a lot of useful features you'd normally only find on flagship phones. However, there's no telling how many of those will make their way to S25 FE at some point. </p><p>In that respect, the S26 FE doesn't feel like a "must-have" device. Not unless you have a super-old Fan Edition phone, or some kind of mid-ranger that desperately needs upgrading.</p><h2 id="middling-performance">Middling performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GgBDE9LH5sg9HTudN2huDW" name="LISTGalaxy S26 FE-1-LIST" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/GgBDE9LH5sg9HTudN2huDW-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 it comes to making phones cheap, compromises have to be made, and in the case of the Galaxy S26 FE Samsung appears to have nerfed the performance in a big way. The fact is, while the rest of the S26 series gets the custom Snapdragon 8 Elite Gen 5 for Galaxy chips (or the latest Exynos 2600), the S26 FE is stuck with the Exynos 2500 — a chip that debuted at the start of 2025.</p><p>Obviously this means that the phone does not have the same level of computing or graphics power as more expensive phones. </p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench 6 (Single/Multi)</strong></p></td><td  ><p><strong>Wild Life Extreme Unlimited (Score/FPS)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy S26 FE</strong></p></td><td  ><p>2,444 / 7,958</p></td><td  ><p>5,318 (31.85)</p></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy S26 (Snapdragon)</strong></p></td><td  ><p>3.531 / 10,778</p></td><td  ><p>7,059 (42.27)</p></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy S26 (Exynos)</strong></p></td><td  ><p>3,197 / 11,065</p></td><td  ><p>7,250  (43.42)</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17e</strong></p></td><td  ><p>3,606 / 9,229</p></td><td  ><p>3,997 (23.9)</p></td></tr><tr><td class="firstcol " ><p><strong>Google Pixel 10a</strong></p></td><td  ><p>1,694 / 4,501</p></td><td  ><p>2,667 (15.97)</p></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy A57</strong></p></td><td  ><p>1,385 / 4,508</p></td><td  ><p>1,765 (10.57)</p></td></tr></tbody></table></div><p>As you can see, the Galaxy S26 FE trails quite far behind both variants of the Galaxy S26. Likewise it falls quite far behind the iPhone 17e, which is powered by Apple's A18 chipset. However, the older Apple chipset always struggled with the graphics side of things, which means it lags quite far behind the S26 FE in that area.</p><p>Performance is one area that the S26 FE truly beats out the A57. The mid-range phone's performance is very poor by comparison, especially where graphics are concerned. However, considering the A57 is $150 cheaper, that's not a huge surprise. In any case, if you were hoping for flagship performance from the Galaxy S26 FE, you are out of luck.</p><h2 id="the-a57-isn-39-t-too-far-behind">The A57 isn't too far behind</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iXTaGrvCpggSdsLL3t9osi" name="Galaxy A57--3" alt="samsung galaxy a57 review images" src="https://cdn.mos.cms.futurecdn.net/iXTaGrvCpggSdsLL3t9osi-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>Having tested both the Galaxy A57 and the Galaxy S26 FE, I can tell you that the lived experience of using both phones is very different. That said, the Galaxy A57 is still an excellent phone for its price, and on paper the differences between it and the Galaxy S26 FE are fairly minimal — especially for casual users who prioritize value and battery life over raw power.</p><p>While I personally think the extra $150 you pay for a Galaxy S26 FE is justifiable, my finances are different than yours — and Samsung is going a lot to make its mid-range phones a heck of a lot more appealing. To the point where it's essentially competing with itself on multiple fronts. Frankly, Samsung should have done more to help the S26 FE stand out on its own more, rather than being compared to lesser phones.</p><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-review-verdict"><span>Samsung Galaxy S26 FE 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PcUMJw4EB7neFQeNu97yjW" name="Galaxy S26 FE-3" alt="samsung galaxy s26 fe review shots" src="https://cdn.mos.cms.futurecdn.net/PcUMJw4EB7neFQeNu97yjW-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 didn't have high hopes for the Samsung Galaxy S26 FE when Samsung first announced it. Personally, I felt as though the Fan Edition series was being awkwardly stuffed into a niche that didn't really need to be filled, to its own detriment. But actually using the phone, combined with Samsung's unceremonious price hike for the rest of the S26 series, has softened me up a bit. There's more to a phone than the basic hardware specs, and you don't really get to experience that without having it in your hand.</p><p>The Galaxy S26 FE offers a flagship experience that you just don't get on Samsung's cheaper phones right now. The experience has been nerfed slightly, in order to save money, but you still get a lot of the best parts of having a premium phone without the high price tag. Considering a regular Galaxy S26 now costs $999, the willingness to accept some of those compromises can now save you a bunch of extra money.</p><p>The lack of meaningful updates is not ideal, though, and if Samsung wants the Fan Edition series to continue long into the future, it's going to have to step up and not let it get <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-tipster-says-galaxy-z-flip-9-could-be-cancelled-heres-why-thats-a-terrible-idea">neglected and end up the same way as the Galaxy Z Flip lineup.</a></p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Pre-ordering iPhone Duo? 4 reasons to consider Galaxy Z Fold 8 first ]]></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"><u>iPhone Duo</u></a> is almost here, and there are lots of reasons to snatch up Apple’s first foldable phone come October 16 when pre-orders begin. It gives you a compact 5.4-inch phone and 7.6-inch mini tablet in one device, and it looks like an awesome option for those who want a more immersive viewing experience on the go along with dual-app multitasking — finally!</p><p>But as many in our comments have reminded me, Samsung has been making foldable phones for seven years. And that experience shows in 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>. It has a similar passport-style design to the iPhone Duo, but it offers some pretty unique advantages over Apple’s device and could be the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones"><u>best foldable phone</u></a> for you. If you’re on the fence about getting an iPhone Duo or Galaxy Z Fold 8, here’s where Samsung’s device could sway you.</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/EiAmyzzVhts" allowfullscreen></iframe></div></div><h2 id="1-it-s-considerably-thinner-and-lighter">1. It’s considerably thinner and lighter</h2><p>I only played around with the iPhone Duo for about an hour between various hands-on sessions, but it definitely feels heftier than the Galaxy Z Fold 8. Sure, the iPhone Duo is technically the “thinnest iPhone ever,” at just 5.2 mm unfolded. That’s even less than the <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review"><u>iPhone Air</u></a>’s 5.64mm. However, the Galaxy Z Fold 8 is only 4.5 mm. </p><div class="product"><a data-dimension112="32275f7e-bde0-11f1-82e6-313effd2b2ae" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1649" href="https://www.bestbuy.com/product/samsung-galaxy-z-fold8-256gb-unlocked-graphite/JJGRF3FS98/sku/6681692" 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>The Galaxy Z Fold 8 is one of the best foldable phones we've tested, giving you a 5.5-inch cover display and a huge 7.6-inch main screen in a super light design. Samsung has also done a great job minimizing the crease. Key specs include a 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. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win" data-dimension112="32275f7e-bde0-11f1-82e6-313effd2b2ae" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1649">Galaxy Z Fold 8 review</a>, we called it our favorite Android foldable to date. <a class="view-deal button" href="https://www.bestbuy.com/product/samsung-galaxy-z-fold8-256gb-unlocked-graphite/JJGRF3FS98/sku/6681692" target="_blank" rel="nofollow" data-dimension112="32275f7e-bde0-11f1-82e6-313effd2b2ae" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1649">View Deal</a></p></div><p>When folded, the iPhone Duo measures 11.3mm thick, compared to 9.7mm for the Fold 8. For context, the iPhone 18 Pro Max is 8.75mm thick. So while the Duo will slip into a pocket with ease, it will take up some room. </p><p>In addition, the iPhone Duo weighs 8.96 ounces or 254 grams, while the Fold 8 is a feather light 7.09 ounces (201 grams). Samsung’s foldable is even lighter than the regular iPhone 18 Pro (7.44 ounces), which has a relatively tiny 6.3 inch display compared to the 7.6-inch panel on the Fold 8.</p><h2 id="2-you-can-run-more-apps-at-once">2. You can run more apps at once</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XFCxXSuM9ujaXaBT7dqk2g" name="iphone duo software-2" alt="iPhone Duo software" src="https://cdn.mos.cms.futurecdn.net/XFCxXSuM9ujaXaBT7dqk2g-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 give Apple plenty of credit for making running two apps at once so seamless and intuitive on the iPhone Duo. You just select an app and then place it on the left or right side of the display. From there you can easily create app pairs and go back to them at any time. And it’s also a cinch to switch out apps; you just swipe up and go back to the home screen — it’s like having two distinct desktops.</p><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="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>However, the Galaxy Z Fold 8 can let you run three tiled apps at the same time on screen. So, for example, I could have Gmail in one window, Slack in another and Spotify in another. It’s pretty cool. Plus, Samsung lets you put up to five floating windows on top. Now, eight apps at once seems like overkill to me, but it’s pretty amazing that you have that flexibility.</p><h2 id="3-gemini-ai-is-more-advanced">3. Gemini AI is more advanced</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3236px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="LGcJBsBE5WEHrumKKBqpSV" name="Galaxy Z Fold 8-40" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/LGcJBsBE5WEHrumKKBqpSV-1920-80.jpg" mos="" align="middle" fullscreen="" width="3236" height="1820" attribution="" endorsement="" class="inline"></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/ai/siri-just-got-a-major-ai-upgrade-here-are-5-things-to-try-first"><u>Siri AI</u></a> is definitely improved in iOS 27, and it lets you do some pretty cool things on the iPhone Duo. You get better personal context understanding in all sorts of apps, including Messages and Notes. And there’s on-screen awareness, so you can say things like “add these items to my shopping list.” And I also appreciate that there’s finally a Siri mode in the camera app, so you don’t have to think about performing any shortcuts.</p><p>However, I think Galaxy AI and Gemini on the Galaxy Z Fold 8 are not only more advanced but more tailored to the foldable experience. For example, <a href="https://www.tomsguide.com/phones/samsung-phones/how-to-turn-on-galaxy-s26s-now-nudge-and-how-it-works"><u>Now Nudge</u></a> gives you suggestions in Messages for apps that you can open in split-screen mode, such as Calendar. </p><p>And Gemini itself is just more versatile than Siri AI. You can share your live camera video in real time and get advice and troubleshooting tips. I did this when trying to figure out how to clean out battery corrosion from an outdoor flood light.</p><h2 id="4-it-s-100-cheaper">4. It’s $100 cheaper</h2><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>The Galaxy Fold 8 starts at $1,799, which is $100 less than the iPhone Duo. Plus, there are already some pretty good deals out there. At time of writing I found the <a href="https://www.bestbuy.com/product/samsung-galaxy-z-fold8-256gb-unlocked-graphite/JJGRF3FS98"><u>Fold 8 for just $1,649 on Best Buy</u></a>, which is $250 off.</p><p>I’m sure there will be plenty of <a href="https://www.tomsguide.com/phones/iphones/how-to-save-up-to-usd885-on-the-new-iphone-duo"><u>iPhone Duo pre-order deals</u></a> around Apple’s launch as well, so you should be able to get it at a discount. But as of now the Fold 8 is a better value.</p><h2 id="where-the-iphone-duo-wins">Where the iPhone Duo wins</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5G5fArauMU9aMKnbuB9Dtb" name="iPhone duo edit 2" alt="iPhone Duo hands on" src="https://cdn.mos.cms.futurecdn.net/5G5fArauMU9aMKnbuB9Dtb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As good as Samsung’s foldable is, there are several ways the <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"><u>iPhone Duo beats the Fold 8</u></a>. For example, the iPhone Duo offers an IP68 rating for durability, which means it’s protected from both water and dust. Samsung’s phone is only water resistant.</p><p>In addition, the iPhone Duo offers MagSafe built in for wireless charging, Apple Pencil support and vapor chamber cooling, which will presumably help with sustained performance for Apple’s <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-benchmarks-apple-just-built-the-most-powerful-phones-weve-ever-seen"><u>faster A20 chip</u></a>.</p><p>But Apple’s biggest advantage will likely come with software and apps. The iPhone Duo’s software can react based on the position of the hinge while the Fold 8 lacks Samsung’s Flex Mode. And I expect a sizable wave of Duo optimized apps at launch, including Slack, Netflix and Zoom.</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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DFXjpwrQUPfAW54nMm3Zv9" name="Samsung Galaxy Z Fold 8" alt="In-hand image of Samsung Galaxy Z Fold 8 in folded mode" src="https://cdn.mos.cms.futurecdn.net/DFXjpwrQUPfAW54nMm3Zv9-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 iPhone Duo clearly has the most buzz, and it makes sense because Apple is entering a new category. But I wouldn’t overlook the Galaxy Z Fold 8. It feels so light and thin that it almost seems like Samsung cheated physics. And if you like the idea of multitasking on a big screen, the Fold 8 lets you run more apps at once. And while Siri is smarter than ever, Samsung and Google are in the lead with AI features.</p><p>So which foldable has your interest? Let us know in the comments.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/pre-ordering-iphone-duo-3-big-reasons-to-consider-galaxy-z-fold-8-first</link>
                                                                            <description>
                            <![CDATA[ The iPhone Duo looks great, but the Samsung Galaxy Z Fold 8 has some key advantages over Apple’s first foldable. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Xr4iwawborCaiP3HNuhR3C</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/VGUHEv7t6SSUdQpiN4xMkf-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Fri, 02 Oct 2026 06:30:00 +0000</pubDate>                                                                                                                                <updated>Fri, 02 Oct 2026 18:35:06 +0000</updated>
                                                                                                                                            <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[iPhones]]></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/png" url="https://cdn.mos.cms.futurecdn.net/VGUHEv7t6SSUdQpiN4xMkf-1920-80.png">
                                                            <media:credit><![CDATA[Apple/Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone Duo and Galaxy Z Fold 8]]></media:description>                                                            <media:text><![CDATA[iPhone Duo and Galaxy Z Fold 8]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone Duo and Galaxy Z Fold 8]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/VGUHEv7t6SSUdQpiN4xMkf-1920-80.png" />
                                                                                                                                                                    <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"><u>iPhone Duo</u></a> is almost here, and there are lots of reasons to snatch up Apple’s first foldable phone come October 16 when pre-orders begin. It gives you a compact 5.4-inch phone and 7.6-inch mini tablet in one device, and it looks like an awesome option for those who want a more immersive viewing experience on the go along with dual-app multitasking — finally!</p><p>But as many in our comments have reminded me, Samsung has been making foldable phones for seven years. And that experience shows in 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>. It has a similar passport-style design to the iPhone Duo, but it offers some pretty unique advantages over Apple’s device and could be the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones"><u>best foldable phone</u></a> for you. If you’re on the fence about getting an iPhone Duo or Galaxy Z Fold 8, here’s where Samsung’s device could sway you.</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/EiAmyzzVhts" allowfullscreen></iframe></div></div><h2 id="1-it-s-considerably-thinner-and-lighter">1. It’s considerably thinner and lighter</h2><p>I only played around with the iPhone Duo for about an hour between various hands-on sessions, but it definitely feels heftier than the Galaxy Z Fold 8. Sure, the iPhone Duo is technically the “thinnest iPhone ever,” at just 5.2 mm unfolded. That’s even less than the <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review"><u>iPhone Air</u></a>’s 5.64mm. However, the Galaxy Z Fold 8 is only 4.5 mm. </p><div class="product"><a data-dimension112="32275f7e-bde0-11f1-82e6-313effd2b2ae" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1649" href="https://www.bestbuy.com/product/samsung-galaxy-z-fold8-256gb-unlocked-graphite/JJGRF3FS98/sku/6681692" 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>The Galaxy Z Fold 8 is one of the best foldable phones we've tested, giving you a 5.5-inch cover display and a huge 7.6-inch main screen in a super light design. Samsung has also done a great job minimizing the crease. Key specs include a 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. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win" data-dimension112="32275f7e-bde0-11f1-82e6-313effd2b2ae" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1649">Galaxy Z Fold 8 review</a>, we called it our favorite Android foldable to date. <a class="view-deal button" href="https://www.bestbuy.com/product/samsung-galaxy-z-fold8-256gb-unlocked-graphite/JJGRF3FS98/sku/6681692" target="_blank" rel="nofollow" data-dimension112="32275f7e-bde0-11f1-82e6-313effd2b2ae" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1649">View Deal</a></p></div><p>When folded, the iPhone Duo measures 11.3mm thick, compared to 9.7mm for the Fold 8. For context, the iPhone 18 Pro Max is 8.75mm thick. So while the Duo will slip into a pocket with ease, it will take up some room. </p><p>In addition, the iPhone Duo weighs 8.96 ounces or 254 grams, while the Fold 8 is a feather light 7.09 ounces (201 grams). Samsung’s foldable is even lighter than the regular iPhone 18 Pro (7.44 ounces), which has a relatively tiny 6.3 inch display compared to the 7.6-inch panel on the Fold 8.</p><h2 id="2-you-can-run-more-apps-at-once">2. You can run more apps at once</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XFCxXSuM9ujaXaBT7dqk2g" name="iphone duo software-2" alt="iPhone Duo software" src="https://cdn.mos.cms.futurecdn.net/XFCxXSuM9ujaXaBT7dqk2g-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 give Apple plenty of credit for making running two apps at once so seamless and intuitive on the iPhone Duo. You just select an app and then place it on the left or right side of the display. From there you can easily create app pairs and go back to them at any time. And it’s also a cinch to switch out apps; you just swipe up and go back to the home screen — it’s like having two distinct desktops.</p><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="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>However, the Galaxy Z Fold 8 can let you run three tiled apps at the same time on screen. So, for example, I could have Gmail in one window, Slack in another and Spotify in another. It’s pretty cool. Plus, Samsung lets you put up to five floating windows on top. Now, eight apps at once seems like overkill to me, but it’s pretty amazing that you have that flexibility.</p><h2 id="3-gemini-ai-is-more-advanced">3. Gemini AI is more advanced</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3236px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="LGcJBsBE5WEHrumKKBqpSV" name="Galaxy Z Fold 8-40" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/LGcJBsBE5WEHrumKKBqpSV-1920-80.jpg" mos="" align="middle" fullscreen="" width="3236" height="1820" attribution="" endorsement="" class="inline"></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/ai/siri-just-got-a-major-ai-upgrade-here-are-5-things-to-try-first"><u>Siri AI</u></a> is definitely improved in iOS 27, and it lets you do some pretty cool things on the iPhone Duo. You get better personal context understanding in all sorts of apps, including Messages and Notes. And there’s on-screen awareness, so you can say things like “add these items to my shopping list.” And I also appreciate that there’s finally a Siri mode in the camera app, so you don’t have to think about performing any shortcuts.</p><p>However, I think Galaxy AI and Gemini on the Galaxy Z Fold 8 are not only more advanced but more tailored to the foldable experience. For example, <a href="https://www.tomsguide.com/phones/samsung-phones/how-to-turn-on-galaxy-s26s-now-nudge-and-how-it-works"><u>Now Nudge</u></a> gives you suggestions in Messages for apps that you can open in split-screen mode, such as Calendar. </p><p>And Gemini itself is just more versatile than Siri AI. You can share your live camera video in real time and get advice and troubleshooting tips. I did this when trying to figure out how to clean out battery corrosion from an outdoor flood light.</p><h2 id="4-it-s-100-cheaper">4. It’s $100 cheaper</h2><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>The Galaxy Fold 8 starts at $1,799, which is $100 less than the iPhone Duo. Plus, there are already some pretty good deals out there. At time of writing I found the <a href="https://www.bestbuy.com/product/samsung-galaxy-z-fold8-256gb-unlocked-graphite/JJGRF3FS98"><u>Fold 8 for just $1,649 on Best Buy</u></a>, which is $250 off.</p><p>I’m sure there will be plenty of <a href="https://www.tomsguide.com/phones/iphones/how-to-save-up-to-usd885-on-the-new-iphone-duo"><u>iPhone Duo pre-order deals</u></a> around Apple’s launch as well, so you should be able to get it at a discount. But as of now the Fold 8 is a better value.</p><h2 id="where-the-iphone-duo-wins">Where the iPhone Duo wins</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5G5fArauMU9aMKnbuB9Dtb" name="iPhone duo edit 2" alt="iPhone Duo hands on" src="https://cdn.mos.cms.futurecdn.net/5G5fArauMU9aMKnbuB9Dtb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As good as Samsung’s foldable is, there are several ways the <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"><u>iPhone Duo beats the Fold 8</u></a>. For example, the iPhone Duo offers an IP68 rating for durability, which means it’s protected from both water and dust. Samsung’s phone is only water resistant.</p><p>In addition, the iPhone Duo offers MagSafe built in for wireless charging, Apple Pencil support and vapor chamber cooling, which will presumably help with sustained performance for Apple’s <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-benchmarks-apple-just-built-the-most-powerful-phones-weve-ever-seen"><u>faster A20 chip</u></a>.</p><p>But Apple’s biggest advantage will likely come with software and apps. The iPhone Duo’s software can react based on the position of the hinge while the Fold 8 lacks Samsung’s Flex Mode. And I expect a sizable wave of Duo optimized apps at launch, including Slack, Netflix and Zoom.</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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DFXjpwrQUPfAW54nMm3Zv9" name="Samsung Galaxy Z Fold 8" alt="In-hand image of Samsung Galaxy Z Fold 8 in folded mode" src="https://cdn.mos.cms.futurecdn.net/DFXjpwrQUPfAW54nMm3Zv9-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 iPhone Duo clearly has the most buzz, and it makes sense because Apple is entering a new category. But I wouldn’t overlook the Galaxy Z Fold 8. It feels so light and thin that it almost seems like Samsung cheated physics. And if you like the idea of multitasking on a big screen, the Fold 8 lets you run more apps at once. And while Siri is smarter than ever, Samsung and Google are in the lead with AI features.</p><p>So which foldable has your interest? Let us know in the comments.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ All three Samsung Galaxy S26 phones just got a price hike — here's what you'll pay now ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Samsung has officially increased prices for nearly every single Galaxy S26 model, save for one. And one variant of the S26 Ultra is now $200 more expensive.</p><p>It's essentially the second price hike for the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review">Galaxy S26</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-plus-review">S26 Plus </a>since both models received $100 increases at launch compared to the S25 versions.  At the time, the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review?utm_source=google&utm_medium=h5d&utm_campaign=h_tg_00265&gad_source=1&gad_campaignid=22446790454&gbraid=0AAAAAqzfqMYUYOJH644gMM-7yoaUrC3zQ&gclid=CjwKCAjwifjVBhBKEiwAYx4K9C1ClQ6gU72UdFLoWi-FBAP4ugPMmiTVAWlq4Q_0dtJEXmjlHLn-KBoCdSwQAvD_BwE">Galaxy S26 Ultra</a> models retained the same $1,299 starting cost.</p><p>Only the more recently announced <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-fe-review">Galaxy S26 FE</a> kept its launch price, though it is $50 more expensive than the S25 FE.</p><div ><table><caption>Samsung Galaxy S26 series starting prices</caption><thead><tr><th class="firstcol " ><p>Model</p></th><th  ><p>Old Price</p></th><th  ><p>New Price</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Galaxy S26</strong></p></td><td  ><p>$899</p></td><td  ><p>$999</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Plus</strong></p></td><td  ><p>$1,099</p></td><td  ><p>$1,199</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>$1,299</p></td><td  ><p>$1,399</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 FE</strong></p></td><td  ><p>$699</p></td><td  ><p>No change</p></td></tr></tbody></table></div><p>The prices listed are for the starting 256GB versions of each model. The 512GB versions of the S26 and S26 Plus now costs $1,199 and $1,399, respectively. </p><p>The Ultra models are now $1,599 for the 512GB variant and $1,999 for the 1TB, a $200 increase over the previous price.</p><p>In March, Samsung <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-on-galaxy-s26-and-galaxy-s26-plus-usd100-price-hike-weve-packed-in-so-much-innovation">justified the first price increase</a> by emphasizing upgrades and innovation, though company executives also admitted the ongoing AI-created RAMageddon was to blame. Unfortunately, the RAM crisis isn't going away anytime soon, and <a href="https://www.tomsguide.com/computing/hardware/sk-hynix-warns-2027-will-be-worst-year-for-ram-prices-right-as-a-damning-report-reveals-something-that-will-add-fuel-to-the-price-fixing-lawsuit">2027 is expected to be worse</a> by some than this year.</p><p>Next year's Galaxy S27 was just <a href="https://www.tomsguide.com/phones/samsung-phones/all-three-galaxy-s27-models-tipped-for-price-hike-and-a-key-spec-for-the-s27-ultra-just-leaked">tipped for a price hike</a>, but hopefully that's based on the original S26 prices and not these new ones.</p><h2 id="what-to-do-if-you-need-a-new-samsung-phone">What to do if you need a new Samsung phone</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4081px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="GK5hNnnCmuZ6u8oa8EHBT9" name="Galaxy S26 Ultra vs Galaxy S26" alt="Galaxy S26 Ultra vs Galaxy S26." src="https://cdn.mos.cms.futurecdn.net/GK5hNnnCmuZ6u8oa8EHBT9-1920-80.jpg" mos="" align="middle" fullscreen="" width="4081" height="2296" 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>If you are in the market for a smartphone, my recommendation is wait for sales and big discounts. Never pay full price. </p><p>Otherwise, Samsung offers cheaper, capable phones like its <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-a57-review">Galaxy A57 series </a>that starts at $549. In the meantime, <a href="https://www.amazon.com/dp/B0G4SZ6SJY" target="_blank">Amazon is still offering</a> the Galaxy S26 Ultra at the original price. That also includes some colors of <a href="https://www.amazon.com/dp/B0G4SYJK4G" target="_blank">the S26 </a>and the <a href="https://www.amazon.com/dp/B0G4SYZVKC" target="_blank">S26 Plus</a>.</p><p>Or, if you wait a week, <a href="https://www.tomsguide.com/sales-events/29-amazon-deals-already-50-percent-off-or-more-ahead-of-october-prime-day-shop-ring-asics-carhartt-and-more">Amazon's Prime Day sale</a> is scheduled to kick off on October 6, and that sale usually features deep discounts on everything, including Samsung's flagship phones.</p><p>Or there's Black Friday and Cyber Monday just after Thanksgiving. Either way, the infuriating trend of ever increasing smartphone prices continues.</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-review-wide-for-the-win"><strong>Samsung Galaxy Z Fold 8 review: The best Android foldable for most people</strong></a></li><li><a href="https://www.tomsguide.com/phones/i-checked-out-the-new-samsung-smarttag3-heres-why-this-tracker-could-be-a-game-changer"><strong>I checked out the new Samsung SmartTag3 — here’s why this tracker could be a game-changer</strong></a></li><li><a href="https://www.tomsguide.com/best-picks/best-samsung-phone"><strong>The best Samsung phone might not be the best for you — take our quiz to find out which you should buy</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/usd1-400-galaxy-s26-ultra-every-samsung-galaxy-s26-phone-just-got-a-price-hike</link>
                                                                            <description>
                            <![CDATA[ Nearly every Galaxy S26 phone just got a price hike. Here's what you'll pay now for a new Samsung handset. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">KzWMqL7wqzapJarBVgvGtL</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/s3XUvEEb34HgD8A5D8wyRM-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 01 Oct 2026 20:09:16 +0000</pubDate>                                                                                                                                <updated>Thu, 01 Oct 2026 21:40:10 +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/s3XUvEEb34HgD8A5D8wyRM-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/s3XUvEEb34HgD8A5D8wyRM-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung has officially increased prices for nearly every single Galaxy S26 model, save for one. And one variant of the S26 Ultra is now $200 more expensive.</p><p>It's essentially the second price hike for the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review">Galaxy S26</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-plus-review">S26 Plus </a>since both models received $100 increases at launch compared to the S25 versions.  At the time, the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review?utm_source=google&utm_medium=h5d&utm_campaign=h_tg_00265&gad_source=1&gad_campaignid=22446790454&gbraid=0AAAAAqzfqMYUYOJH644gMM-7yoaUrC3zQ&gclid=CjwKCAjwifjVBhBKEiwAYx4K9C1ClQ6gU72UdFLoWi-FBAP4ugPMmiTVAWlq4Q_0dtJEXmjlHLn-KBoCdSwQAvD_BwE">Galaxy S26 Ultra</a> models retained the same $1,299 starting cost.</p><p>Only the more recently announced <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-fe-review">Galaxy S26 FE</a> kept its launch price, though it is $50 more expensive than the S25 FE.</p><div ><table><caption>Samsung Galaxy S26 series starting prices</caption><thead><tr><th class="firstcol " ><p>Model</p></th><th  ><p>Old Price</p></th><th  ><p>New Price</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Galaxy S26</strong></p></td><td  ><p>$899</p></td><td  ><p>$999</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Plus</strong></p></td><td  ><p>$1,099</p></td><td  ><p>$1,199</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>$1,299</p></td><td  ><p>$1,399</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 FE</strong></p></td><td  ><p>$699</p></td><td  ><p>No change</p></td></tr></tbody></table></div><p>The prices listed are for the starting 256GB versions of each model. The 512GB versions of the S26 and S26 Plus now costs $1,199 and $1,399, respectively. </p><p>The Ultra models are now $1,599 for the 512GB variant and $1,999 for the 1TB, a $200 increase over the previous price.</p><p>In March, Samsung <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-on-galaxy-s26-and-galaxy-s26-plus-usd100-price-hike-weve-packed-in-so-much-innovation">justified the first price increase</a> by emphasizing upgrades and innovation, though company executives also admitted the ongoing AI-created RAMageddon was to blame. Unfortunately, the RAM crisis isn't going away anytime soon, and <a href="https://www.tomsguide.com/computing/hardware/sk-hynix-warns-2027-will-be-worst-year-for-ram-prices-right-as-a-damning-report-reveals-something-that-will-add-fuel-to-the-price-fixing-lawsuit">2027 is expected to be worse</a> by some than this year.</p><p>Next year's Galaxy S27 was just <a href="https://www.tomsguide.com/phones/samsung-phones/all-three-galaxy-s27-models-tipped-for-price-hike-and-a-key-spec-for-the-s27-ultra-just-leaked">tipped for a price hike</a>, but hopefully that's based on the original S26 prices and not these new ones.</p><h2 id="what-to-do-if-you-need-a-new-samsung-phone">What to do if you need a new Samsung phone</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4081px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="GK5hNnnCmuZ6u8oa8EHBT9" name="Galaxy S26 Ultra vs Galaxy S26" alt="Galaxy S26 Ultra vs Galaxy S26." src="https://cdn.mos.cms.futurecdn.net/GK5hNnnCmuZ6u8oa8EHBT9-1920-80.jpg" mos="" align="middle" fullscreen="" width="4081" height="2296" 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>If you are in the market for a smartphone, my recommendation is wait for sales and big discounts. Never pay full price. </p><p>Otherwise, Samsung offers cheaper, capable phones like its <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-a57-review">Galaxy A57 series </a>that starts at $549. In the meantime, <a href="https://www.amazon.com/dp/B0G4SZ6SJY" target="_blank">Amazon is still offering</a> the Galaxy S26 Ultra at the original price. That also includes some colors of <a href="https://www.amazon.com/dp/B0G4SYJK4G" target="_blank">the S26 </a>and the <a href="https://www.amazon.com/dp/B0G4SYZVKC" target="_blank">S26 Plus</a>.</p><p>Or, if you wait a week, <a href="https://www.tomsguide.com/sales-events/29-amazon-deals-already-50-percent-off-or-more-ahead-of-october-prime-day-shop-ring-asics-carhartt-and-more">Amazon's Prime Day sale</a> is scheduled to kick off on October 6, and that sale usually features deep discounts on everything, including Samsung's flagship phones.</p><p>Or there's Black Friday and Cyber Monday just after Thanksgiving. Either way, the infuriating trend of ever increasing smartphone prices continues.</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-review-wide-for-the-win"><strong>Samsung Galaxy Z Fold 8 review: The best Android foldable for most people</strong></a></li><li><a href="https://www.tomsguide.com/phones/i-checked-out-the-new-samsung-smarttag3-heres-why-this-tracker-could-be-a-game-changer"><strong>I checked out the new Samsung SmartTag3 — here’s why this tracker could be a game-changer</strong></a></li><li><a href="https://www.tomsguide.com/best-picks/best-samsung-phone"><strong>The best Samsung phone might not be the best for you — take our quiz to find out which you should buy</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ All three Galaxy S27 models tipped for price hike — and a key spec for the S27 Ultra just leaked ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Everything seems to be getting more expensive, and that's especially true when it comes to phones and other electronics. Production and component costs are on the rise, particularly RAM and storage, and that means the price increases getting passed on to us. Sadly, it seems as though the Galaxy S27 might be the next big phone to hike prices.</p><p>We've already heard rumors that the S27 Ultra could get a $100 price increase, which would mean <strong>prices start at $1,400 for the S27 UIltra</strong> instead of the current $1,300. However, the latest murmurs from the rumor mill suggest that the entire Galaxy S27 lineup could get a price increase. Again.</p><h2 id="galaxy-s27-price-hikes-across-the-board">Galaxy S27 Price hikes across the board</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4764px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="VAHvBkwzBN4PiKFx8EcuoW" name="Samsung Galaxy S26 review" alt="Samsung Galaxy S26 held in the hand." src="https://cdn.mos.cms.futurecdn.net/VAHvBkwzBN4PiKFx8EcuoW-1920-80.jpg" mos="" align="middle" fullscreen="" width="4764" height="2680" 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 rumor itself comes from a blog on Korean social media site <a href="https://blog.naver.com/yeux1122/224426981973" target="_blank">Naver</a>, and specifically blames the alleged price hike on the extortionate cost of memory. Apparently, Samsung can't absorb the price increases the way it used to, and that means the cost of S27 models is going up in the Korean market. </p><p>This doesn't necessarily mean that prices will be going up in other regions. That said, if a Korean price hike is tied to RAMageddon costs, it seems unlikely that Samsung would give other markets a pass. Then again, stranger things have happened.</p><p><strong>The base price increase is said to be in the "higher 130,000 won range" which is roughly $95 at the current exchange rate. </strong>The cost to upgrade your storage is said to be going up as well, though the exact price change isn't detailed. </p><p>Currently, an upgrade from 256GB to 512GB is an extra $200, while S26 Ultra owners are expected to pay another $400 on top of that if they want a 1TB model — or $600 more than a 256GB model. </p><p>That's quite a lot, especially when those sorts of upgrades used to be as little as $100 in recent years. The prospect of another storage price increase cements my opinion that <a href="https://www.tomsguide.com/phones/high-storage-phones-are-feeling-more-like-a-scam-than-ever-how-to-avoid-overpaying">high storage phones are a scam.</a></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W3Yd8X"></div>                            </div>                            <script src="https://kwizly.com/embed/W3Yd8X.js" async></script><h2 id="the-s27-ultra-could-be-even-heavier-too">The S27 Ultra could be even heavier, too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LacgYzjqWKVkFAs6DKZ3ak" name="S27 Ultra render" alt="Samsung Galaxy S27 Ultra render" src="https://cdn.mos.cms.futurecdn.net/LacgYzjqWKVkFAs6DKZ3ak-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: @TechHome100)</span></figcaption></figure><p>The price isn't the only thing about the Galaxy S27 Ultra that could be increasing. A new rumor, courtesy of<a href="https://x.com/UniverseIce/status/2105251565951218031" target="_blank"> Ice Universe,</a> claims that the phone will weigh 218 grams (7.69 ounces), which is four grams more than the Galaxy S26 Ultra. However, the thickness will apparently stay the same 7.9mm (0.31-inches) for another year.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2105251565951218031"><p lang="en" dir="ltr">Galaxy S27 Ultra 7.9mm 218g<a href="https://twitter.com/cantworkitout/status/2105251565951218031">September 30, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Ice Universe has a solid track record when it comes to Samsung leaks, but there's always a chance that he's wrong. However, if we take them at their word, those few extra grams have to come from somewhere. The question is, what is causing the extra weight to be piled onto the phone? Especially with rumors claiming that Samsung is <a href="https://www.tomsguide.com/phones/samsung-phones/the-samsung-galaxy-s27-ultra-could-ditch-the-redundant-3x-zoom-for-this-much-bigger-camera-upgrade">removing features like the secondary telephoto lens</a>.</p><p>The most obvious answer could be the battery. Samsung is expected to <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-ultra-leak-reveals-silicon-carbon-battery-leap-but-also-a-camera-downgrade">utilize silicon carbon batteries</a>, just as it did with 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> series, allowing it to add more battery capacity into the same size. That would explain the lack of extra thickness, and the minimal weight increase. The battery itself is rumored to be 5,700 mAh, compared to S26 Ultra's 5,000 mAh power pack.</p><p>Samsung is also rumored to be adding magnets to the back of its phone, and facilitating the<a href="https://www.tomsguide.com/phones/what-is-qi2-wireless-charging"> full Qi2 wireless charging experience</a>. This would allow users to use magnetic chargers and accessories without using a special case, much like you can do on iPhones and recent Pixel flagships.</p><p>We don't know how heavy Qi2 or MagSafe magnets actually are, but they don't weigh nothing.</p><p>The Qi2-enabled <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-pro-xl-review">Pixel 10 Pro XL </a>was 11 grams heavier than the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-9-pro-xl-review">Pixel 9 Pro XL</a>, but the <a href="https://www.tomsguide.com/reviews/iphone-12-pro-max">iPhone 12 Pro Max</a> was just two grams heavier than the MagSafe-free<a href="https://www.tomsguide.com/reviews/iphone-11-pro-max"> iPhone 11 Pro Max</a>. </p><p>The Galaxy S27 series is expected to launch in early 2027, and in the meantime you can check out our story on <a href="https://www.tomsguide.com/phones/samsung-phones/5-ways-galaxy-s27-ultra-can-beat-the-iphone-18-pro-and-2-ways-apple-will-still-win">all the different ways it could beat the new iPhone 18 Pro.</a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/scammers-are-using-iphone-duo-pre-orders-to-try-and-steal-your-passwords-heres-how-to-stay-safe">Scammers are using iPhone Duo pre-orders to try and steal your passwords — here's how to stay safe</a></li><li><a href="https://www.tomsguide.com/phones/i-tore-my-living-room-apart-looking-for-the-apple-tv-remote-my-son-hid-but-this-hidden-iphone-feature-saved-the-day">I tore my living room apart looking for the Apple TV remote my son hid — until this iPhone feature saved the day</a></li><li><a href="https://www.tomsguide.com/phones/i-checked-out-the-new-samsung-smarttag3-heres-why-this-tracker-could-be-a-game-changer">I checked out the new Samsung SmartTag3 — here’s why this tracker could be a game-changer</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/all-three-galaxy-s27-models-tipped-for-price-hike-and-a-key-spec-for-the-s27-ultra-just-leaked</link>
                                                                            <description>
                            <![CDATA[ The Galaxy S27 Ultra could come with a higher price tag, and a heavier profile — here's what we know. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">cToohQswCUpTrEiph5TEpW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EKbAbDHJQJnhBVmx9jUbiC-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 01 Oct 2026 11:30:42 +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/EKbAbDHJQJnhBVmx9jUbiC-1920-80.jpg">
                                                            <media:credit><![CDATA[Ice Universe]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy S27 Ultra render]]></media:description>                                                            <media:text><![CDATA[Galaxy S27 Ultra render]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy S27 Ultra render]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EKbAbDHJQJnhBVmx9jUbiC-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Everything seems to be getting more expensive, and that's especially true when it comes to phones and other electronics. Production and component costs are on the rise, particularly RAM and storage, and that means the price increases getting passed on to us. Sadly, it seems as though the Galaxy S27 might be the next big phone to hike prices.</p><p>We've already heard rumors that the S27 Ultra could get a $100 price increase, which would mean <strong>prices start at $1,400 for the S27 UIltra</strong> instead of the current $1,300. However, the latest murmurs from the rumor mill suggest that the entire Galaxy S27 lineup could get a price increase. Again.</p><h2 id="galaxy-s27-price-hikes-across-the-board">Galaxy S27 Price hikes across the board</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4764px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="VAHvBkwzBN4PiKFx8EcuoW" name="Samsung Galaxy S26 review" alt="Samsung Galaxy S26 held in the hand." src="https://cdn.mos.cms.futurecdn.net/VAHvBkwzBN4PiKFx8EcuoW-1920-80.jpg" mos="" align="middle" fullscreen="" width="4764" height="2680" 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 rumor itself comes from a blog on Korean social media site <a href="https://blog.naver.com/yeux1122/224426981973" target="_blank">Naver</a>, and specifically blames the alleged price hike on the extortionate cost of memory. Apparently, Samsung can't absorb the price increases the way it used to, and that means the cost of S27 models is going up in the Korean market. </p><p>This doesn't necessarily mean that prices will be going up in other regions. That said, if a Korean price hike is tied to RAMageddon costs, it seems unlikely that Samsung would give other markets a pass. Then again, stranger things have happened.</p><p><strong>The base price increase is said to be in the "higher 130,000 won range" which is roughly $95 at the current exchange rate. </strong>The cost to upgrade your storage is said to be going up as well, though the exact price change isn't detailed. </p><p>Currently, an upgrade from 256GB to 512GB is an extra $200, while S26 Ultra owners are expected to pay another $400 on top of that if they want a 1TB model — or $600 more than a 256GB model. </p><p>That's quite a lot, especially when those sorts of upgrades used to be as little as $100 in recent years. The prospect of another storage price increase cements my opinion that <a href="https://www.tomsguide.com/phones/high-storage-phones-are-feeling-more-like-a-scam-than-ever-how-to-avoid-overpaying">high storage phones are a scam.</a></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W3Yd8X"></div>                            </div>                            <script src="https://kwizly.com/embed/W3Yd8X.js" async></script><h2 id="the-s27-ultra-could-be-even-heavier-too">The S27 Ultra could be even heavier, too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LacgYzjqWKVkFAs6DKZ3ak" name="S27 Ultra render" alt="Samsung Galaxy S27 Ultra render" src="https://cdn.mos.cms.futurecdn.net/LacgYzjqWKVkFAs6DKZ3ak-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: @TechHome100)</span></figcaption></figure><p>The price isn't the only thing about the Galaxy S27 Ultra that could be increasing. A new rumor, courtesy of<a href="https://x.com/UniverseIce/status/2105251565951218031" target="_blank"> Ice Universe,</a> claims that the phone will weigh 218 grams (7.69 ounces), which is four grams more than the Galaxy S26 Ultra. However, the thickness will apparently stay the same 7.9mm (0.31-inches) for another year.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2105251565951218031"><p lang="en" dir="ltr">Galaxy S27 Ultra 7.9mm 218g<a href="https://twitter.com/cantworkitout/status/2105251565951218031">September 30, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Ice Universe has a solid track record when it comes to Samsung leaks, but there's always a chance that he's wrong. However, if we take them at their word, those few extra grams have to come from somewhere. The question is, what is causing the extra weight to be piled onto the phone? Especially with rumors claiming that Samsung is <a href="https://www.tomsguide.com/phones/samsung-phones/the-samsung-galaxy-s27-ultra-could-ditch-the-redundant-3x-zoom-for-this-much-bigger-camera-upgrade">removing features like the secondary telephoto lens</a>.</p><p>The most obvious answer could be the battery. Samsung is expected to <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-ultra-leak-reveals-silicon-carbon-battery-leap-but-also-a-camera-downgrade">utilize silicon carbon batteries</a>, just as it did with 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> series, allowing it to add more battery capacity into the same size. That would explain the lack of extra thickness, and the minimal weight increase. The battery itself is rumored to be 5,700 mAh, compared to S26 Ultra's 5,000 mAh power pack.</p><p>Samsung is also rumored to be adding magnets to the back of its phone, and facilitating the<a href="https://www.tomsguide.com/phones/what-is-qi2-wireless-charging"> full Qi2 wireless charging experience</a>. This would allow users to use magnetic chargers and accessories without using a special case, much like you can do on iPhones and recent Pixel flagships.</p><p>We don't know how heavy Qi2 or MagSafe magnets actually are, but they don't weigh nothing.</p><p>The Qi2-enabled <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-pro-xl-review">Pixel 10 Pro XL </a>was 11 grams heavier than the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-9-pro-xl-review">Pixel 9 Pro XL</a>, but the <a href="https://www.tomsguide.com/reviews/iphone-12-pro-max">iPhone 12 Pro Max</a> was just two grams heavier than the MagSafe-free<a href="https://www.tomsguide.com/reviews/iphone-11-pro-max"> iPhone 11 Pro Max</a>. </p><p>The Galaxy S27 series is expected to launch in early 2027, and in the meantime you can check out our story on <a href="https://www.tomsguide.com/phones/samsung-phones/5-ways-galaxy-s27-ultra-can-beat-the-iphone-18-pro-and-2-ways-apple-will-still-win">all the different ways it could beat the new iPhone 18 Pro.</a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/scammers-are-using-iphone-duo-pre-orders-to-try-and-steal-your-passwords-heres-how-to-stay-safe">Scammers are using iPhone Duo pre-orders to try and steal your passwords — here's how to stay safe</a></li><li><a href="https://www.tomsguide.com/phones/i-tore-my-living-room-apart-looking-for-the-apple-tv-remote-my-son-hid-but-this-hidden-iphone-feature-saved-the-day">I tore my living room apart looking for the Apple TV remote my son hid — until this iPhone feature saved the day</a></li><li><a href="https://www.tomsguide.com/phones/i-checked-out-the-new-samsung-smarttag3-heres-why-this-tracker-could-be-a-game-changer">I checked out the new Samsung SmartTag3 — here’s why this tracker could be a game-changer</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I checked out the new Samsung SmartTag3 — here’s why this tracker could be a game-changer ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Samsung SmartTag3 will soon be here to give <a href="https://www.tomsguide.com/phones/airtag-vs-airtag-2-should-you-upgrade">Apple AirTags</a> a run for their money. This is especially true since Samsung’s upcoming smart trackers now offer cross-OS support. That level of universality should make them more appealing no matter your preferred platform.</p><p>During a recent Samsung event, I went hands-on with the SmartTag3 and was impressed by its new features and compact design. It also didn’t hurt that a cute dog was at the event to show how the tags benefit pet owners. But whether it’s your fur baby or your luggage, SmartTag3 should help you keep track of your precious items.</p><p>Here’s what I think of the Samsung SmartTag 3.</p><h2 id="samsung-smarttag3-price-and-availability">Samsung SmartTag3: Price and availability</h2><p>Just in time for the holiday season, the Samsung Galaxy SmartTag3 will be available in the U.S. in early November. A one-pack will cost $29, and a four-pack will be $99. Tags will be available in White and Black.</p><p>Additionally, Samsung will offer new official accessories for its tags. These include a Silicone Case with a keyring and a Loop Case. Pricing has yet to be announced.</p><h2 id="samsung-smarttag3-design">Samsung SmartTag3: Design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NiNUhRugrP9B35XDgXBoeD" name="Samsung SmartTag3--1-LEDE" alt="Samsung SmartTag 3" src="https://cdn.mos.cms.futurecdn.net/NiNUhRugrP9B35XDgXBoeD-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>Instead of a key fob design like the Galaxy SmartTag 2, the new SmartTag3 resembles a small puck. It’s now about 35% smaller by volume and 33% lighter than the previous model. That makes it easy to attach the tags to keys, small bags, luggage, or even your pet’s collar. </p><p>The rounded tag also features an aluminum-decorated button, giving it a more elegant look and a durable feel.</p><p>I like how the tags are elegant yet unobtrusive. Whether you place them on your backpack or your dog’s collar, they won’t look out of place. They also feel nice to hold thanks to their smooth texture.</p><h2 id="samsung-smarttag3-core-features">Samsung SmartTag3: Core 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="hrNvwVsxKLmPXPfA6ybtLH" name="Samsung SmartTag3--3" alt="Samsung SmartTag3" src="https://cdn.mos.cms.futurecdn.net/hrNvwVsxKLmPXPfA6ybtLH-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of the biggest new features, and a first for the Galaxy SmartTag lineup, is cross-OS compatibility for Galaxy and iOS devices. Samsung says this will make it easier for families and groups to access core finding and sharing features across platforms. In other words, if you’re an iPhone user, the SmartTag3 will work with your phone.</p><p>Via SmartThings Find, you can check and share a tag’s location and use Search Nearby across supported devices. So if a family member borrows your bookbag, you can check its location and use supported finding features from your Galaxy or iPhone.</p><p>If you’ve lost track of something in your home, you can use Compass View to help find it. Acting like one of the trackers in the Alien movies (minus the monsters), Compass View provides distance and directional guidance from up to 60 meters away, which is about three times farther than the previous model. As you get closer, you’ll see a circle on the app begin to fill, and it will fill when you’re in the target location.</p><p>What happens when the SmartTag3 moves outside the connection range? That’s where the Galaxy Find Network kicks in to keep the search going. As Samsung explained, more than 900 million participating Galaxy devices worldwide can act as finding nodes to detect the SmartTag3 and update its location beyond your phone’s reach.</p><p>Samsung’s smart tags also tell you when objects or pets move from their usual areas via the Place Notification feature. This saves you from constantly checking whether something has moved. If it does, you’ll be notified. Location History also lets you review where your tag has been, while the Movement Detection Alert feature notifies you when movement is detected.</p><p>Lastly, the SmartTag3 promises up to 550 days of battery life under normal use and up to 790 days in power-saving mode. Since Apple’s Smart Tags last about a year (365 days), this is another reason for Apple users to consider Samsung’s SmartTag.</p><h2 id="outlook">Outlook</h2><p>Samsung has stepped things up with the SmartTag 3, making it more useful for tracking the things you don’t want to lose. Cross-OS support is arguably the biggest new feature, as it opens up these trackers to folks outside the Samsung ecosystem.</p><p>As an iPhone user myself, I’m impressed by what I saw and would gladly give these smart trackers a shot. You all can too, as November is just around the corner. Stay tuned for more!</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/i-held-the-pixel-tag-and-it-does-one-critical-thing-that-the-airtag-doesnt-heres-what-it-is"><strong>I held the Pixel Tag and it does one critical thing that the AirTag doesn’t — here’s what it is</strong></a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/after-10-years-of-pixels-why-is-google-still-making-phones"><strong>After 10 years of Pixels, why is Google still making phones?</strong></a></li><li><a href="https://www.tomsguide.com/vehicle-tech/i-tested-google-maps-immersive-navigation-for-2-weeks-and-it-makes-seeing-tricky-exits-a-breeze-on-apple-carplay-and-android-auto"><strong>I tested Google Maps Immersive Navigation for 2 weeks — and it makes seeing tricky exits a breeze on Apple CarPlay and Android Auto</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/i-checked-out-the-new-samsung-smarttag3-heres-why-this-tracker-could-be-a-game-changer</link>
                                                                            <description>
                            <![CDATA[ The new Samsung SmartTag3 features a new, compact design and a host of useful and intuitive tracking features. Here are my initial thoughts. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">anPNERM8cKHcn56YMrKCqJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/whyxTfsfMpZ2MLrqQc48r8-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 30 Sep 2026 12:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/whyxTfsfMpZ2MLrqQc48r8-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung SmartTag3]]></media:description>                                                            <media:text><![CDATA[Samsung SmartTag3]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung SmartTag3]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/whyxTfsfMpZ2MLrqQc48r8-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Samsung SmartTag3 will soon be here to give <a href="https://www.tomsguide.com/phones/airtag-vs-airtag-2-should-you-upgrade">Apple AirTags</a> a run for their money. This is especially true since Samsung’s upcoming smart trackers now offer cross-OS support. That level of universality should make them more appealing no matter your preferred platform.</p><p>During a recent Samsung event, I went hands-on with the SmartTag3 and was impressed by its new features and compact design. It also didn’t hurt that a cute dog was at the event to show how the tags benefit pet owners. But whether it’s your fur baby or your luggage, SmartTag3 should help you keep track of your precious items.</p><p>Here’s what I think of the Samsung SmartTag 3.</p><h2 id="samsung-smarttag3-price-and-availability">Samsung SmartTag3: Price and availability</h2><p>Just in time for the holiday season, the Samsung Galaxy SmartTag3 will be available in the U.S. in early November. A one-pack will cost $29, and a four-pack will be $99. Tags will be available in White and Black.</p><p>Additionally, Samsung will offer new official accessories for its tags. These include a Silicone Case with a keyring and a Loop Case. Pricing has yet to be announced.</p><h2 id="samsung-smarttag3-design">Samsung SmartTag3: Design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NiNUhRugrP9B35XDgXBoeD" name="Samsung SmartTag3--1-LEDE" alt="Samsung SmartTag 3" src="https://cdn.mos.cms.futurecdn.net/NiNUhRugrP9B35XDgXBoeD-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>Instead of a key fob design like the Galaxy SmartTag 2, the new SmartTag3 resembles a small puck. It’s now about 35% smaller by volume and 33% lighter than the previous model. That makes it easy to attach the tags to keys, small bags, luggage, or even your pet’s collar. </p><p>The rounded tag also features an aluminum-decorated button, giving it a more elegant look and a durable feel.</p><p>I like how the tags are elegant yet unobtrusive. Whether you place them on your backpack or your dog’s collar, they won’t look out of place. They also feel nice to hold thanks to their smooth texture.</p><h2 id="samsung-smarttag3-core-features">Samsung SmartTag3: Core 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="hrNvwVsxKLmPXPfA6ybtLH" name="Samsung SmartTag3--3" alt="Samsung SmartTag3" src="https://cdn.mos.cms.futurecdn.net/hrNvwVsxKLmPXPfA6ybtLH-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of the biggest new features, and a first for the Galaxy SmartTag lineup, is cross-OS compatibility for Galaxy and iOS devices. Samsung says this will make it easier for families and groups to access core finding and sharing features across platforms. In other words, if you’re an iPhone user, the SmartTag3 will work with your phone.</p><p>Via SmartThings Find, you can check and share a tag’s location and use Search Nearby across supported devices. So if a family member borrows your bookbag, you can check its location and use supported finding features from your Galaxy or iPhone.</p><p>If you’ve lost track of something in your home, you can use Compass View to help find it. Acting like one of the trackers in the Alien movies (minus the monsters), Compass View provides distance and directional guidance from up to 60 meters away, which is about three times farther than the previous model. As you get closer, you’ll see a circle on the app begin to fill, and it will fill when you’re in the target location.</p><p>What happens when the SmartTag3 moves outside the connection range? That’s where the Galaxy Find Network kicks in to keep the search going. As Samsung explained, more than 900 million participating Galaxy devices worldwide can act as finding nodes to detect the SmartTag3 and update its location beyond your phone’s reach.</p><p>Samsung’s smart tags also tell you when objects or pets move from their usual areas via the Place Notification feature. This saves you from constantly checking whether something has moved. If it does, you’ll be notified. Location History also lets you review where your tag has been, while the Movement Detection Alert feature notifies you when movement is detected.</p><p>Lastly, the SmartTag3 promises up to 550 days of battery life under normal use and up to 790 days in power-saving mode. Since Apple’s Smart Tags last about a year (365 days), this is another reason for Apple users to consider Samsung’s SmartTag.</p><h2 id="outlook">Outlook</h2><p>Samsung has stepped things up with the SmartTag 3, making it more useful for tracking the things you don’t want to lose. Cross-OS support is arguably the biggest new feature, as it opens up these trackers to folks outside the Samsung ecosystem.</p><p>As an iPhone user myself, I’m impressed by what I saw and would gladly give these smart trackers a shot. You all can too, as November is just around the corner. Stay tuned for more!</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/i-held-the-pixel-tag-and-it-does-one-critical-thing-that-the-airtag-doesnt-heres-what-it-is"><strong>I held the Pixel Tag and it does one critical thing that the AirTag doesn’t — here’s what it is</strong></a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/after-10-years-of-pixels-why-is-google-still-making-phones"><strong>After 10 years of Pixels, why is Google still making phones?</strong></a></li><li><a href="https://www.tomsguide.com/vehicle-tech/i-tested-google-maps-immersive-navigation-for-2-weeks-and-it-makes-seeing-tricky-exits-a-breeze-on-apple-carplay-and-android-auto"><strong>I tested Google Maps Immersive Navigation for 2 weeks — and it makes seeing tricky exits a breeze on Apple CarPlay and Android Auto</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy S27 Ultra may scrap the 10MP telephoto lens — and there's no word of a replacement ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/phones/samsung-phones/5-ways-galaxy-s27-ultra-can-beat-the-iphone-18-pro-and-2-ways-apple-will-still-win">Samsung Galaxy S27 Ultra</a> is coming next year, and we've already started hearing a bunch of rumors about the upcoming phone, including a redesign that could see the camera layout drastically change for the first time in several years. However, the latest leaks suggest Samsung will implement much grander changes than just the camera's look.</p><p>In fact, it now seems as though the new look could come at the expense of Samsung's trademark fourth camera lens — the secondary telephoto camera with 3x optical zoom. Or, at least, that's what long-time leaker Ice Universe <a href="https://x.com/UniverseIce/status/2104758778726109407" target="_blank">claims over on X</a>.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2104758778726109407"><p lang="en" dir="ltr">It is now confirmed that the Galaxy S27 Ultra will no longer have a 3× telephoto camera.This means its rear camera system will jump directly from the 1× main camera to the 5× telephoto camera.The main camera uses the ISOCELL HP6, essentially a Galaxy-customized version of the… https://t.co/qYGcdX93oy<a href="https://twitter.com/cantworkitout/status/2104758778726109407">September 29, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Ice Universe notes that the camera app will now jump from 1x magnification on the main lens, straight to 5x magnification on the soon-to-be-solo telephoto lens. So there's no optical magnification sitting between the two, though the main lens will presumably still offer the 2x "optical quality" digital zoom that's become so popular on flagship phones in recent years.</p><p>Ice has stuck with past claims that the telephoto camera itself will remain unchanged, with the same 5x 50MP lens that is currently available on the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung Galaxy S26 Ultra</a>. This also means that the long-standing rumors that Samsung might offer some kind of <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-ultra-just-tipped-for-major-camera-change-what-you-need-to-know">variable optical zoom</a> presumably won't be happening next year. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYdpAO"></div>                            </div>                            <script src="https://kwizly.com/embed/XYdpAO.js" async></script><h2 id="the-software-could-be-changing-too">The software could be changing too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LacgYzjqWKVkFAs6DKZ3ak" name="S27 Ultra render" alt="Samsung Galaxy S27 Ultra render" src="https://cdn.mos.cms.futurecdn.net/LacgYzjqWKVkFAs6DKZ3ak-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: @TechHome100)</span></figcaption></figure><p>Modern smartphone photography involves a lot more than having lots of megapixels or fancy lenses. The software is an integral part of the process, and the Galaxy S27 Ultra is tipped to make some big changes there as well.</p><p>This news also comes from<a href="https://x.com/UniverseIce/status/2104724003713933400" target="_blank"> Ice Universe</a>, which claims three changes are coming to how the S27 Ultra processes photos. The first of which is a shift from cooler color tones to something warmer. I have noticed this with Samsung cameras in recent years, and the color-temperature shift should make the final photos look closer to what rival camera phones offer.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2104724003713933400"><p lang="en" dir="ltr">Exclusive, detailed leak: Compared with the Galaxy S26 Ultra, the Galaxy S27 Ultra brings three very noticeable changes to its camera processing:1. The overall color tone has clearly shifted from cool to warmThis is the most obvious change, and something you can notice almost…<a href="https://twitter.com/cantworkitout/status/2104724003713933400">September 29, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Samsung is also set to include better highlight control for small, bright objects, such as illuminated text or far-off light sources. According to Ice, the S26 Ultra struggles to suppress these highlights, causing lost detail and overexposure in the final photo. The S27 Ultra should, in theory, control that extra brightness and preserve the clarity of the shot.</p><p>Finally, Samsung is supposedly working to reduce noise in dark areas and offer a smoother image all round. This makes perfect sense, since Samsung has done a lot of work improving low-light capabilities and reducing photo noise over the past couple of years, with the help of AI. So there's little reason to expect that it would suddenly stop without warning. </p><p>Overall, this should give us better photos with a cleaner picture across light and shadow, plus a warmer tone that doesn't look as harsh as the current cool-looking Samsung-processed photos.</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-duo-leak-reveals-a-bunch-of-standby-details-apple-didnt-tell-us-about-including-what-sounds-like-a-smart-home-display">iPhone Duo leak reveals a bunch of StandBy details Apple didn't tell us about — including what sounds like a smart home display</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/5-ways-galaxy-s27-ultra-can-beat-the-iphone-18-pro-and-2-ways-apple-will-still-win">5 ways Galaxy S27 Ultra can beat the iPhone 18 Pro — and 2 ways Apple will still win</a></li><li><a href="https://www.tomsguide.com/phones/iphones/the-real-reason-why-iphone-duo-will-beat-all-android-foldable-phones">The real reason why iPhone Duo will beat all Android foldable phones</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-ultra-may-scrap-the-10mp-telephoto-lens-and-theres-no-word-of-a-replacement</link>
                                                                            <description>
                            <![CDATA[ The Samsung Galaxy S27 Ultra could ditch one camera and change how it processes photos. Here's what we know. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">g5tBMj9w28M5K3fi6KUTBk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/vbGrCLaZGfUvCojyg8YYUd-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 29 Sep 2026 12:02:45 +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/vbGrCLaZGfUvCojyg8YYUd-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy S26 Ultra]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy S26 Ultra]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy S26 Ultra]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/vbGrCLaZGfUvCojyg8YYUd-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/phones/samsung-phones/5-ways-galaxy-s27-ultra-can-beat-the-iphone-18-pro-and-2-ways-apple-will-still-win">Samsung Galaxy S27 Ultra</a> is coming next year, and we've already started hearing a bunch of rumors about the upcoming phone, including a redesign that could see the camera layout drastically change for the first time in several years. However, the latest leaks suggest Samsung will implement much grander changes than just the camera's look.</p><p>In fact, it now seems as though the new look could come at the expense of Samsung's trademark fourth camera lens — the secondary telephoto camera with 3x optical zoom. Or, at least, that's what long-time leaker Ice Universe <a href="https://x.com/UniverseIce/status/2104758778726109407" target="_blank">claims over on X</a>.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2104758778726109407"><p lang="en" dir="ltr">It is now confirmed that the Galaxy S27 Ultra will no longer have a 3× telephoto camera.This means its rear camera system will jump directly from the 1× main camera to the 5× telephoto camera.The main camera uses the ISOCELL HP6, essentially a Galaxy-customized version of the… https://t.co/qYGcdX93oy<a href="https://twitter.com/cantworkitout/status/2104758778726109407">September 29, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Ice Universe notes that the camera app will now jump from 1x magnification on the main lens, straight to 5x magnification on the soon-to-be-solo telephoto lens. So there's no optical magnification sitting between the two, though the main lens will presumably still offer the 2x "optical quality" digital zoom that's become so popular on flagship phones in recent years.</p><p>Ice has stuck with past claims that the telephoto camera itself will remain unchanged, with the same 5x 50MP lens that is currently available on the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung Galaxy S26 Ultra</a>. This also means that the long-standing rumors that Samsung might offer some kind of <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-ultra-just-tipped-for-major-camera-change-what-you-need-to-know">variable optical zoom</a> presumably won't be happening next year. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYdpAO"></div>                            </div>                            <script src="https://kwizly.com/embed/XYdpAO.js" async></script><h2 id="the-software-could-be-changing-too">The software could be changing too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LacgYzjqWKVkFAs6DKZ3ak" name="S27 Ultra render" alt="Samsung Galaxy S27 Ultra render" src="https://cdn.mos.cms.futurecdn.net/LacgYzjqWKVkFAs6DKZ3ak-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: @TechHome100)</span></figcaption></figure><p>Modern smartphone photography involves a lot more than having lots of megapixels or fancy lenses. The software is an integral part of the process, and the Galaxy S27 Ultra is tipped to make some big changes there as well.</p><p>This news also comes from<a href="https://x.com/UniverseIce/status/2104724003713933400" target="_blank"> Ice Universe</a>, which claims three changes are coming to how the S27 Ultra processes photos. The first of which is a shift from cooler color tones to something warmer. I have noticed this with Samsung cameras in recent years, and the color-temperature shift should make the final photos look closer to what rival camera phones offer.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2104724003713933400"><p lang="en" dir="ltr">Exclusive, detailed leak: Compared with the Galaxy S26 Ultra, the Galaxy S27 Ultra brings three very noticeable changes to its camera processing:1. The overall color tone has clearly shifted from cool to warmThis is the most obvious change, and something you can notice almost…<a href="https://twitter.com/cantworkitout/status/2104724003713933400">September 29, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Samsung is also set to include better highlight control for small, bright objects, such as illuminated text or far-off light sources. According to Ice, the S26 Ultra struggles to suppress these highlights, causing lost detail and overexposure in the final photo. The S27 Ultra should, in theory, control that extra brightness and preserve the clarity of the shot.</p><p>Finally, Samsung is supposedly working to reduce noise in dark areas and offer a smoother image all round. This makes perfect sense, since Samsung has done a lot of work improving low-light capabilities and reducing photo noise over the past couple of years, with the help of AI. So there's little reason to expect that it would suddenly stop without warning. </p><p>Overall, this should give us better photos with a cleaner picture across light and shadow, plus a warmer tone that doesn't look as harsh as the current cool-looking Samsung-processed photos.</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-duo-leak-reveals-a-bunch-of-standby-details-apple-didnt-tell-us-about-including-what-sounds-like-a-smart-home-display">iPhone Duo leak reveals a bunch of StandBy details Apple didn't tell us about — including what sounds like a smart home display</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/5-ways-galaxy-s27-ultra-can-beat-the-iphone-18-pro-and-2-ways-apple-will-still-win">5 ways Galaxy S27 Ultra can beat the iPhone 18 Pro — and 2 ways Apple will still win</a></li><li><a href="https://www.tomsguide.com/phones/iphones/the-real-reason-why-iphone-duo-will-beat-all-android-foldable-phones">The real reason why iPhone Duo will beat all Android foldable phones</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 ways Galaxy S27 Ultra can beat the iPhone 18 Pro — and 2 ways Apple will still win ]]></title>
                                                                                                <dc:content><![CDATA[ <p>There are a lot of things to love about the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-and-pro-max-review">iPhone 18 Pro and iPhone 18 Pro Max,</a> but they definitely are not perfect. There are things that Apple's latest flagships are missing, and that could give Samsung an advantage with the release of the <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">Galaxy S27 Ultra</a> next year. </p><p>Success over Apple isn't guaranteed, but with Galaxy S27 Ultra rumors arriving pretty regularly, we're getting a good idea of what the next Samsung flagship could offer. There could be some pretty big changes, including a brand new design that ditches the vertical camera array of the last several generations of Galaxy phones. </p><p>That's only scratching the surface. These 5 things in particular could help the Samsung Galaxy S27 Ultra beat the iPhone 18 Pro — but there are two ways Apple could stay on top.</p><h3 class="article-body__section" id="section-a-bigger-battery"><span>A bigger 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: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>Samsung already proved that it has what it takes to boost battery capacity without affecting the design of the device — as we saw with 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">Galaxy Z Fold 8 Ultra's 5,000 mAh silicon carbon battery</a>. Rumor has it that Samsung could utilize the same tech in the S27 Ultra, which makes total sense considering how long the Ultra models have been stuck with 5,000 mAh batteries</p><p>Regulator documents have already revealed that <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 could add a 5,700 mAh battery to the phone</a>. That's a 14% increase over the<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review"> Galaxy S26 Ultra</a>, and while it's nowhere near as large as the 7,300 mAh <a href="https://www.tomsguide.com/phones/oneplus-phones/oneplus-15-review">OnePlus 15</a>, it's still a noticeable jump in available power. That should hopefully increase the overall battery life. That said, we won't know whether it will exceed the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-and-18-pro-battery-life-tested-the-results-are-surprising">iPhone 18 Pro Max's 18 hours and 27 minutes</a>. </p><p>That would require an extra two hours of battery life on Samsung's part, so it better get to work on the efficiency side of things.</p><h3 class="article-body__section" id="section-an-improved-privacy-display"><span>An improved privacy display</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="f7xgeogiw6KvPnUbLtRM34" name="Galaxy S26 Ultra privacy screen LIST (1)" alt="Samsung Galaxy S26 Ultra front view and profile" src="https://cdn.mos.cms.futurecdn.net/f7xgeogiw6KvPnUbLtRM34-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-has-the-worlds-first-privacy-display-heres-how-it-works">Privacy Display</a> is the S26 Ultra's stand-out feature, but it wasn't perfect, and what we really want to see are some improvements to the technology. We'd hope that means brighter overall displays, even when Privacy Display is turned off, and more versatile use of the dimmed sections of the screen.</p><p>The latter may be coming true, with leaker <a href="https://x.com/UniverseIce/status/2103074330351751491?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E2103074330351751491%7Ctwgr%5E25a2a2ada5c14def33c245f770f969839de48b85%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.androidauthority.com%2Fsamsung-galaxy-s27-ultra-split-screen-privacy-display-3715094%2F">Ice Universe</a> claiming that Samsung will adopt a feature that Xiaomi included on the newly-released 18 Pro — a split-screen privacy display. This feature would work in tandem with the S27 Ultra's multitasking, and would expand or contract according to how big the different windows are. The other window is fully lit and visible.</p><h3 class="article-body__section" id="section-s-pen"><span>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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UfraPifaz2CpXLbJKJYqDY" name="S Pen S26 Ultra" alt="Samsung Galaxy S26 Ultra S Pen" src="https://cdn.mos.cms.futurecdn.net/UfraPifaz2CpXLbJKJYqDY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While 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 set to <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">get Apple Pencil support,</a> the iPhone 18 Pro does not. The Samsung Galaxy S27 Ultra is <a href="https://www.etnews.com/20260320000126" target="_blank">likely to stick</a> with the same level of S Pen support Samsung has offered for the past several years.</p><p>We're not expecting any major changes with the S27 Ultra's S Pen. This means you shouldn't expect to see the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s25-ultra-confusion-samsung-now-says-you-can-buy-bluetooth-s-pen-separately">return of Bluetooth or other more advanced functionality</a> we have seen in previous years. But even the simplest S Pen around is something that Apple doesn't offer on its flagship. So if you like to use a stylus to draw, take notes or make fine photo edits, the S27 Ultra is a more appealing device.</p><h3 class="article-body__section" id="section-better-camera-hardware"><span>Better 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: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>Ultra-tier Galaxy phones already have superior camera hardware, thanks to the 200MP main sensor, but things could be getting even better with the S27 Ultra — in the front and back of the phone. </p><p>The first upgrade rumor is the addition of<a href="https://www.galaxyclub.nl/samsung/galaxy-s27/"> a 16MP selfie camera</a>, which would be a notable upgrade from the 12MP shooter on the S26 Ultra. While that's still a little bit less than the 18MP Center Stage camera on iPhone 18 Pro, it's still a welcome upgrade. However, Samsung could jump ahead with rumors of a large sensor on the telephoto lens.</p><p>Some rumors suggest that Samsung <a href="https://go.skimresources.com/?id=803X112721&xs=1&url=https://x.com/phonefuturist/status/2094046496362483863&xcust=4-0-3238643-1-0-0-0-0&sref=https://www.techadvisor.com/article/3238643/galaxy-s27-ultra-the-camera-upgrade-debate-rolls-on.html" target="_blank">could offer a larger</a> 1/1.9-inch telephoto sensor, but as a result reduce the amount of optical zoom from 5x magnification to 4x. However, this has been disputed by <a href="https://go.skimresources.com/?id=803X112721&xs=1&url=https://x.com/UniverseIce/status/2099327785814945972&xcust=4-0-3238643-1-0-0-0-0&sref=https://www.techadvisor.com/article/3238643/galaxy-s27-ultra-the-camera-upgrade-debate-rolls-on.html" target="_blank">some leakers,</a> who claim Samsung is sticking with the same 5x 1/2.52-inch sensor as the S26 Ultra. But either way, it's a telephoto lens offering higher resolution and sensor size than the 48MP 1/2.55-inch sensor on iPhone 18 Pro Max.</p><h3 class="article-body__section" id="section-a-16gb-ram-option"><span>A 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:1704px;"><p class="vanilla-image-block" style="padding-top:54.17%;"><img id="U2CzUvPvEThFgKxQen6pD7" name="HHEajh5bAAAyh0z" alt="Samsung Galaxy S27 Ultra concept" src="https://cdn.mos.cms.futurecdn.net/U2CzUvPvEThFgKxQen6pD7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1704" height="923" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Ice Universe)</span></figcaption></figure><p>While it's unlikely that we'll see the S27 Ultra get a full 16GB of RAM in its cheapest form, there's still a good chance the pricier 1TB models will get that memory boost. This should in turn give those models a slight advantage when it comes to processing, specifically where on-device AI is concerned.</p><p>Considering on-device AI is a big focus for Apple, the 12GB of RAM in the iPhone 18 Pro doesn't seem quite so impressive. The S27 Ultra, with more advanced Galaxy AI and computing hardware, could end up leaving the iPhone 18 Pro in the dust here.</p><h2 id="2-ways-apple-can-still-win">2 ways Apple can still win</h2><h3 class="article-body__section" id="section-performance-power"><span>Performance power</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="473VNvCMPfhDkYKpe3aJjK" name="iPhone 18 Pro and Pro Max-12" alt="Apple iPhone 18 Pro and Pro Max shown in hand" src="https://cdn.mos.cms.futurecdn.net/473VNvCMPfhDkYKpe3aJjK-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>We can't say for certain how powerful the Galaxy S27 Ultra will be, but we have tested the chip that should power the phone when it arrives next year — the Snapdragon 8 Elite Extreme Gen 6. <a href="https://www.tomsguide.com/phones/android-phones/snapdragon-8-elite-gen-6-benchmark-test-results-hands-on-vs-a20-pro-iphone-18-pro">We have done some benchmarking tests with a Qualcomm Reference Device</a>, which gives us an idea of how the chip should perform. As powerful as it is, it doesn't really compare to Apple's A20 Pro in a lot of areas.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench 7 (single core)</strong></p></td><td  ><p><strong>Geekbench 7 (multi-core)</strong></p></td><td  ><p><strong>3DMark Solar Bay Extreme</strong></p></td><td  ><p><strong>3DMark Wildlife Extreme</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Snapdragon 8 Elite Extreme Gen 6 (QRD)</strong></p></td><td  ><p>4161</p></td><td  ><p>12464</p></td><td  ><p>2262</p></td><td  ><p>9941</p></td></tr><tr><td class="firstcol " ><p><strong>Snapdragon 8 Elite Gen 5 (Samsung Galaxy Z Fold 8 Ultra)</strong></p></td><td  ><p>3110</p></td><td  ><p>10578</p></td><td  ><p>1372</p></td><td  ><p>6632</p></td></tr><tr><td class="firstcol " ><p><strong>A20 Pro (iPhone 18 Pro Max)</strong></p></td><td  ><p>4741</p></td><td  ><p>12789</p></td><td  ><p>2904</p></td><td  ><p>8344</p></td></tr></tbody></table></div><p>As you can see, the A20 Pro pulls ahead in most areas, including single- and multi-core benchmarking tests, and 3DMark's Solar Bay Extreme graphics test. The figures are close in a lot of places, but the only time the Gen 6 chip outpaces Apple is with the 3DMark Wildlife Extreme graphics test.</p><p>We don't know how Qualcomm's chip will perform on the S27 Ultra, especially if Samsung gets another custom "for Galaxy" chipset, but for now it seems like Apple certainly has the upper hand.</p><h3 class="article-body__section" id="section-more-storage"><span>More storage</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="5kKUCv7Eef6yGkMMGEgbvJ" name="iPhone 18 Pro and Pro Max-9" alt="Apple iPhone 18 Pro and Pro Max shown in hand" src="https://cdn.mos.cms.futurecdn.net/5kKUCv7Eef6yGkMMGEgbvJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As small a difference as it may be, we know that Apple currently offers more storage space than Samsung — offering a maximum storage space of 2TB to Samsung's 1TB. There's always the possibility that this could change, but the rumors suggest otherwise. In fact, the S27 series will apparently have the exact same storage options as the S26 series. This means the Ultra will max out at 1TB.</p><p>Those larger storage variants might get<a href="https://blog.naver.com/yeux1122/224419648243"> LPDDR6 RAM and UFS 5.1 storage</a>, which would be a benefit for performance and loading speed. Sadly, your maximum limit will be the same 1TB as always, if these rumors are to be believed.</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/the-new-iphone-feature-in-ios-27-im-using-every-single-day-and-where-to-find-it">There's a new shortcut in iOS 27 I’m using every single day — here's where to find it</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-confirms-iphone-18-pro-face-id-freezing-bug-what-you-need-to-know">Apple confirms iPhone 18 Pro Face ID freezing bug — what you need to know</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-duo-7-features-youre-giving-up-by-not-buying-the-iphone-18-pro-max">iPhone Duo: 7 features you’re giving up by not buying the iPhone 18 Pro Max</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/5-ways-galaxy-s27-ultra-can-beat-the-iphone-18-pro-and-2-ways-apple-will-still-win</link>
                                                                            <description>
                            <![CDATA[ iPhone 18 Pro is good, but the Galaxy S27 Ultra could beat it in these key ways. Luckily Samsung can't do everything. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">aurwygfVY2c7C4dFHdAFGf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/LacgYzjqWKVkFAs6DKZ3ak-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 29 Sep 2026 07:00: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/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>There are a lot of things to love about the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-and-pro-max-review">iPhone 18 Pro and iPhone 18 Pro Max,</a> but they definitely are not perfect. There are things that Apple's latest flagships are missing, and that could give Samsung an advantage with the release of the <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">Galaxy S27 Ultra</a> next year. </p><p>Success over Apple isn't guaranteed, but with Galaxy S27 Ultra rumors arriving pretty regularly, we're getting a good idea of what the next Samsung flagship could offer. There could be some pretty big changes, including a brand new design that ditches the vertical camera array of the last several generations of Galaxy phones. </p><p>That's only scratching the surface. These 5 things in particular could help the Samsung Galaxy S27 Ultra beat the iPhone 18 Pro — but there are two ways Apple could stay on top.</p><h3 class="article-body__section" id="section-a-bigger-battery"><span>A bigger 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: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>Samsung already proved that it has what it takes to boost battery capacity without affecting the design of the device — as we saw with 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">Galaxy Z Fold 8 Ultra's 5,000 mAh silicon carbon battery</a>. Rumor has it that Samsung could utilize the same tech in the S27 Ultra, which makes total sense considering how long the Ultra models have been stuck with 5,000 mAh batteries</p><p>Regulator documents have already revealed that <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 could add a 5,700 mAh battery to the phone</a>. That's a 14% increase over the<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review"> Galaxy S26 Ultra</a>, and while it's nowhere near as large as the 7,300 mAh <a href="https://www.tomsguide.com/phones/oneplus-phones/oneplus-15-review">OnePlus 15</a>, it's still a noticeable jump in available power. That should hopefully increase the overall battery life. That said, we won't know whether it will exceed the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-and-18-pro-battery-life-tested-the-results-are-surprising">iPhone 18 Pro Max's 18 hours and 27 minutes</a>. </p><p>That would require an extra two hours of battery life on Samsung's part, so it better get to work on the efficiency side of things.</p><h3 class="article-body__section" id="section-an-improved-privacy-display"><span>An improved privacy display</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="f7xgeogiw6KvPnUbLtRM34" name="Galaxy S26 Ultra privacy screen LIST (1)" alt="Samsung Galaxy S26 Ultra front view and profile" src="https://cdn.mos.cms.futurecdn.net/f7xgeogiw6KvPnUbLtRM34-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-has-the-worlds-first-privacy-display-heres-how-it-works">Privacy Display</a> is the S26 Ultra's stand-out feature, but it wasn't perfect, and what we really want to see are some improvements to the technology. We'd hope that means brighter overall displays, even when Privacy Display is turned off, and more versatile use of the dimmed sections of the screen.</p><p>The latter may be coming true, with leaker <a href="https://x.com/UniverseIce/status/2103074330351751491?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E2103074330351751491%7Ctwgr%5E25a2a2ada5c14def33c245f770f969839de48b85%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.androidauthority.com%2Fsamsung-galaxy-s27-ultra-split-screen-privacy-display-3715094%2F">Ice Universe</a> claiming that Samsung will adopt a feature that Xiaomi included on the newly-released 18 Pro — a split-screen privacy display. This feature would work in tandem with the S27 Ultra's multitasking, and would expand or contract according to how big the different windows are. The other window is fully lit and visible.</p><h3 class="article-body__section" id="section-s-pen"><span>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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UfraPifaz2CpXLbJKJYqDY" name="S Pen S26 Ultra" alt="Samsung Galaxy S26 Ultra S Pen" src="https://cdn.mos.cms.futurecdn.net/UfraPifaz2CpXLbJKJYqDY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While 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 set to <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">get Apple Pencil support,</a> the iPhone 18 Pro does not. The Samsung Galaxy S27 Ultra is <a href="https://www.etnews.com/20260320000126" target="_blank">likely to stick</a> with the same level of S Pen support Samsung has offered for the past several years.</p><p>We're not expecting any major changes with the S27 Ultra's S Pen. This means you shouldn't expect to see the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s25-ultra-confusion-samsung-now-says-you-can-buy-bluetooth-s-pen-separately">return of Bluetooth or other more advanced functionality</a> we have seen in previous years. But even the simplest S Pen around is something that Apple doesn't offer on its flagship. So if you like to use a stylus to draw, take notes or make fine photo edits, the S27 Ultra is a more appealing device.</p><h3 class="article-body__section" id="section-better-camera-hardware"><span>Better 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: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>Ultra-tier Galaxy phones already have superior camera hardware, thanks to the 200MP main sensor, but things could be getting even better with the S27 Ultra — in the front and back of the phone. </p><p>The first upgrade rumor is the addition of<a href="https://www.galaxyclub.nl/samsung/galaxy-s27/"> a 16MP selfie camera</a>, which would be a notable upgrade from the 12MP shooter on the S26 Ultra. While that's still a little bit less than the 18MP Center Stage camera on iPhone 18 Pro, it's still a welcome upgrade. However, Samsung could jump ahead with rumors of a large sensor on the telephoto lens.</p><p>Some rumors suggest that Samsung <a href="https://go.skimresources.com/?id=803X112721&xs=1&url=https://x.com/phonefuturist/status/2094046496362483863&xcust=4-0-3238643-1-0-0-0-0&sref=https://www.techadvisor.com/article/3238643/galaxy-s27-ultra-the-camera-upgrade-debate-rolls-on.html" target="_blank">could offer a larger</a> 1/1.9-inch telephoto sensor, but as a result reduce the amount of optical zoom from 5x magnification to 4x. However, this has been disputed by <a href="https://go.skimresources.com/?id=803X112721&xs=1&url=https://x.com/UniverseIce/status/2099327785814945972&xcust=4-0-3238643-1-0-0-0-0&sref=https://www.techadvisor.com/article/3238643/galaxy-s27-ultra-the-camera-upgrade-debate-rolls-on.html" target="_blank">some leakers,</a> who claim Samsung is sticking with the same 5x 1/2.52-inch sensor as the S26 Ultra. But either way, it's a telephoto lens offering higher resolution and sensor size than the 48MP 1/2.55-inch sensor on iPhone 18 Pro Max.</p><h3 class="article-body__section" id="section-a-16gb-ram-option"><span>A 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:1704px;"><p class="vanilla-image-block" style="padding-top:54.17%;"><img id="U2CzUvPvEThFgKxQen6pD7" name="HHEajh5bAAAyh0z" alt="Samsung Galaxy S27 Ultra concept" src="https://cdn.mos.cms.futurecdn.net/U2CzUvPvEThFgKxQen6pD7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1704" height="923" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Ice Universe)</span></figcaption></figure><p>While it's unlikely that we'll see the S27 Ultra get a full 16GB of RAM in its cheapest form, there's still a good chance the pricier 1TB models will get that memory boost. This should in turn give those models a slight advantage when it comes to processing, specifically where on-device AI is concerned.</p><p>Considering on-device AI is a big focus for Apple, the 12GB of RAM in the iPhone 18 Pro doesn't seem quite so impressive. The S27 Ultra, with more advanced Galaxy AI and computing hardware, could end up leaving the iPhone 18 Pro in the dust here.</p><h2 id="2-ways-apple-can-still-win">2 ways Apple can still win</h2><h3 class="article-body__section" id="section-performance-power"><span>Performance power</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="473VNvCMPfhDkYKpe3aJjK" name="iPhone 18 Pro and Pro Max-12" alt="Apple iPhone 18 Pro and Pro Max shown in hand" src="https://cdn.mos.cms.futurecdn.net/473VNvCMPfhDkYKpe3aJjK-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>We can't say for certain how powerful the Galaxy S27 Ultra will be, but we have tested the chip that should power the phone when it arrives next year — the Snapdragon 8 Elite Extreme Gen 6. <a href="https://www.tomsguide.com/phones/android-phones/snapdragon-8-elite-gen-6-benchmark-test-results-hands-on-vs-a20-pro-iphone-18-pro">We have done some benchmarking tests with a Qualcomm Reference Device</a>, which gives us an idea of how the chip should perform. As powerful as it is, it doesn't really compare to Apple's A20 Pro in a lot of areas.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench 7 (single core)</strong></p></td><td  ><p><strong>Geekbench 7 (multi-core)</strong></p></td><td  ><p><strong>3DMark Solar Bay Extreme</strong></p></td><td  ><p><strong>3DMark Wildlife Extreme</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Snapdragon 8 Elite Extreme Gen 6 (QRD)</strong></p></td><td  ><p>4161</p></td><td  ><p>12464</p></td><td  ><p>2262</p></td><td  ><p>9941</p></td></tr><tr><td class="firstcol " ><p><strong>Snapdragon 8 Elite Gen 5 (Samsung Galaxy Z Fold 8 Ultra)</strong></p></td><td  ><p>3110</p></td><td  ><p>10578</p></td><td  ><p>1372</p></td><td  ><p>6632</p></td></tr><tr><td class="firstcol " ><p><strong>A20 Pro (iPhone 18 Pro Max)</strong></p></td><td  ><p>4741</p></td><td  ><p>12789</p></td><td  ><p>2904</p></td><td  ><p>8344</p></td></tr></tbody></table></div><p>As you can see, the A20 Pro pulls ahead in most areas, including single- and multi-core benchmarking tests, and 3DMark's Solar Bay Extreme graphics test. The figures are close in a lot of places, but the only time the Gen 6 chip outpaces Apple is with the 3DMark Wildlife Extreme graphics test.</p><p>We don't know how Qualcomm's chip will perform on the S27 Ultra, especially if Samsung gets another custom "for Galaxy" chipset, but for now it seems like Apple certainly has the upper hand.</p><h3 class="article-body__section" id="section-more-storage"><span>More storage</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="5kKUCv7Eef6yGkMMGEgbvJ" name="iPhone 18 Pro and Pro Max-9" alt="Apple iPhone 18 Pro and Pro Max shown in hand" src="https://cdn.mos.cms.futurecdn.net/5kKUCv7Eef6yGkMMGEgbvJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As small a difference as it may be, we know that Apple currently offers more storage space than Samsung — offering a maximum storage space of 2TB to Samsung's 1TB. There's always the possibility that this could change, but the rumors suggest otherwise. In fact, the S27 series will apparently have the exact same storage options as the S26 series. This means the Ultra will max out at 1TB.</p><p>Those larger storage variants might get<a href="https://blog.naver.com/yeux1122/224419648243"> LPDDR6 RAM and UFS 5.1 storage</a>, which would be a benefit for performance and loading speed. Sadly, your maximum limit will be the same 1TB as always, if these rumors are to be believed.</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/the-new-iphone-feature-in-ios-27-im-using-every-single-day-and-where-to-find-it">There's a new shortcut in iOS 27 I’m using every single day — here's where to find it</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-confirms-iphone-18-pro-face-id-freezing-bug-what-you-need-to-know">Apple confirms iPhone 18 Pro Face ID freezing bug — what you need to know</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-duo-7-features-youre-giving-up-by-not-buying-the-iphone-18-pro-max">iPhone Duo: 7 features you’re giving up by not buying the iPhone 18 Pro Max</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ We just tested the Roku Pro Series OLED — here's how it stacks up against the LG C6 and Samsung S90H ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Roku is rolling out its first OLED TV, and stock is already lining shelves alongside rival sets from LG, Samsung and Sony. With its competitors having a generous headstart in the OLED sales race, Roku certainly has some catching up to do.</p><p>But outside of sales, there’s another arena in which Roku might have to catch up: OLED performance. Sony, Samsung and especially LG have had several years to tinker with their secret formulas for self-emissive success. Despite using similar hardware as some of the <a href="https://www.tomsguide.com/tvs/oled-tvs/best-oled-tvs">best OLED TVs</a> on the market, Roku’s engineers haven’t yet shown us what sort of performance they can get out of the tech.</p><p>We’re still cracking away at our full-length <a href="https://www.tomsguide.com/tvs/oled-tvs/roku-just-announced-its-first-oled-tvs-and-they-could-be-game-changers-for-people-who-hate-smart-tvs">Roku Pro Series OLED</a> review, but in the meantime, I wanted to give folks a sneak-peek at some of our findings. Here’s how Roku’s brand-new OLED compares to two of the most popular models on the market.</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/Yjmb3H_iL94" allowfullscreen></iframe></div></div><h2 id="roku-pro-series-oled-test-results-at-a-glance">Roku Pro Series OLED test results: At a glance</h2><p>Our test results for the <a href="https://www.tomsguide.com/tvs/oled-tvs/lg-c6-oled-review">LG C6</a> and <a href="https://www.tomsguide.com/tvs/oled-tvs/samsung-s90h-oled-tv-review">Samsung S90H</a> were taken when each of these TVs were set to Filmmaker, their most-accurate picture mode. The Roku Pro Series OLED does not come with Filmmaker mode, so its SDR results have been measured in Movie mode, while the HDR results below were taken in HDR Dark with its Display Brightness set to Brighter.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Roku Pro Series OLED</strong></p></th><th  ><p><strong>LG C6</strong></p></th><th  ><p><strong>Samsung S90H</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p>SDR Brightness<br>(10%, in nits)</p></td><td  ><p>331</p></td><td  ><p>360</p></td><td  ><p>226</p></td></tr><tr><td class="firstcol " ><p>HDR Brightness (10%, in nits)</p></td><td  ><p>574</p></td><td  ><p>1,365</p></td><td  ><p>1,497</p></td></tr><tr><td class="firstcol " ><p>Delta-E<br>(lower is better)</p></td><td  ><p>2.3</p></td><td  ><p>1.6</p></td><td  ><p>1.6</p></td></tr><tr><td class="firstcol " ><p>Rec. 2020 Gamut Coverage</p></td><td  ><p>70.7%</p></td><td  ><p>75.8%</p></td><td  ><p>77.8%</p></td></tr></tbody></table></div><p>Given the Pro Series OLED's range of picture modes and brightness-related settings, it's quite possible to produce slightly brighter (or dimmer) results when measuring these test patterns.</p><p>However, when comparing the numbers on the chart above, it's worth noting that the C6 and the S90H were measured with a similar set of constraints. As a result, these figures should give you some idea of the key differences in performance when a clean, accurate picture is in play.</p><p>While there's not much of a difference between peak HDR brightness on the C6 and S90H, there is a sizable gap between those sets and the Pro Series OLED, at least when it comes to small, concentrated areas of brightness. These are known as specular highlights, and due to their self-lit pixels, OLEDs are particularly good at leveraging highlight brightness for added depth.</p><p>The inherent liveliness of an OLED's eye-popping micro-contrast is good news for the Pro Series. Its peak highlight brightness may not be as high as its competitors, but because these objects are being shown on a display capable of perfect black levels, its 500 to 700 nits of HDR brightness <em>appears</em> brighter than it would on an LCD/LED-based TV.</p><div><blockquote><p>Its 500 to 700 nits of HDR brightness appears brighter than it would on an LCD/LED TV.</p></blockquote></div><p>But don't get it twisted: The C6 and S90H are nevertheless the brighter TVs. HDR movies, shows and games will pop on these sets more than they will on the Roku Pro Series OLED.</p><p>In SDR — particularly in an accurate picture mode like Movie — the Pro Series hangs tough with its rivals. No OLED TV can safely offer the room-filling, full-picture brightness you might see on a high-powered Mini-LED or RGB LED TV, but for everyday content like cable TV and YouTube videos, the Roku Pro Series offers a similar presentation as the C6 and S90H. It also delivers a finely tuned, accurate picture in Movie mode.</p><p>Lastly, let's chat color. The Pro Series OLED's limited brightness partially explains its limited HDR color range, as its simply not bright enough to produce some of the dimmer, subtler shades you'll see on the LG C6 and Samsung S90H.</p><h2 id="it-39-s-an-entry-level-oled-after-all">It's an entry-level OLED, after 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:2752px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2z7VjjBDu7CfpZvJzVmAfY" name="Roku oled" alt="The Roku Pro Series OLED TV in a living room." src="https://cdn.mos.cms.futurecdn.net/2z7VjjBDu7CfpZvJzVmAfY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2752" height="1548" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Roku)</span></figcaption></figure><p>Technically speaking, the C6 and S90H are mid-range models, as they're each sandwiched between entry-level and flagship OLEDs in both brand's respective lineup. One could easily make the argument that, as an entry-level OLED, the Roku Pro Series isn't fairly matched up against this pair of rivals.</p><p>The pricing bears this out. The <a href="https://www.amazon.com/dp/B0GVW1M8JF" target="_blank" rel="nofollow">55-inch Roku Pro Series is currently $999 on Amazon</a>, while the 55-inch C6 and S90H are each $1,499.</p><div class="product"><a data-dimension112="b8878fa0-b785-11f1-a0e1-59302297f859" data-action="Deal Block" data-label="Pro Series 4K OLED TV" data-dimension48="Pro Series 4K OLED TV" data-dimension25="$999" href="https://www.amazon.com/dp/B0GVW1M8JF" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><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="a2CuBidxfpL7c8iJYKKTGL" name="Roku-Pro-Series-OLED-TV-deal-block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/a2CuBidxfpL7c8iJYKKTGL-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0GVW1M8JF" target="_blank" rel="nofollow" data-dimension112="b8878fa0-b785-11f1-a0e1-59302297f859" data-action="Deal Block" data-label="Pro Series 4K OLED TV" data-dimension48="Pro Series 4K OLED TV" data-dimension25="$999">Pro Series 4K OLED TV: $999</a></strong><br>Roku's first foray into the world of OLED blends one of the best streaming platforms with self-lit pixels, perfect black levels and all of the benefits that come with OLED display technology. Right now, the 55-inch model is just $999.<a class="view-deal button" href="https://www.amazon.com/dp/B0GVW1M8JF" target="_blank" rel="nofollow" data-dimension112="b8878fa0-b785-11f1-a0e1-59302297f859" data-action="Deal Block" data-label="Pro Series 4K OLED TV" data-dimension48="Pro Series 4K OLED TV" data-dimension25="$999">View Deal</a></p></div><p>A closer match-up would be between the Pro Series OLED and the <a href="https://www.tomsguide.com/tvs/4k-tvs/lg-b6-oled-tv-review">LG B6</a> — LG's most-affordable OLED TV in 2026. On Samsung's side, the <a href="https://www.tomsguide.com/tvs/oled-tvs/samsung-s85h-oled-review">S85H OLED</a> represents the brand's cheapest mainline OLED TV this year.</p><p>For what it's worth, the 55-inch B6 and S85H are priced between $999 and $1,199 at the time of publishing, which is closer in line with Roku's most-affordable OLED. In the coming weeks, we'll be taking a closer look at how the Roku Pro Series OLED compares to LG and Samsung's entry-level sets. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePaJpW"></div>                            </div>                            <script src="https://kwizly.com/embed/ePaJpW.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/tvs/i-ditched-lgs-webos-smart-platform-for-roku-and-ill-never-go-back">I ditched LG's webOS smart platform for Roku and I'll never go back</a></li><li><a href="https://www.tomsguide.com/tvs/oled-tvs/cheaper-oled-tvs-might-finally-be-on-the-way-heres-when-they-could-arrive">Cheaper OLED TVs might finally be on the way — here's when they could arrive</a></li><li><a href="https://www.tomsguide.com/tvs/oled-tvs/its-been-nearly-5-years-since-i-bought-an-lg-oled-tv-will-these-3-gripes-stop-me-from-buying-another">It’s been nearly 5 years since I bought an LG OLED TV — will these 3 gripes stop me from buying another?</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tvs/oled-tvs/we-just-tested-the-roku-pro-series-oled-heres-how-it-stacks-up-against-the-lg-c6-and-samsung-s90h</link>
                                                                            <description>
                            <![CDATA[ Roku just unveiled the new Pro Series OLED and we've already tested it. Here's how its performance compares to the LG C6 and the Samsung S90H OLED TVs. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">wJwS5ZBtFPB2Zcg3b474U8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/tL4dZYvadhbbuhD4yUvYfY-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 24 Sep 2026 06:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[OLED TVs]]></category>
                                                    <category><![CDATA[TVs]]></category>
                                                                                                <author><![CDATA[ michael.desjardin@futurenet.com (Michael Desjardin) ]]></author>                    <dc:creator><![CDATA[ Michael Desjardin ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/esytxRqW9GNVZNVCf7BFyV-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Michael Desjardin is a Senior Editor for TVs at Tom&#039;s Guide. He&#039;s been testing and tinkering with TVs professionally for over a decade, previously for Reviewed and USA Today. Michael studied media production and screenwriting at Emerson College. He loves cooking, zoning out to ambient music, and getting way too invested in the Red Sox. He considers himself living proof that TV doesn&#039;t necessarily rot your brain.&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/tL4dZYvadhbbuhD4yUvYfY-1920-80.jpg">
                                                            <media:credit><![CDATA[Roku]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Roku Pro Series OLED TV in a living room.]]></media:description>                                                            <media:text><![CDATA[The Roku Pro Series OLED TV in a living room.]]></media:text>
                                <media:title type="plain"><![CDATA[The Roku Pro Series OLED TV in a living room.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/tL4dZYvadhbbuhD4yUvYfY-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Roku is rolling out its first OLED TV, and stock is already lining shelves alongside rival sets from LG, Samsung and Sony. With its competitors having a generous headstart in the OLED sales race, Roku certainly has some catching up to do.</p><p>But outside of sales, there’s another arena in which Roku might have to catch up: OLED performance. Sony, Samsung and especially LG have had several years to tinker with their secret formulas for self-emissive success. Despite using similar hardware as some of the <a href="https://www.tomsguide.com/tvs/oled-tvs/best-oled-tvs">best OLED TVs</a> on the market, Roku’s engineers haven’t yet shown us what sort of performance they can get out of the tech.</p><p>We’re still cracking away at our full-length <a href="https://www.tomsguide.com/tvs/oled-tvs/roku-just-announced-its-first-oled-tvs-and-they-could-be-game-changers-for-people-who-hate-smart-tvs">Roku Pro Series OLED</a> review, but in the meantime, I wanted to give folks a sneak-peek at some of our findings. Here’s how Roku’s brand-new OLED compares to two of the most popular models on the market.</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/Yjmb3H_iL94" allowfullscreen></iframe></div></div><h2 id="roku-pro-series-oled-test-results-at-a-glance">Roku Pro Series OLED test results: At a glance</h2><p>Our test results for the <a href="https://www.tomsguide.com/tvs/oled-tvs/lg-c6-oled-review">LG C6</a> and <a href="https://www.tomsguide.com/tvs/oled-tvs/samsung-s90h-oled-tv-review">Samsung S90H</a> were taken when each of these TVs were set to Filmmaker, their most-accurate picture mode. The Roku Pro Series OLED does not come with Filmmaker mode, so its SDR results have been measured in Movie mode, while the HDR results below were taken in HDR Dark with its Display Brightness set to Brighter.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Roku Pro Series OLED</strong></p></th><th  ><p><strong>LG C6</strong></p></th><th  ><p><strong>Samsung S90H</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p>SDR Brightness<br>(10%, in nits)</p></td><td  ><p>331</p></td><td  ><p>360</p></td><td  ><p>226</p></td></tr><tr><td class="firstcol " ><p>HDR Brightness (10%, in nits)</p></td><td  ><p>574</p></td><td  ><p>1,365</p></td><td  ><p>1,497</p></td></tr><tr><td class="firstcol " ><p>Delta-E<br>(lower is better)</p></td><td  ><p>2.3</p></td><td  ><p>1.6</p></td><td  ><p>1.6</p></td></tr><tr><td class="firstcol " ><p>Rec. 2020 Gamut Coverage</p></td><td  ><p>70.7%</p></td><td  ><p>75.8%</p></td><td  ><p>77.8%</p></td></tr></tbody></table></div><p>Given the Pro Series OLED's range of picture modes and brightness-related settings, it's quite possible to produce slightly brighter (or dimmer) results when measuring these test patterns.</p><p>However, when comparing the numbers on the chart above, it's worth noting that the C6 and the S90H were measured with a similar set of constraints. As a result, these figures should give you some idea of the key differences in performance when a clean, accurate picture is in play.</p><p>While there's not much of a difference between peak HDR brightness on the C6 and S90H, there is a sizable gap between those sets and the Pro Series OLED, at least when it comes to small, concentrated areas of brightness. These are known as specular highlights, and due to their self-lit pixels, OLEDs are particularly good at leveraging highlight brightness for added depth.</p><p>The inherent liveliness of an OLED's eye-popping micro-contrast is good news for the Pro Series. Its peak highlight brightness may not be as high as its competitors, but because these objects are being shown on a display capable of perfect black levels, its 500 to 700 nits of HDR brightness <em>appears</em> brighter than it would on an LCD/LED-based TV.</p><div><blockquote><p>Its 500 to 700 nits of HDR brightness appears brighter than it would on an LCD/LED TV.</p></blockquote></div><p>But don't get it twisted: The C6 and S90H are nevertheless the brighter TVs. HDR movies, shows and games will pop on these sets more than they will on the Roku Pro Series OLED.</p><p>In SDR — particularly in an accurate picture mode like Movie — the Pro Series hangs tough with its rivals. No OLED TV can safely offer the room-filling, full-picture brightness you might see on a high-powered Mini-LED or RGB LED TV, but for everyday content like cable TV and YouTube videos, the Roku Pro Series offers a similar presentation as the C6 and S90H. It also delivers a finely tuned, accurate picture in Movie mode.</p><p>Lastly, let's chat color. The Pro Series OLED's limited brightness partially explains its limited HDR color range, as its simply not bright enough to produce some of the dimmer, subtler shades you'll see on the LG C6 and Samsung S90H.</p><h2 id="it-39-s-an-entry-level-oled-after-all">It's an entry-level OLED, after 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:2752px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2z7VjjBDu7CfpZvJzVmAfY" name="Roku oled" alt="The Roku Pro Series OLED TV in a living room." src="https://cdn.mos.cms.futurecdn.net/2z7VjjBDu7CfpZvJzVmAfY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2752" height="1548" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Roku)</span></figcaption></figure><p>Technically speaking, the C6 and S90H are mid-range models, as they're each sandwiched between entry-level and flagship OLEDs in both brand's respective lineup. One could easily make the argument that, as an entry-level OLED, the Roku Pro Series isn't fairly matched up against this pair of rivals.</p><p>The pricing bears this out. The <a href="https://www.amazon.com/dp/B0GVW1M8JF" target="_blank" rel="nofollow">55-inch Roku Pro Series is currently $999 on Amazon</a>, while the 55-inch C6 and S90H are each $1,499.</p><div class="product"><a data-dimension112="b8878fa0-b785-11f1-a0e1-59302297f859" data-action="Deal Block" data-label="Pro Series 4K OLED TV" data-dimension48="Pro Series 4K OLED TV" data-dimension25="$999" href="https://www.amazon.com/dp/B0GVW1M8JF" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><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="a2CuBidxfpL7c8iJYKKTGL" name="Roku-Pro-Series-OLED-TV-deal-block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/a2CuBidxfpL7c8iJYKKTGL-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0GVW1M8JF" target="_blank" rel="nofollow" data-dimension112="b8878fa0-b785-11f1-a0e1-59302297f859" data-action="Deal Block" data-label="Pro Series 4K OLED TV" data-dimension48="Pro Series 4K OLED TV" data-dimension25="$999">Pro Series 4K OLED TV: $999</a></strong><br>Roku's first foray into the world of OLED blends one of the best streaming platforms with self-lit pixels, perfect black levels and all of the benefits that come with OLED display technology. Right now, the 55-inch model is just $999.<a class="view-deal button" href="https://www.amazon.com/dp/B0GVW1M8JF" target="_blank" rel="nofollow" data-dimension112="b8878fa0-b785-11f1-a0e1-59302297f859" data-action="Deal Block" data-label="Pro Series 4K OLED TV" data-dimension48="Pro Series 4K OLED TV" data-dimension25="$999">View Deal</a></p></div><p>A closer match-up would be between the Pro Series OLED and the <a href="https://www.tomsguide.com/tvs/4k-tvs/lg-b6-oled-tv-review">LG B6</a> — LG's most-affordable OLED TV in 2026. On Samsung's side, the <a href="https://www.tomsguide.com/tvs/oled-tvs/samsung-s85h-oled-review">S85H OLED</a> represents the brand's cheapest mainline OLED TV this year.</p><p>For what it's worth, the 55-inch B6 and S85H are priced between $999 and $1,199 at the time of publishing, which is closer in line with Roku's most-affordable OLED. In the coming weeks, we'll be taking a closer look at how the Roku Pro Series OLED compares to LG and Samsung's entry-level sets. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePaJpW"></div>                            </div>                            <script src="https://kwizly.com/embed/ePaJpW.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/tvs/i-ditched-lgs-webos-smart-platform-for-roku-and-ill-never-go-back">I ditched LG's webOS smart platform for Roku and I'll never go back</a></li><li><a href="https://www.tomsguide.com/tvs/oled-tvs/cheaper-oled-tvs-might-finally-be-on-the-way-heres-when-they-could-arrive">Cheaper OLED TVs might finally be on the way — here's when they could arrive</a></li><li><a href="https://www.tomsguide.com/tvs/oled-tvs/its-been-nearly-5-years-since-i-bought-an-lg-oled-tv-will-these-3-gripes-stop-me-from-buying-another">It’s been nearly 5 years since I bought an LG OLED TV — will these 3 gripes stop me from buying another?</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung might phase out QLED TVs — here's the replacement ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Samsung — the brand whose name is synonymous with QLED — might be leaving the popular TV type in the dust.</p><p>According to a recent report by the South Korean outlet <a href="https://www.etnews.com/20260917000368" target="_blank" rel="nofollow">ETNews</a>, Samsung is in the process of drastically reducing its production of QLED TVs, and could potentially phase them out entirely by 2028. </p><p>In recent years, many of Samsung’s <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a> have carried the QLED designation, and it’s a dramatic shift for a company that once fought tooth and nail for QLED supremacy. But if this is truly the path Samsung has chosen, there could be a silver lining for future TV shoppers: cheaper Micro RGB TVs. </p><h2 id="samsung-put-qled-on-the-map-but-then-the-map-changed">Samsung put QLED on the map — but then the map changed</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:904px;"><p class="vanilla-image-block" style="padding-top:56.19%;"><img id="tqXcvt7scuLpLTGaCvqS3j" name="Samsung-Q60-QLED-TV-65-01.jpg" alt="Samsung QLED TV" src="https://cdn.mos.cms.futurecdn.net/tqXcvt7scuLpLTGaCvqS3j-1920-80.jpg" mos="" align="middle" fullscreen="" width="904" height="508" 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>Let's start with the bad news: Samsung's QLED reduction plans could see production drop by 80%, as it’s dropping from 10 million units down to just 2 to 3 million. By 2028, all Samsung QLEDs — including Neo QLEDs — could be TVs of the past.</p><div><blockquote><p>Samsung gets credit for popularizing the term 'QLED' as a means of describing what it viewed as a core feature.</p></blockquote></div><p>While many popular brands offer quantum dot-enhanced TVs, Samsung gets credit for popularizing the term “QLED” as a means of describing what it viewed as a core feature.</p><p>In recent years, Samsung even expanded its lineup to include Neo QLED TVs. Initially, the term referred to quantum dot-enhanced sets that leveraged Mini-LED backlighting with full-array local dimming — the best-performing, non-OLED TVs in Samsung’s catalogue.</p><p>Unfortunately, Neo QLEDs are on their way out and, worse, some Neo QLEDs have even dropped hardware-based local dimming. </p><p>But QLED's slow demise isn't all gloom and doom: 2026 marked the first year that Samsung’s Micro RGB TVs sat at the top of its LED lineup. These souped-up Mini-LED TVs use red-, green- and blue-colored backlights to enhance color rather than quantum dots.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-e4EYbW"></div>                            </div>                            <script src="https://kwizly.com/embed/e4EYbW.js" async></script><p>In retrospect, Samsung's restructuring of the Neo QLED lineup dovetailing with the release of its two first Micro RGB TVs should’ve been a strong indication that the former was on its way out. </p><p>This leaves somewhat of a vacancy in the mid-range-to-high-end, non-OLED section of Samsung’s portfolio. And the candidate that makes the most sense to fill that space is Micro RGB.</p><h2 id="analysis-micro-rgb-expansion-will-lead-to-cheaper-micro-rgb-tvs">Analysis: Micro RGB expansion will lead to cheaper Micro RGB TVs</h2><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="rsQHakw2SZaPvFVHcotopg" name="rgb_tv_header" alt="Two Samsung Micro RGB TVs on a colorful backdrop." src="https://cdn.mos.cms.futurecdn.net/rsQHakw2SZaPvFVHcotopg-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: Samsung / Edited by Gemini)</span></figcaption></figure><p>To my eyes, of the many brands taking a swing at RGB LED technology, Samsung’s Micro RGB tech is second only to Sony’s True RGB.</p><div><blockquote><p>It’s just as important that the production of Micro RGB TVs gets more cost-effective than that the tech improves at the highest end</p></blockquote></div><p>It takes a well-engineered combination of nimble hardware and intricate processing for a complex arrangement of red-, blue- and green-colored LEDs to properly harmonize, and Samsung seems to have figured it out.</p><p>The next step, then, is to expand. For Samsung, it’s just as important that the production of Micro RGB TVs gets more cost-effective than that the tech improves at the highest end.</p><p>There are two Micro RGB TVs available to the average consumer this year: the Samsung R85H and the flagship R95H. At the time of publishing, the 55-inch, entry-level R85H is the most affordable path to Samsung Micro RGB, but $1,199 is not cheap.</p><div class="product"><a data-dimension112="434e2274-b5f2-11f1-8e9a-a5083337e931" data-action="Deal Block" data-label="55" R85H 4K Micro RGB TV" data-dimension48="55" R85H 4K Micro RGB TV" data-dimension25="$1199" href="https://www.bestbuy.com/product/samsung-55-class-r85h-series-micro-rgb-4k-uhd-samsungvisionai-smart-tizen-tv-2026/JJGRF3HY9L" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:900px;"><p class="vanilla-image-block" style="padding-top:60.78%;"><img id="9YuZiPAwXBwpBcTKEKyZqi" name="Samsung R85H deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9YuZiPAwXBwpBcTKEKyZqi-1920-80.jpg" mos="" align="middle" fullscreen="" width="900" height="547" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/product/samsung-55-class-r85h-series-micro-rgb-4k-uhd-samsungvisionai-smart-tizen-tv-2026/JJGRF3HY9L" target="_blank" rel="nofollow" data-dimension112="434e2274-b5f2-11f1-8e9a-a5083337e931" data-action="Deal Block" data-label='55" R85H 4K Micro RGB TV' data-dimension48='55" R85H 4K Micro RGB TV' data-dimension25="$1199">55" R85H 4K Micro RGB TV: was $1599 now $1199</a></strong><br>Curious about Micro RGB technology but don't want to spend too much? The 55-inch R85H is Samsung's most affordable Micro RGB TV on shelves, and while it's not quite as stunning in its presentation as the flagship-level R95H, you're still getting a bright, punchy picture and plenty of gaming- and streaming-related features.<a class="view-deal button" href="https://www.bestbuy.com/product/samsung-55-class-r85h-series-micro-rgb-4k-uhd-samsungvisionai-smart-tizen-tv-2026/JJGRF3HY9L" target="_blank" rel="nofollow" data-dimension112="434e2274-b5f2-11f1-8e9a-a5083337e931" data-action="Deal Block" data-label="55" R85H 4K Micro RGB TV" data-dimension48="55" R85H 4K Micro RGB TV" data-dimension25="$1199">View Deal</a></p></div><p>If Samsung does, indeed, phase out its QLEDs, then garden-variety, non-quantum-dot LED TVs will represent the cheapest tier of Samsung’s lineup. Some, I assume, will tap Mini-LEDs.</p><p>By the time this comes to pass, it would be shocking if Samsung's Micro RGB TV lineup hasn’t expanded beyond just a pair of (rather pricey) sets. After all, it took a few years, but Samsung now offers three tiers of OLED TV per year. When it first returned to the OLED scene, Samsung only sold one model.</p><p>There’s nothing stopping Hisense, Sony and TCL from continuing to tinker with quantum-dot color for the foreseeable future, either. Things could change in a hurry, but from where we’re sitting right now, TCL seems to be all-in on Super Quantum Dot (SQD), the brand’s newest spin on an old formula.</p><p>It may be bittersweet to say goodbye to our old friend QLED, but if Samsung plays its cards right, it could bring RGB LED technology to the masses before anyone else — just as it did with quantum dots once before.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/tvs/samsung-tv-report-card-2026-you-can-rely-on-samsung-to-deliver-exceptional-performance">Samsung TV report card 2026: 'You can rely on Samsung to deliver exceptional performance'</a></li><li><a href="https://www.tomsguide.com/tvs/are-flagship-mini-led-tvs-on-their-way-out-heres-how-rgb-led-technology-is-already-reshaping-the-industry">Are flagship Mini-LED TVs on their way out? Here’s how RGB LED technology is already reshaping the industry</a></li><li><a href="https://www.tomsguide.com/tvs/tcl-is-suing-samsung-for-false-advertising-on-its-mini-led-tvs-heres-how-to-tell-if-your-tv-is-included">TCL is suing Samsung for false advertising on its Mini-LED TVs — here’s how to tell if your TV is included</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tvs/qled-tvs/samsung-might-phase-out-qled-tvs-but-there-could-be-a-silver-lining-for-you</link>
                                                                            <description>
                            <![CDATA[ There are reports that Samsung is winding down production of so-called QLED (quantum dot) TVs. Here's why it could be a good deal for shoppers. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">DsJMyZ5njgNsctFjsWKk86</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/VyA3DuB73i8k4PXW3TgnNJ-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 22 Sep 2026 08:30:00 +0000</pubDate>                                                                                                                                <updated>Tue, 22 Sep 2026 23:56:13 +0000</updated>
                                                                                                                                            <category><![CDATA[QLED TVs]]></category>
                                                    <category><![CDATA[TVs]]></category>
                                                                                                <author><![CDATA[ michael.desjardin@futurenet.com (Michael Desjardin) ]]></author>                    <dc:creator><![CDATA[ Michael Desjardin ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/esytxRqW9GNVZNVCf7BFyV-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Michael Desjardin is a Senior Editor for TVs at Tom&#039;s Guide. He&#039;s been testing and tinkering with TVs professionally for over a decade, previously for Reviewed and USA Today. Michael studied media production and screenwriting at Emerson College. He loves cooking, zoning out to ambient music, and getting way too invested in the Red Sox. He considers himself living proof that TV doesn&#039;t necessarily rot your brain.&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/VyA3DuB73i8k4PXW3TgnNJ-1920-80.jpg">
                                                            <media:credit><![CDATA[Samsung / Edited with Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Micro RGB TV]]></media:description>                                                            <media:text><![CDATA[Samsung Micro RGB TV]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Micro RGB TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/VyA3DuB73i8k4PXW3TgnNJ-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung — the brand whose name is synonymous with QLED — might be leaving the popular TV type in the dust.</p><p>According to a recent report by the South Korean outlet <a href="https://www.etnews.com/20260917000368" target="_blank" rel="nofollow">ETNews</a>, Samsung is in the process of drastically reducing its production of QLED TVs, and could potentially phase them out entirely by 2028. </p><p>In recent years, many of Samsung’s <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a> have carried the QLED designation, and it’s a dramatic shift for a company that once fought tooth and nail for QLED supremacy. But if this is truly the path Samsung has chosen, there could be a silver lining for future TV shoppers: cheaper Micro RGB TVs. </p><h2 id="samsung-put-qled-on-the-map-but-then-the-map-changed">Samsung put QLED on the map — but then the map changed</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:904px;"><p class="vanilla-image-block" style="padding-top:56.19%;"><img id="tqXcvt7scuLpLTGaCvqS3j" name="Samsung-Q60-QLED-TV-65-01.jpg" alt="Samsung QLED TV" src="https://cdn.mos.cms.futurecdn.net/tqXcvt7scuLpLTGaCvqS3j-1920-80.jpg" mos="" align="middle" fullscreen="" width="904" height="508" 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>Let's start with the bad news: Samsung's QLED reduction plans could see production drop by 80%, as it’s dropping from 10 million units down to just 2 to 3 million. By 2028, all Samsung QLEDs — including Neo QLEDs — could be TVs of the past.</p><div><blockquote><p>Samsung gets credit for popularizing the term 'QLED' as a means of describing what it viewed as a core feature.</p></blockquote></div><p>While many popular brands offer quantum dot-enhanced TVs, Samsung gets credit for popularizing the term “QLED” as a means of describing what it viewed as a core feature.</p><p>In recent years, Samsung even expanded its lineup to include Neo QLED TVs. Initially, the term referred to quantum dot-enhanced sets that leveraged Mini-LED backlighting with full-array local dimming — the best-performing, non-OLED TVs in Samsung’s catalogue.</p><p>Unfortunately, Neo QLEDs are on their way out and, worse, some Neo QLEDs have even dropped hardware-based local dimming. </p><p>But QLED's slow demise isn't all gloom and doom: 2026 marked the first year that Samsung’s Micro RGB TVs sat at the top of its LED lineup. These souped-up Mini-LED TVs use red-, green- and blue-colored backlights to enhance color rather than quantum dots.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-e4EYbW"></div>                            </div>                            <script src="https://kwizly.com/embed/e4EYbW.js" async></script><p>In retrospect, Samsung's restructuring of the Neo QLED lineup dovetailing with the release of its two first Micro RGB TVs should’ve been a strong indication that the former was on its way out. </p><p>This leaves somewhat of a vacancy in the mid-range-to-high-end, non-OLED section of Samsung’s portfolio. And the candidate that makes the most sense to fill that space is Micro RGB.</p><h2 id="analysis-micro-rgb-expansion-will-lead-to-cheaper-micro-rgb-tvs">Analysis: Micro RGB expansion will lead to cheaper Micro RGB TVs</h2><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="rsQHakw2SZaPvFVHcotopg" name="rgb_tv_header" alt="Two Samsung Micro RGB TVs on a colorful backdrop." src="https://cdn.mos.cms.futurecdn.net/rsQHakw2SZaPvFVHcotopg-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: Samsung / Edited by Gemini)</span></figcaption></figure><p>To my eyes, of the many brands taking a swing at RGB LED technology, Samsung’s Micro RGB tech is second only to Sony’s True RGB.</p><div><blockquote><p>It’s just as important that the production of Micro RGB TVs gets more cost-effective than that the tech improves at the highest end</p></blockquote></div><p>It takes a well-engineered combination of nimble hardware and intricate processing for a complex arrangement of red-, blue- and green-colored LEDs to properly harmonize, and Samsung seems to have figured it out.</p><p>The next step, then, is to expand. For Samsung, it’s just as important that the production of Micro RGB TVs gets more cost-effective than that the tech improves at the highest end.</p><p>There are two Micro RGB TVs available to the average consumer this year: the Samsung R85H and the flagship R95H. At the time of publishing, the 55-inch, entry-level R85H is the most affordable path to Samsung Micro RGB, but $1,199 is not cheap.</p><div class="product"><a data-dimension112="434e2274-b5f2-11f1-8e9a-a5083337e931" data-action="Deal Block" data-label="55" R85H 4K Micro RGB TV" data-dimension48="55" R85H 4K Micro RGB TV" data-dimension25="$1199" href="https://www.bestbuy.com/product/samsung-55-class-r85h-series-micro-rgb-4k-uhd-samsungvisionai-smart-tizen-tv-2026/JJGRF3HY9L" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:900px;"><p class="vanilla-image-block" style="padding-top:60.78%;"><img id="9YuZiPAwXBwpBcTKEKyZqi" name="Samsung R85H deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9YuZiPAwXBwpBcTKEKyZqi-1920-80.jpg" mos="" align="middle" fullscreen="" width="900" height="547" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/product/samsung-55-class-r85h-series-micro-rgb-4k-uhd-samsungvisionai-smart-tizen-tv-2026/JJGRF3HY9L" target="_blank" rel="nofollow" data-dimension112="434e2274-b5f2-11f1-8e9a-a5083337e931" data-action="Deal Block" data-label='55" R85H 4K Micro RGB TV' data-dimension48='55" R85H 4K Micro RGB TV' data-dimension25="$1199">55" R85H 4K Micro RGB TV: was $1599 now $1199</a></strong><br>Curious about Micro RGB technology but don't want to spend too much? The 55-inch R85H is Samsung's most affordable Micro RGB TV on shelves, and while it's not quite as stunning in its presentation as the flagship-level R95H, you're still getting a bright, punchy picture and plenty of gaming- and streaming-related features.<a class="view-deal button" href="https://www.bestbuy.com/product/samsung-55-class-r85h-series-micro-rgb-4k-uhd-samsungvisionai-smart-tizen-tv-2026/JJGRF3HY9L" target="_blank" rel="nofollow" data-dimension112="434e2274-b5f2-11f1-8e9a-a5083337e931" data-action="Deal Block" data-label="55" R85H 4K Micro RGB TV" data-dimension48="55" R85H 4K Micro RGB TV" data-dimension25="$1199">View Deal</a></p></div><p>If Samsung does, indeed, phase out its QLEDs, then garden-variety, non-quantum-dot LED TVs will represent the cheapest tier of Samsung’s lineup. Some, I assume, will tap Mini-LEDs.</p><p>By the time this comes to pass, it would be shocking if Samsung's Micro RGB TV lineup hasn’t expanded beyond just a pair of (rather pricey) sets. After all, it took a few years, but Samsung now offers three tiers of OLED TV per year. When it first returned to the OLED scene, Samsung only sold one model.</p><p>There’s nothing stopping Hisense, Sony and TCL from continuing to tinker with quantum-dot color for the foreseeable future, either. Things could change in a hurry, but from where we’re sitting right now, TCL seems to be all-in on Super Quantum Dot (SQD), the brand’s newest spin on an old formula.</p><p>It may be bittersweet to say goodbye to our old friend QLED, but if Samsung plays its cards right, it could bring RGB LED technology to the masses before anyone else — just as it did with quantum dots once before.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/tvs/samsung-tv-report-card-2026-you-can-rely-on-samsung-to-deliver-exceptional-performance">Samsung TV report card 2026: 'You can rely on Samsung to deliver exceptional performance'</a></li><li><a href="https://www.tomsguide.com/tvs/are-flagship-mini-led-tvs-on-their-way-out-heres-how-rgb-led-technology-is-already-reshaping-the-industry">Are flagship Mini-LED TVs on their way out? Here’s how RGB LED technology is already reshaping the industry</a></li><li><a href="https://www.tomsguide.com/tvs/tcl-is-suing-samsung-for-false-advertising-on-its-mini-led-tvs-heres-how-to-tell-if-your-tv-is-included">TCL is suing Samsung for false advertising on its Mini-LED TVs — here’s how to tell if your TV is included</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-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="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-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="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[ Samsung Galaxy Watch Ultra 2 review: Android's toughest smartwatch is improved in nearly every way ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Galaxy Watch Ultra series is Samsung's answer to the rugged, outdoor adventure-ready Apple Watch Ultra series, and the latest model, the Samsung Galaxy Watch Ultra 2, makes a strong case for being the best tough-built, full-featured smartwatch on the market today.</p><p>Two years after the launch of the original ultra-rugged <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-review">Samsung Galaxy Watch</a>, the new model adds better battery life, tons of new health and fitness insights, a brighter screen, and improved water resistance, all in a familiar design.</p><p>But can the Samsung Galaxy Watch Ultra 2 <em>actually</em> keep up with the latest <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4">Apple Watch Ultra 4</a> and/or the <a href="https://www.tomsguide.com/best-picks/best-garmin-watch">best Garmin watches</a> when it comes to logging adrenaline-pumping activities like mountain bike rides, hikes, and more? I decided to find out by wearing the Galaxy Watch Ultra 2 for two weeks. Here's what I discovered. </p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-key-upgrades"><span>Galaxy Watch Ultra 2: Key upgrades</span></h3><p>But first, here’s a cheat sheet to all the most notable Galaxy Watch Ultra 2 stats and upgrades. </p><ul><li><strong>Price: </strong>At $699, the Galaxy Watch Ultra 2 is $50 more than its predecessor, which launched two years ago, but still $100 less than its nearest competitor, the Apple Watch Ultra 3.</li><li><strong>Design:</strong> The Galaxy Watch Ultra 2 is a tiny bit thinner than the original Galaxy Watch Ultra, but you may not notice the difference; the dimensions and weight are nearly identical to the original model</li><li><strong>Screen: </strong>Maximum screen brightness has been bumped up from 4,000 nits to 5,000 nits, making it remarkably visible in direct sunlight</li><li><strong>Health features:</strong> New 'Vitals' dashboard with key metrics including heart rate, HRV, Sp02, body temp, and breath rate in one place; new 'Heart Health' score</li><li><strong>Fitness features:</strong> New Cardio Load insights, new Fitness Index score out of 100 based on factors like daily step count average, V02 Max, average heart rate, BIA (Bioelectrical Impedance Analysis), and average workout recovery time</li><li><strong>Battery life:</strong> 800 mAh battery is the largest in an Android wearable and a 35% capacity increase over the original Galaxy Watch Ultra; battery life usage averages ~25% drain per day in testing so far</li></ul><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-versus-competition"><span>Galaxy Watch Ultra 2: Versus competition</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Samsung Galaxy Watch Ultra 2</p></th><th  ><p>Samsung Galaxy Watch Ultra </p></th><th  ><p>Apple Watch Ultra 4</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p>$699 / AU$1299</p></td><td  ><p>$649</p></td><td  ><p>$799</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions </strong></p></td><td  ><p>47 x 47 x 10 mm </p></td><td  ><p>47 x 47 x 12 mm </p></td><td  ><p>49 x 44 x 12 mm</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>61.5 g</p></td><td  ><p>60.5 g</p></td><td  ><p>63 g</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>1.52-inch AMOLED, 5,000 nits max brightness </p></td><td  ><p>1.5-inch AMOLED, 3,000 nits max brightness </p></td><td  ><p>1.98-inch OLED, 3,000 nits max brightness</p></td></tr><tr><td class="firstcol " ><p><strong>Water resistance </strong></p></td><td  ><p>100 meters</p></td><td  ><p>100 meters (not approved for diving)</p></td><td  ><p>100 meters</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life (tested)</strong></p></td><td  ><p>60 hours</p></td><td  ><p>48 hours </p></td><td  ><p>50 hours</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-value-3-5"><span>Galaxy Watch Ultra 2 value: 3/5</span></h3><ul><li><strong>At $699, the Ultra 2 is $50 more than its predecessor but still $100 cheaper than the Apple Watch Ultra 4</strong></li><li><strong>The more affordable Galaxy Watch 9 offers most of the same features as the Galaxy Watch Ultra 2, starting at $379</strong></li></ul><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4737px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="7RLoxSzFXxAzKQFchr6Qod" name="GalaxyWatchUltra2-v-AWU3-01" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/7RLoxSzFXxAzKQFchr6Qod-1920-80.jpg" mos="" align="middle" fullscreen="" width="4737" height="2664" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy Watch Ultra 2 is priced at $699, a modest $50 increase over the launch price of its two-year-old predecessor. More notably, it's a hundred bucks cheaper than the latest Apple Watch Ultra 4, its nearest non-Android competitor. </p><p>Meanwhile, the latest <a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9https://www.tomsguide.com/wellness/smartwatches/i-wore-the-samsung-galaxy-watch-9-for-a-month-the-new-health-tools-impress-but-that-doesnt-mean-you-should-upgrade">Galaxy Watch 9</a> models —which share pretty much all the same features, just in a less beefy package — range from $379 to $459. </p><p>The <a href="https://www.amazon.com/Samsung-Galaxy-Ultra2-Titanium-Smartwatch/dp/B0H1D6V1BB/" target="_blank" rel="nofollow">$699 Galaxy Watch Ultra 2</a> is available now in stores and online. </p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-display-4-5-5"><span>Galaxy Watch Ultra 2 display: 4.5/5</span></h3><ul><li><strong>The Galaxy Watch Ultra 2 has one of the largest, brightest displays in any full-featured smartwatch</strong></li><li><strong>Max brightness is 5,000 nits, making the Ultra 2 a breeze to read in direct sunlight</strong></li></ul><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tD4jVF3hN7MiivgZYydHDe" name="GalaxyWatchUltra2-08" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/tD4jVF3hN7MiivgZYydHDe-1920-80.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The new Samsung Galaxy Watch Ultra 2 sports a sizable 1.52-inch display that maxes out at an impressive 5,000 nits, making it one of the brightest displays in any full-featured wearable, including 2026's <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">best smartwatches</a>.</p><p>The Apple Watch Ultra 4, by comparison, also features a large, lovely display, but it only maxes out at 3,000 nits. Real-world translation: the new Galaxy Watch Ultra 2 is a lot easier to read in bright sunlight than the newest Apple Watch Ultra.</p><p>I also wore both the Galaxy Watch Ultra 2 and <a href="https://www.tomsguide.com/Garmin-Instinct-3-review">Garmin Instinct 3</a> — my go-to GPS sports watch — while e-mountain biking and also found the former more legible while on the move.</p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-design-and-durability-4-5"><span>Galaxy Watch Ultra 2 design and durability: 4/5</span></h3><ul><li><strong>Unlike its predecessor, the Galaxy Watch Ultra 2 is now officially scuba dive-certified</strong></li><li><strong>The case is a little slimmer than before, but you might not notice; ultimately, the Galaxy Watch Ultra feels pretty chunky on my 6.5-inch wrist</strong></li><li><strong>The included strap is softer and more flexible than the strap for the original model</strong></li></ul><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4613px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="u4HGWUFwc8QuKbaWkCz6NZ" name="GalaxyUltra2-dive-02" alt="Close-up of a water-soaked Samsung Galaxy Watch Ultra 2 on a bright blue background" src="https://cdn.mos.cms.futurecdn.net/u4HGWUFwc8QuKbaWkCz6NZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="4613" height="2595" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The original Samsung Galaxy Watch Ultra promises 100 meters of water resistance, but unlike its Apple Watch Ultra counterpart, Samsung's rugged model wasn't intended for use while diving or even snorkeling.</p><p>Samsung no doubt caught some flak for this shortcoming. Thankfully, the new Galaxy Watch Ultra 2 is thoroughly dive-ready. In fact, Samsung partnered with the industry-trusted <a href="https://www.mares.com/en_US/mares-app" target="_blank">Mares diving app</a> to turn the Galaxy Watch Ultra 2 into a <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">fully-fledged dive computer</a>, complete with speed monitoring and safety-stop alerts. The app costs $8.99 a month or $69.99 for the year. </p><p>The Ultra 2 is rated for 100 meters of water resistance and is EN13319-certified for scuba diving and IP69K-certified against dust and moisture.</p><p>Design-wise, the Galaxy Watch Ultra 2 looks nearly identical to its predecessor, with close-to-the-same dimensions and weight. That said, Samsung technically shaved 2mm off the case thickness, but I hardly noticed it. The case still feels very large on my 6.5-inch wrist.</p><p>There are three physical buttons along one side of the case; the center "Action" button can be customized to perform one of eight actions. I set it up to start a workout. </p><p>One less obvious but definitely welcome design change is the inclusion of a softer, more flexible strap. Also, the Ultra 2 uses the same attachment system as its predecessor, so if you prefer the older version, you can easily swap it onto the newer model.</p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-health-tools-4-5-5"><span>Galaxy Watch Ultra 2 Health tools: 4.5/5</span></h3><ul><li><strong>New Vitals tab in Samsung Health app provides useful insights into long-term health and fitness trends</strong></li><li><strong>Comprehensive sleep tracking reports on par with the best smartwatches</strong></li><li><strong>None of Samsung's holistic features are paywalled, unlike Google and Garmin</strong></li><li><strong>New Heart Health score for monitoring cardiovascular wellness</strong></li></ul><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4797px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="vHP2ZPZZ4Z6xQ2bKK5vYtZ" name="GalaxyWatchUltra2-06" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/vHP2ZPZZ4Z6xQ2bKK5vYtZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="4797" height="2698" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Similar to the new Samsung Galaxy Watch 9, the Galaxy Watch Ultra 2 ships fully-loaded with all sorts of new health and fitness insights. </p><p>These features include a new Vitals dashboard in the Samsung Health app for viewing your most important up-to-the-minute health stats in one place, a new Cardio Load score to track your heart health, and a new Fitness Index score that compares your overall physical health to averages for your age and gender. </p><p>The Vitals tab shows your current heart rate, heart rate variability (HRV), blood oxygen saturation percentage (Sp02), body temperature, and breathing rate. </p><p>The new Heart Health score ranges from one to 100, with the upper end being better. This metric updates dynamically throughout the day, keeping users appraised of how their everyday decisions may be impacting cardiovascular health for better or worse.</p><p>Fitness Index, meanwhile, factors in loads of fitness and wellness metrics to figure out how your overall health compares to your peers in five key categories: strength, cardio, endurance, flexibility, and body composition. You also get a dynamic score from one to 100 (mine is currently 82, or "average"). </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3515px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="LYfp9ZExt4wz8PuvGiRGJW" name="GalaxyWatchUltra2-03" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/LYfp9ZExt4wz8PuvGiRGJW-1920-80.jpg" mos="" align="middle" fullscreen="" width="3515" height="1977" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Samsung's smartwatches deliver some of the most detailed and actionable sleep reports of any smartwatch brand, and even though there aren't any shiny new features, the Galaxy Watch Ultra 2 is a mighty fine sleep tracker. That is, assuming you can get over wearing something so chunky to bed.</p><p>Like its predecessor, the Galaxy Watch Ultra 2 is FDA-cleared for sleep apnea detection, something that can't be said for the newest Google Pixel Watch models. </p><p>Also, unlike some of the competition — cough, cough, Google and Garmin — Samsung doesn't make you pay a monthly or annual subscription to access the full suite of health insights, including AI-powered personalized training and recovery recommendations. </p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-fitness-tracking-3-5"><span>Galaxy Watch Ultra 2 fitness tracking: 3/5</span></h3><ul><li><strong>Reliable heart rate tracking </strong></li><li><strong>Nearly as reliable at logging workouts as the best outdoor adventure watches, with one exception... </strong></li><li><strong>The Ultra 2 tends to overinflate the 'Climb' metric when logging walks, runs, bike rides, and hikes</strong></li><li><strong>Lacks tracking modes for some of the more nuanced yet popular outdoor activities like mountain biking and e-biking</strong></li></ul><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="z4fwvXKWVZz3GTwNXzQkGV" name="GalaxyUltra2-Instinct3-02" alt="Close-up of the Samsung Galaxy Watch Ultra 2 next to the Garmin Instinct 3 against a bright blue background" src="https://cdn.mos.cms.futurecdn.net/z4fwvXKWVZz3GTwNXzQkGV-1920-80.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Galaxy Watch Ultra 2 is rightfully billed as a smartwatch for outdoor enthusiasts and lovers of extreme-style sports. However, I found two shortcomings in my testing.</p><p>First, the Galaxy Watch Ultra 2 sometimes struggles to accurately track elevation gain when logging an outdoor workout, with a tendency to noticeably inflate climb data. I encountered this when testing the <a href="https://www.tomsguide.com/wellness/smartwatches/i-biked-11-miles-with-the-garmin-instinct-3-vs-samsung-galaxy-watch-ultra-2-and-the-winner-is-clear">Galaxy Watch Ultra 2 vs. Garmin Instinct 3</a> while city cycling in hilly Seattle, Washington, and again when I went <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-went-e-mountain-biking-in-cougar-country-with-the-new-samsung-galaxy-watch-ultra-2-vs-garmin-instinct-3-and-the-winner-is-clear">e-mountain biking in Washington State's Cougar Country</a>.</p><p>That said, the Samsung Galaxy Watch Ultra 2 performed extremely well in a head-to-head walk test comparison <a href="https://www.tomsguide.com/wellness/smartwatches/i-manually-counted-4-000-steps-to-test-the-apple-watch-ultra-3-vs-samsung-galaxy-watch-ultra-2-and-samsung-wins-the-accuracy-battle-with-better-elevation-data-too">versus the Apple Watch Ultra 3.</a> However, it once again delivered highly inflated elevation data when I <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">hiked the Cascade Mountains</a> with the Galaxy Watch Ultra 2 vs. Garmin Instinct 3 vs. Apple Watch Ultra 3.</p><p>Elevation tracking aside, the Samsung Galaxy Watch Ultra 2 largely performs as well as the best smartwatches and fitness trackers when it comes to reliably logging both moving and stationary workouts. Ultimately, as long as you wear the device tight enough, heart rate data should also be highly accurate. </p><p>My other criticism of the Galaxy Watch Ultra 2, which, again, is sold as an outdoor adventure-ready smartwatch, is a lack of tracking modes for popular activities, like mountain biking and e-biking.</p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-ai-features-3-5-5"><span>Galaxy Watch Ultra 2 AI features: 3.5/5</span></h3><ul><li><strong>Google's useful Gemini AI voice assistant is built-in and can be launched via a handy, new 'Raise to talk' gesture control </strong></li></ul><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4043px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="epc4o6iQmt6rjHFos7nLnd" name="GalaxyWatchUltra2-Gemini" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/epc4o6iQmt6rjHFos7nLnd-1920-80.jpg" mos="" align="middle" fullscreen="" width="4043" height="2275" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>In addition to AI playing a part in some of Samsung's flagship new health features, the Galaxy Watch Ultra 2 ships with Google's Gemini AI voice assistant built-in. It's the best smartwatch voice assistant I've tested so far, though that may change after I thoroughly test the latest <a href="https://www.tomsguide.com/wellness/smartwatches/how-to-enable-siri-ai-on-your-apple-watch">Siri AI</a> on the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12">Apple Watch Series 12</a>.</p><p>With access granted to apps like Gmail and Google Calendar, the Gemini assistant is more than capable of answering super-specific questions like, "When did my sister say her flight is landing next week?" as well as more generic ones like "What's the cheapest, easiest way to soften a stiff T-shirt?"</p><p>Better yet, you can launch the Gemini assistant using the Galaxy Watch Ultra 2 by simply raising your wrist (you will need to first turn it on in the settings menu).  Samsung's "Raise to talk" gesture control is remarkably effective, on par with Google's version for the Pixel Watch 4 and 5. </p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-battery-4-5-5"><span>Galaxy Watch Ultra 2 battery: 4.5/5</span></h3><ul><li><strong>The Galaxy Watch Ultra 2 exceeded its 60-hour-per-charge battery life rating in testing, lasting closer to 72 hours per charge with the always-on display enabled</strong></li><li><strong>This makes it one of the longest-lasting full-featured smartwatches for Android in 2026 and longer-lasting than the latest Apple Watch Ultra 4</strong></li></ul><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4187px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bymkGs65ruZkWfvJQAJDCe" name="GalaxyWatchUltra2-02" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/bymkGs65ruZkWfvJQAJDCe-1920-80.jpg" mos="" align="middle" fullscreen="" width="4187" height="2355" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Not only did Samsung equip the Galaxy Watch Ultra 2 with a higher-capacity battery — 590 mAh for the old model vs. 800 mAh for the new one — but the Galaxy Watch Ultra 2 is also more power-efficient than its predecessor, despite a brighter display.</p><p>The original Galaxy Watch Ultra had a battery life rating of 48 hours per charge, a claim we verified in our testing. The new model is rated to last up to 60 hours per charge, but in my testing, it comfortably surpassed that, cruising for closer to 72 hours per charge. </p><p>By comparison, the Samsung <a href="https://www.tomsguide.com/wellness/smartwatches/i-wore-the-samsung-galaxy-watch-9-for-a-month-the-new-health-tools-impress-but-that-doesnt-mean-you-should-upgrade#section-samsung-galaxy-watch-9-battery-life-3-5">Galaxy Watch 9 gets 40 hours</a> per charge at best (44mm). Meanwhile, the latest <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-first-impressions-5-reasons-to-buy-and-2-reasons-to-skip-apples-new-rugged-model">Apple Watch Ultra 4</a>, the nearest competitor to the Galaxy Watch Ultra 2, lasts for about 50 hours per charge. </p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-review-verdict"><span>Galaxy Watch Ultra 2 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:3792px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="AZF7DPLYsQoJ9PLhoqBiNo" name="AWU3-GalaxyU2-Instinct3-03" alt="Close-up of the Samsung Galaxy Watch Ultra 2, Apple Watch Ultra 3 and Garmin Instinct 3 in nature" src="https://cdn.mos.cms.futurecdn.net/AZF7DPLYsQoJ9PLhoqBiNo-1920-80.jpg" mos="" align="middle" fullscreen="" width="3792" height="2134" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy Watch Ultra 2 is a meaningful update to the original Galaxy Watch Ultra. The newer model is even tougher, with legit scuba-diving-ready specs and features, longer-lasting, with up to three days of battery per charge, and ever-so-slightly more comfortable thanks to a thinner case and a softer, more flexible strap.</p><p>The screen brightness has also been increased, giving the Galaxy Watch Ultra 2 the brightest display in any full-featured smartwatch for Android. Plus, new health and fitness tracking metrics help to bring long-term holistic trends into sharper focus. </p><p>As an outdoor adventure watch, the Galaxy Watch Ultra 2 proved mighty capable, with one exception: faulty elevation data. However, I'm hoping this is just a minor hiccup that will eventually be fixed with future firmware. </p><p>Ultimately, the Galaxy Watch Ultra 2 is a tougher, smarter, longer-lasting take on what was already one of the best Android smartwatches ever made. That, I think, is worth the $50 price increase.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-review</link>
                                                                            <description>
                            <![CDATA[ The toughest full-featured smartwatch for Android just got even better. The new Galaxy Watch Ultra 2 is better-built, longer-lasting, smarter, and even comfier than its predecessor. Here are my takeaways after two weeks wearing it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">T7XTs9fChvvtVKkqzVKQfX</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/8B3oWg32u4GseBhhsnfnea-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 17 Sep 2026 08:30:00 +0000</pubDate>                                                                                                                                <updated>Thu, 17 Sep 2026 17:44:24 +0000</updated>
                                                                                                                                            <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&gt;&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/8B3oWg32u4GseBhhsnfnea-1920-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch]]></media:description>                                                            <media:text><![CDATA[Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/8B3oWg32u4GseBhhsnfnea-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Galaxy Watch Ultra series is Samsung's answer to the rugged, outdoor adventure-ready Apple Watch Ultra series, and the latest model, the Samsung Galaxy Watch Ultra 2, makes a strong case for being the best tough-built, full-featured smartwatch on the market today.</p><p>Two years after the launch of the original ultra-rugged <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-review">Samsung Galaxy Watch</a>, the new model adds better battery life, tons of new health and fitness insights, a brighter screen, and improved water resistance, all in a familiar design.</p><p>But can the Samsung Galaxy Watch Ultra 2 <em>actually</em> keep up with the latest <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4">Apple Watch Ultra 4</a> and/or the <a href="https://www.tomsguide.com/best-picks/best-garmin-watch">best Garmin watches</a> when it comes to logging adrenaline-pumping activities like mountain bike rides, hikes, and more? I decided to find out by wearing the Galaxy Watch Ultra 2 for two weeks. Here's what I discovered. </p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-key-upgrades"><span>Galaxy Watch Ultra 2: Key upgrades</span></h3><p>But first, here’s a cheat sheet to all the most notable Galaxy Watch Ultra 2 stats and upgrades. </p><ul><li><strong>Price: </strong>At $699, the Galaxy Watch Ultra 2 is $50 more than its predecessor, which launched two years ago, but still $100 less than its nearest competitor, the Apple Watch Ultra 3.</li><li><strong>Design:</strong> The Galaxy Watch Ultra 2 is a tiny bit thinner than the original Galaxy Watch Ultra, but you may not notice the difference; the dimensions and weight are nearly identical to the original model</li><li><strong>Screen: </strong>Maximum screen brightness has been bumped up from 4,000 nits to 5,000 nits, making it remarkably visible in direct sunlight</li><li><strong>Health features:</strong> New 'Vitals' dashboard with key metrics including heart rate, HRV, Sp02, body temp, and breath rate in one place; new 'Heart Health' score</li><li><strong>Fitness features:</strong> New Cardio Load insights, new Fitness Index score out of 100 based on factors like daily step count average, V02 Max, average heart rate, BIA (Bioelectrical Impedance Analysis), and average workout recovery time</li><li><strong>Battery life:</strong> 800 mAh battery is the largest in an Android wearable and a 35% capacity increase over the original Galaxy Watch Ultra; battery life usage averages ~25% drain per day in testing so far</li></ul><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-versus-competition"><span>Galaxy Watch Ultra 2: Versus competition</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Samsung Galaxy Watch Ultra 2</p></th><th  ><p>Samsung Galaxy Watch Ultra </p></th><th  ><p>Apple Watch Ultra 4</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p>$699 / AU$1299</p></td><td  ><p>$649</p></td><td  ><p>$799</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions </strong></p></td><td  ><p>47 x 47 x 10 mm </p></td><td  ><p>47 x 47 x 12 mm </p></td><td  ><p>49 x 44 x 12 mm</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>61.5 g</p></td><td  ><p>60.5 g</p></td><td  ><p>63 g</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>1.52-inch AMOLED, 5,000 nits max brightness </p></td><td  ><p>1.5-inch AMOLED, 3,000 nits max brightness </p></td><td  ><p>1.98-inch OLED, 3,000 nits max brightness</p></td></tr><tr><td class="firstcol " ><p><strong>Water resistance </strong></p></td><td  ><p>100 meters</p></td><td  ><p>100 meters (not approved for diving)</p></td><td  ><p>100 meters</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life (tested)</strong></p></td><td  ><p>60 hours</p></td><td  ><p>48 hours </p></td><td  ><p>50 hours</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-value-3-5"><span>Galaxy Watch Ultra 2 value: 3/5</span></h3><ul><li><strong>At $699, the Ultra 2 is $50 more than its predecessor but still $100 cheaper than the Apple Watch Ultra 4</strong></li><li><strong>The more affordable Galaxy Watch 9 offers most of the same features as the Galaxy Watch Ultra 2, starting at $379</strong></li></ul><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4737px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="7RLoxSzFXxAzKQFchr6Qod" name="GalaxyWatchUltra2-v-AWU3-01" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/7RLoxSzFXxAzKQFchr6Qod-1920-80.jpg" mos="" align="middle" fullscreen="" width="4737" height="2664" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy Watch Ultra 2 is priced at $699, a modest $50 increase over the launch price of its two-year-old predecessor. More notably, it's a hundred bucks cheaper than the latest Apple Watch Ultra 4, its nearest non-Android competitor. </p><p>Meanwhile, the latest <a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9https://www.tomsguide.com/wellness/smartwatches/i-wore-the-samsung-galaxy-watch-9-for-a-month-the-new-health-tools-impress-but-that-doesnt-mean-you-should-upgrade">Galaxy Watch 9</a> models —which share pretty much all the same features, just in a less beefy package — range from $379 to $459. </p><p>The <a href="https://www.amazon.com/Samsung-Galaxy-Ultra2-Titanium-Smartwatch/dp/B0H1D6V1BB/" target="_blank" rel="nofollow">$699 Galaxy Watch Ultra 2</a> is available now in stores and online. </p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-display-4-5-5"><span>Galaxy Watch Ultra 2 display: 4.5/5</span></h3><ul><li><strong>The Galaxy Watch Ultra 2 has one of the largest, brightest displays in any full-featured smartwatch</strong></li><li><strong>Max brightness is 5,000 nits, making the Ultra 2 a breeze to read in direct sunlight</strong></li></ul><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tD4jVF3hN7MiivgZYydHDe" name="GalaxyWatchUltra2-08" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/tD4jVF3hN7MiivgZYydHDe-1920-80.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The new Samsung Galaxy Watch Ultra 2 sports a sizable 1.52-inch display that maxes out at an impressive 5,000 nits, making it one of the brightest displays in any full-featured wearable, including 2026's <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">best smartwatches</a>.</p><p>The Apple Watch Ultra 4, by comparison, also features a large, lovely display, but it only maxes out at 3,000 nits. Real-world translation: the new Galaxy Watch Ultra 2 is a lot easier to read in bright sunlight than the newest Apple Watch Ultra.</p><p>I also wore both the Galaxy Watch Ultra 2 and <a href="https://www.tomsguide.com/Garmin-Instinct-3-review">Garmin Instinct 3</a> — my go-to GPS sports watch — while e-mountain biking and also found the former more legible while on the move.</p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-design-and-durability-4-5"><span>Galaxy Watch Ultra 2 design and durability: 4/5</span></h3><ul><li><strong>Unlike its predecessor, the Galaxy Watch Ultra 2 is now officially scuba dive-certified</strong></li><li><strong>The case is a little slimmer than before, but you might not notice; ultimately, the Galaxy Watch Ultra feels pretty chunky on my 6.5-inch wrist</strong></li><li><strong>The included strap is softer and more flexible than the strap for the original model</strong></li></ul><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4613px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="u4HGWUFwc8QuKbaWkCz6NZ" name="GalaxyUltra2-dive-02" alt="Close-up of a water-soaked Samsung Galaxy Watch Ultra 2 on a bright blue background" src="https://cdn.mos.cms.futurecdn.net/u4HGWUFwc8QuKbaWkCz6NZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="4613" height="2595" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The original Samsung Galaxy Watch Ultra promises 100 meters of water resistance, but unlike its Apple Watch Ultra counterpart, Samsung's rugged model wasn't intended for use while diving or even snorkeling.</p><p>Samsung no doubt caught some flak for this shortcoming. Thankfully, the new Galaxy Watch Ultra 2 is thoroughly dive-ready. In fact, Samsung partnered with the industry-trusted <a href="https://www.mares.com/en_US/mares-app" target="_blank">Mares diving app</a> to turn the Galaxy Watch Ultra 2 into a <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">fully-fledged dive computer</a>, complete with speed monitoring and safety-stop alerts. The app costs $8.99 a month or $69.99 for the year. </p><p>The Ultra 2 is rated for 100 meters of water resistance and is EN13319-certified for scuba diving and IP69K-certified against dust and moisture.</p><p>Design-wise, the Galaxy Watch Ultra 2 looks nearly identical to its predecessor, with close-to-the-same dimensions and weight. That said, Samsung technically shaved 2mm off the case thickness, but I hardly noticed it. The case still feels very large on my 6.5-inch wrist.</p><p>There are three physical buttons along one side of the case; the center "Action" button can be customized to perform one of eight actions. I set it up to start a workout. </p><p>One less obvious but definitely welcome design change is the inclusion of a softer, more flexible strap. Also, the Ultra 2 uses the same attachment system as its predecessor, so if you prefer the older version, you can easily swap it onto the newer model.</p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-health-tools-4-5-5"><span>Galaxy Watch Ultra 2 Health tools: 4.5/5</span></h3><ul><li><strong>New Vitals tab in Samsung Health app provides useful insights into long-term health and fitness trends</strong></li><li><strong>Comprehensive sleep tracking reports on par with the best smartwatches</strong></li><li><strong>None of Samsung's holistic features are paywalled, unlike Google and Garmin</strong></li><li><strong>New Heart Health score for monitoring cardiovascular wellness</strong></li></ul><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4797px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="vHP2ZPZZ4Z6xQ2bKK5vYtZ" name="GalaxyWatchUltra2-06" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/vHP2ZPZZ4Z6xQ2bKK5vYtZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="4797" height="2698" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Similar to the new Samsung Galaxy Watch 9, the Galaxy Watch Ultra 2 ships fully-loaded with all sorts of new health and fitness insights. </p><p>These features include a new Vitals dashboard in the Samsung Health app for viewing your most important up-to-the-minute health stats in one place, a new Cardio Load score to track your heart health, and a new Fitness Index score that compares your overall physical health to averages for your age and gender. </p><p>The Vitals tab shows your current heart rate, heart rate variability (HRV), blood oxygen saturation percentage (Sp02), body temperature, and breathing rate. </p><p>The new Heart Health score ranges from one to 100, with the upper end being better. This metric updates dynamically throughout the day, keeping users appraised of how their everyday decisions may be impacting cardiovascular health for better or worse.</p><p>Fitness Index, meanwhile, factors in loads of fitness and wellness metrics to figure out how your overall health compares to your peers in five key categories: strength, cardio, endurance, flexibility, and body composition. You also get a dynamic score from one to 100 (mine is currently 82, or "average"). </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3515px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="LYfp9ZExt4wz8PuvGiRGJW" name="GalaxyWatchUltra2-03" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/LYfp9ZExt4wz8PuvGiRGJW-1920-80.jpg" mos="" align="middle" fullscreen="" width="3515" height="1977" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Samsung's smartwatches deliver some of the most detailed and actionable sleep reports of any smartwatch brand, and even though there aren't any shiny new features, the Galaxy Watch Ultra 2 is a mighty fine sleep tracker. That is, assuming you can get over wearing something so chunky to bed.</p><p>Like its predecessor, the Galaxy Watch Ultra 2 is FDA-cleared for sleep apnea detection, something that can't be said for the newest Google Pixel Watch models. </p><p>Also, unlike some of the competition — cough, cough, Google and Garmin — Samsung doesn't make you pay a monthly or annual subscription to access the full suite of health insights, including AI-powered personalized training and recovery recommendations. </p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-fitness-tracking-3-5"><span>Galaxy Watch Ultra 2 fitness tracking: 3/5</span></h3><ul><li><strong>Reliable heart rate tracking </strong></li><li><strong>Nearly as reliable at logging workouts as the best outdoor adventure watches, with one exception... </strong></li><li><strong>The Ultra 2 tends to overinflate the 'Climb' metric when logging walks, runs, bike rides, and hikes</strong></li><li><strong>Lacks tracking modes for some of the more nuanced yet popular outdoor activities like mountain biking and e-biking</strong></li></ul><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="z4fwvXKWVZz3GTwNXzQkGV" name="GalaxyUltra2-Instinct3-02" alt="Close-up of the Samsung Galaxy Watch Ultra 2 next to the Garmin Instinct 3 against a bright blue background" src="https://cdn.mos.cms.futurecdn.net/z4fwvXKWVZz3GTwNXzQkGV-1920-80.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Galaxy Watch Ultra 2 is rightfully billed as a smartwatch for outdoor enthusiasts and lovers of extreme-style sports. However, I found two shortcomings in my testing.</p><p>First, the Galaxy Watch Ultra 2 sometimes struggles to accurately track elevation gain when logging an outdoor workout, with a tendency to noticeably inflate climb data. I encountered this when testing the <a href="https://www.tomsguide.com/wellness/smartwatches/i-biked-11-miles-with-the-garmin-instinct-3-vs-samsung-galaxy-watch-ultra-2-and-the-winner-is-clear">Galaxy Watch Ultra 2 vs. Garmin Instinct 3</a> while city cycling in hilly Seattle, Washington, and again when I went <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-went-e-mountain-biking-in-cougar-country-with-the-new-samsung-galaxy-watch-ultra-2-vs-garmin-instinct-3-and-the-winner-is-clear">e-mountain biking in Washington State's Cougar Country</a>.</p><p>That said, the Samsung Galaxy Watch Ultra 2 performed extremely well in a head-to-head walk test comparison <a href="https://www.tomsguide.com/wellness/smartwatches/i-manually-counted-4-000-steps-to-test-the-apple-watch-ultra-3-vs-samsung-galaxy-watch-ultra-2-and-samsung-wins-the-accuracy-battle-with-better-elevation-data-too">versus the Apple Watch Ultra 3.</a> However, it once again delivered highly inflated elevation data when I <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">hiked the Cascade Mountains</a> with the Galaxy Watch Ultra 2 vs. Garmin Instinct 3 vs. Apple Watch Ultra 3.</p><p>Elevation tracking aside, the Samsung Galaxy Watch Ultra 2 largely performs as well as the best smartwatches and fitness trackers when it comes to reliably logging both moving and stationary workouts. Ultimately, as long as you wear the device tight enough, heart rate data should also be highly accurate. </p><p>My other criticism of the Galaxy Watch Ultra 2, which, again, is sold as an outdoor adventure-ready smartwatch, is a lack of tracking modes for popular activities, like mountain biking and e-biking.</p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-ai-features-3-5-5"><span>Galaxy Watch Ultra 2 AI features: 3.5/5</span></h3><ul><li><strong>Google's useful Gemini AI voice assistant is built-in and can be launched via a handy, new 'Raise to talk' gesture control </strong></li></ul><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4043px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="epc4o6iQmt6rjHFos7nLnd" name="GalaxyWatchUltra2-Gemini" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/epc4o6iQmt6rjHFos7nLnd-1920-80.jpg" mos="" align="middle" fullscreen="" width="4043" height="2275" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>In addition to AI playing a part in some of Samsung's flagship new health features, the Galaxy Watch Ultra 2 ships with Google's Gemini AI voice assistant built-in. It's the best smartwatch voice assistant I've tested so far, though that may change after I thoroughly test the latest <a href="https://www.tomsguide.com/wellness/smartwatches/how-to-enable-siri-ai-on-your-apple-watch">Siri AI</a> on the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12">Apple Watch Series 12</a>.</p><p>With access granted to apps like Gmail and Google Calendar, the Gemini assistant is more than capable of answering super-specific questions like, "When did my sister say her flight is landing next week?" as well as more generic ones like "What's the cheapest, easiest way to soften a stiff T-shirt?"</p><p>Better yet, you can launch the Gemini assistant using the Galaxy Watch Ultra 2 by simply raising your wrist (you will need to first turn it on in the settings menu).  Samsung's "Raise to talk" gesture control is remarkably effective, on par with Google's version for the Pixel Watch 4 and 5. </p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-battery-4-5-5"><span>Galaxy Watch Ultra 2 battery: 4.5/5</span></h3><ul><li><strong>The Galaxy Watch Ultra 2 exceeded its 60-hour-per-charge battery life rating in testing, lasting closer to 72 hours per charge with the always-on display enabled</strong></li><li><strong>This makes it one of the longest-lasting full-featured smartwatches for Android in 2026 and longer-lasting than the latest Apple Watch Ultra 4</strong></li></ul><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4187px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bymkGs65ruZkWfvJQAJDCe" name="GalaxyWatchUltra2-02" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/bymkGs65ruZkWfvJQAJDCe-1920-80.jpg" mos="" align="middle" fullscreen="" width="4187" height="2355" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Not only did Samsung equip the Galaxy Watch Ultra 2 with a higher-capacity battery — 590 mAh for the old model vs. 800 mAh for the new one — but the Galaxy Watch Ultra 2 is also more power-efficient than its predecessor, despite a brighter display.</p><p>The original Galaxy Watch Ultra had a battery life rating of 48 hours per charge, a claim we verified in our testing. The new model is rated to last up to 60 hours per charge, but in my testing, it comfortably surpassed that, cruising for closer to 72 hours per charge. </p><p>By comparison, the Samsung <a href="https://www.tomsguide.com/wellness/smartwatches/i-wore-the-samsung-galaxy-watch-9-for-a-month-the-new-health-tools-impress-but-that-doesnt-mean-you-should-upgrade#section-samsung-galaxy-watch-9-battery-life-3-5">Galaxy Watch 9 gets 40 hours</a> per charge at best (44mm). Meanwhile, the latest <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-first-impressions-5-reasons-to-buy-and-2-reasons-to-skip-apples-new-rugged-model">Apple Watch Ultra 4</a>, the nearest competitor to the Galaxy Watch Ultra 2, lasts for about 50 hours per charge. </p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-review-verdict"><span>Galaxy Watch Ultra 2 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:3792px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="AZF7DPLYsQoJ9PLhoqBiNo" name="AWU3-GalaxyU2-Instinct3-03" alt="Close-up of the Samsung Galaxy Watch Ultra 2, Apple Watch Ultra 3 and Garmin Instinct 3 in nature" src="https://cdn.mos.cms.futurecdn.net/AZF7DPLYsQoJ9PLhoqBiNo-1920-80.jpg" mos="" align="middle" fullscreen="" width="3792" height="2134" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy Watch Ultra 2 is a meaningful update to the original Galaxy Watch Ultra. The newer model is even tougher, with legit scuba-diving-ready specs and features, longer-lasting, with up to three days of battery per charge, and ever-so-slightly more comfortable thanks to a thinner case and a softer, more flexible strap.</p><p>The screen brightness has also been increased, giving the Galaxy Watch Ultra 2 the brightest display in any full-featured smartwatch for Android. Plus, new health and fitness tracking metrics help to bring long-term holistic trends into sharper focus. </p><p>As an outdoor adventure watch, the Galaxy Watch Ultra 2 proved mighty capable, with one exception: faulty elevation data. However, I'm hoping this is just a minor hiccup that will eventually be fixed with future firmware. </p><p>Ultimately, the Galaxy Watch Ultra 2 is a tougher, smarter, longer-lasting take on what was already one of the best Android smartwatches ever made. That, I think, is worth the $50 price increase.</p>
                                                            </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="low" 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="low" 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[ Yes, LG smart TVs know more about you than you think — but so do other TV brands ]]></title>
                                                                                                <dc:content><![CDATA[ <p>LG — makers of some of the <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a> on the market — is facing scrutiny after an investigative report revealed potential privacy vulnerabilities associated with its smart TVs. Specifically, the investigation purports that LG is aware that its TV users are being tracked to the degree that they are, but that in most cases, the user doesn’t.</p><p>For LG TV-owners, these developments could be cause for concern. Despite the seemingly endless spool of user agreements that unfurls during the set-up process, the extent to which a TV can track a person’s actions (and where that data ends up) remains eerily inscrutable.</p><p>But while LG is taking its turn under the microscope, every other TV brand is conveniently side-stepping the latest round of scrutiny. In 2026, every smart TV on the market is gathering a ton of data about who we are, what we watch and how likely we are to buy stuff — and there’s currently no incentive for them to stop.</p><h2 id="what-s-going-on-with-lg-smart-tvs">What’s going on with LG smart TVs?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uitP29WyfaomHeLZ2RpQf9" name="TG_LG-G5-TV-18" alt="The LG G5 OLED at Tom's Guide's Labs." src="https://cdn.mos.cms.futurecdn.net/uitP29WyfaomHeLZ2RpQf9-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>Let’s start with some context. According to a recent investigation by YouTube channel <a href="https://www.youtube.com/watch?v=6IFVTcM28KA" target="_blank" rel="nofollow">Gamers Nexus</a>, LG smart TVs continuously scan and gather information about devices connected to a user’s home Wi-Fi network.</p><p>The <a href="https://www.tomsguide.com/tvs/your-lg-tv-could-be-tracking-devices-on-your-home-wi-fi-heres-how-to-stop-it">LG smart TV news</a> gets even more concerning, though, as Gamers Nexus also discovered that select models record audio via microphones in the TV and remote control — even while the TV is disconnected from the internet. These audio files are transcribed, stored and can be sent to LG when the TV connects to the internet.</p><p>We’ve reached out to LG for more information on these matters, but based on comments provided to outlets like <a href="https://arstechnica.com/gadgets/2026/09/lg-tv-shown-capable-of-tracking-user-activity-even-when-offline/?utm_source=flipboard&utm_content=user/ArsTechnica" target="_blank" rel="nofollow">Ars Technica</a> and <a href="https://www.tomshardware.com/tech-industry/big-tech/lg-strongly-denies-tv-security-claims-says-tracking-and-snooping-concerns-not-true-online-investigation-claims-216-000-000-spy-tvs-record-audio" target="_blank" rel="nofollow">Tom’s Hardware</a>, the stated function of LG TVs’ network analyzation function is to recognize and enable compatible devices that can interface with the TV.</p><div><blockquote><p>Select models record audio via microphones in the TV and remote control — even while the TV is disconnected from the internet. </p></blockquote></div><p>Additionally, LG claims that its TVs’ always-on listening function is limited to situations in which this feature has been deliberately enabled by the user, either by via a button on the remote or when the TV detects the “wake” words (like “Hi, LG”). According to LG, transcribed text is locally processed and deleted — not stored.</p><p>Like many tech brands that deal heavily in the gathering and mapping of user data, LG insists that its practices are above board. But critics (myself included) maintain that the process in which data is collected and catalogued is too opaque for most people to understand, and that allowing companies increasing access to our private lives introduces certain risks.</p><p>LG happens to be the brand catching the most flak right now, but it’s far from the only actor engaging in these dealings. In fact, I can’t think of a single TV-maker that isn’t.</p><h2 id="lg-is-not-alone">LG is not alone</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2752px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2z7VjjBDu7CfpZvJzVmAfY" name="Roku oled" alt="The Roku Pro Series OLED TV in a living room." src="https://cdn.mos.cms.futurecdn.net/2z7VjjBDu7CfpZvJzVmAfY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2752" height="1548" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Roku)</span></figcaption></figure><p>The worldwide leader in OLED TVs isn’t the only brand whose smart TVs are built around data-collection. Nearly every major TV-maker in the world is getting in on the action and has been for years.</p><p>As TV-enjoyers, we awkwardly reap some of the benefits of this system. One of the biggest reasons why TVs have gotten better and cheaper is because brands are able to offset costs by collecting and selling user data.</p><p>But make no mistake: We are nowhere near the primary benefactors here. These companies study who we are and what we watch, map our habits and find ways to maximize that information.</p><p>In addition to LG, Hisense, Samsung, Sony and TCL have faced criticism for their use of Automatic Content Recognition (ACR), a built-in function that tracks what’s on screen, gathers screenshots and shares the data with the brand associated with the TV or its software. All of that on-screen information can then be used as a roadmap for trying to sell stuff back to the user.</p><div><blockquote><p>Almost every smart TV on shelves right now is equipped with at least one microphone. </p></blockquote></div><p>Almost every smart TV on shelves right now is equipped with at least one microphone. And, while there are ways to disable these mics, the amount of software entanglement that exists between voice-activated smart home devices, TVs and smartphones provides plenty of incentive for people to smash that “Agree” button at the bottom of a wall of complicated legalese without much of a thought.</p><p>The frenzied, capitalistic advent of AI-based TV features — many of which offer little tangible benefit but are nevertheless the centerpiece of a company’s marketing pitch — all but ensures that the relationship between us and our data is about to get even more opaque.</p><p>Smart TVs have made streaming more accessible and cheaper than ever, but along the way, there’s been a slow-creep of access granted to the companies we invite into our living rooms.</p><h2 id="how-to-protect-your-smart-tv-privacy">How to protect your smart TV privacy</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uK8b5fuFZgu6v85a4vtH4J" name="smart tv.shutterstock_2381270767" alt="smart tv with remotes" src="https://cdn.mos.cms.futurecdn.net/uK8b5fuFZgu6v85a4vtH4J-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>There’s no way around it: The <a href="https://www.tomsguide.com/tvs/heres-why-its-hard-to-find-dumb-tv-in-2026-and-why-you-shouldnt-buy-one-anyway">best “Dumb” TVs</a> don’t really exist, and if you’re buying a smart TV, there’s a certain amount of privacy you’ll have to give up in order to use it. There <em>are</em>, however, ways to nibble around the edges of the situation.</p><p>We recently published a guide on <a href="https://www.tomsguide.com/tvs/your-lg-tv-could-be-tracking-devices-on-your-home-wi-fi-heres-how-to-stop-it">how to stop an LG TV from listening</a>, but it wasn’t our first foray into the subject. We’ve also published a guide on <a href="https://www.tomsguide.com/tvs/your-tv-is-watching-you-how-to-turn-off-data-collection-on-lg-samsung-roku-and-more">how to turn off TV data collection</a> for several popular brands including Samsung, Roku, and sets built around Google TV and Amazon Fire TV.</p><p>If you’re unclear whether or not your TV is tapping an on-board listening device, we’ve outlined instructions on <a href="https://www.tomsguide.com/tvs/yes-your-tv-probably-has-a-microphone-in-it-heres-how-to-turn-it-off">how to disable a TV microphone</a>. The exact manner in which these on-board microphones are used depends on the brand associated with the TV and/or its software, but I highly recommend familiarizing yourself with your own set’s functionality.</p><p>Until something powerful compels TV companies to disclose more information about their business practices, we — the viewers — need to take it upon ourselves to understand what’s at stake when it comes to our personal data and to draw our own lines in the sand for what we deem acceptable and unacceptable. LG is the latest brand at the center of controversy, but it surely won’t be the last.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/tvs/your-lg-tv-could-be-tracking-devices-on-your-home-wi-fi-heres-how-to-stop-it">Your LG TV could be tracking devices on your home Wi-Fi — here’s how to stop it</a></li><li><a href="https://www.tomsguide.com/tvs/yes-your-tv-probably-has-a-microphone-in-it-heres-how-to-turn-it-off">Yes, your TV probably has a microphone in it — here's how to turn it off</a></li><li><a href="https://www.tomsguide.com/tvs/heres-why-its-hard-to-find-dumb-tv-in-2026-and-why-you-shouldnt-buy-one-anyway">Here's why it's hard to find 'dumb TV' in 2026 — and why you shouldn't buy one anyway</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tvs/yes-lg-smart-tvs-know-more-about-you-than-you-think-but-so-do-other-tv-brands</link>
                                                                            <description>
                            <![CDATA[ LG is far from the only brand that has serious questions to answer concerning smart TV privacy. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">uHvH5tvmXPNZs2oy6cC9DL</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sdYXGmHMCP7u9WFkt43kRi-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 12 Sep 2026 09:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[TVs]]></category>
                                                                                                <author><![CDATA[ michael.desjardin@futurenet.com (Michael Desjardin) ]]></author>                    <dc:creator><![CDATA[ Michael Desjardin ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/esytxRqW9GNVZNVCf7BFyV-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Michael Desjardin is a Senior Editor for TVs at Tom&#039;s Guide. He&#039;s been testing and tinkering with TVs professionally for over a decade, previously for Reviewed and USA Today. Michael studied media production and screenwriting at Emerson College. He loves cooking, zoning out to ambient music, and getting way too invested in the Red Sox. He considers himself living proof that TV doesn&#039;t necessarily rot your brain.&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/sdYXGmHMCP7u9WFkt43kRi-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[LG C6 OLED TV shown on a wood table]]></media:description>                                                            <media:text><![CDATA[LG C6 OLED TV shown on a wood table]]></media:text>
                                <media:title type="plain"><![CDATA[LG C6 OLED TV shown on a wood table]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sdYXGmHMCP7u9WFkt43kRi-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>LG — makers of some of the <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a> on the market — is facing scrutiny after an investigative report revealed potential privacy vulnerabilities associated with its smart TVs. Specifically, the investigation purports that LG is aware that its TV users are being tracked to the degree that they are, but that in most cases, the user doesn’t.</p><p>For LG TV-owners, these developments could be cause for concern. Despite the seemingly endless spool of user agreements that unfurls during the set-up process, the extent to which a TV can track a person’s actions (and where that data ends up) remains eerily inscrutable.</p><p>But while LG is taking its turn under the microscope, every other TV brand is conveniently side-stepping the latest round of scrutiny. In 2026, every smart TV on the market is gathering a ton of data about who we are, what we watch and how likely we are to buy stuff — and there’s currently no incentive for them to stop.</p><h2 id="what-s-going-on-with-lg-smart-tvs">What’s going on with LG smart TVs?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uitP29WyfaomHeLZ2RpQf9" name="TG_LG-G5-TV-18" alt="The LG G5 OLED at Tom's Guide's Labs." src="https://cdn.mos.cms.futurecdn.net/uitP29WyfaomHeLZ2RpQf9-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>Let’s start with some context. According to a recent investigation by YouTube channel <a href="https://www.youtube.com/watch?v=6IFVTcM28KA" target="_blank" rel="nofollow">Gamers Nexus</a>, LG smart TVs continuously scan and gather information about devices connected to a user’s home Wi-Fi network.</p><p>The <a href="https://www.tomsguide.com/tvs/your-lg-tv-could-be-tracking-devices-on-your-home-wi-fi-heres-how-to-stop-it">LG smart TV news</a> gets even more concerning, though, as Gamers Nexus also discovered that select models record audio via microphones in the TV and remote control — even while the TV is disconnected from the internet. These audio files are transcribed, stored and can be sent to LG when the TV connects to the internet.</p><p>We’ve reached out to LG for more information on these matters, but based on comments provided to outlets like <a href="https://arstechnica.com/gadgets/2026/09/lg-tv-shown-capable-of-tracking-user-activity-even-when-offline/?utm_source=flipboard&utm_content=user/ArsTechnica" target="_blank" rel="nofollow">Ars Technica</a> and <a href="https://www.tomshardware.com/tech-industry/big-tech/lg-strongly-denies-tv-security-claims-says-tracking-and-snooping-concerns-not-true-online-investigation-claims-216-000-000-spy-tvs-record-audio" target="_blank" rel="nofollow">Tom’s Hardware</a>, the stated function of LG TVs’ network analyzation function is to recognize and enable compatible devices that can interface with the TV.</p><div><blockquote><p>Select models record audio via microphones in the TV and remote control — even while the TV is disconnected from the internet. </p></blockquote></div><p>Additionally, LG claims that its TVs’ always-on listening function is limited to situations in which this feature has been deliberately enabled by the user, either by via a button on the remote or when the TV detects the “wake” words (like “Hi, LG”). According to LG, transcribed text is locally processed and deleted — not stored.</p><p>Like many tech brands that deal heavily in the gathering and mapping of user data, LG insists that its practices are above board. But critics (myself included) maintain that the process in which data is collected and catalogued is too opaque for most people to understand, and that allowing companies increasing access to our private lives introduces certain risks.</p><p>LG happens to be the brand catching the most flak right now, but it’s far from the only actor engaging in these dealings. In fact, I can’t think of a single TV-maker that isn’t.</p><h2 id="lg-is-not-alone">LG is not alone</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2752px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2z7VjjBDu7CfpZvJzVmAfY" name="Roku oled" alt="The Roku Pro Series OLED TV in a living room." src="https://cdn.mos.cms.futurecdn.net/2z7VjjBDu7CfpZvJzVmAfY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2752" height="1548" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Roku)</span></figcaption></figure><p>The worldwide leader in OLED TVs isn’t the only brand whose smart TVs are built around data-collection. Nearly every major TV-maker in the world is getting in on the action and has been for years.</p><p>As TV-enjoyers, we awkwardly reap some of the benefits of this system. One of the biggest reasons why TVs have gotten better and cheaper is because brands are able to offset costs by collecting and selling user data.</p><p>But make no mistake: We are nowhere near the primary benefactors here. These companies study who we are and what we watch, map our habits and find ways to maximize that information.</p><p>In addition to LG, Hisense, Samsung, Sony and TCL have faced criticism for their use of Automatic Content Recognition (ACR), a built-in function that tracks what’s on screen, gathers screenshots and shares the data with the brand associated with the TV or its software. All of that on-screen information can then be used as a roadmap for trying to sell stuff back to the user.</p><div><blockquote><p>Almost every smart TV on shelves right now is equipped with at least one microphone. </p></blockquote></div><p>Almost every smart TV on shelves right now is equipped with at least one microphone. And, while there are ways to disable these mics, the amount of software entanglement that exists between voice-activated smart home devices, TVs and smartphones provides plenty of incentive for people to smash that “Agree” button at the bottom of a wall of complicated legalese without much of a thought.</p><p>The frenzied, capitalistic advent of AI-based TV features — many of which offer little tangible benefit but are nevertheless the centerpiece of a company’s marketing pitch — all but ensures that the relationship between us and our data is about to get even more opaque.</p><p>Smart TVs have made streaming more accessible and cheaper than ever, but along the way, there’s been a slow-creep of access granted to the companies we invite into our living rooms.</p><h2 id="how-to-protect-your-smart-tv-privacy">How to protect your smart TV privacy</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uK8b5fuFZgu6v85a4vtH4J" name="smart tv.shutterstock_2381270767" alt="smart tv with remotes" src="https://cdn.mos.cms.futurecdn.net/uK8b5fuFZgu6v85a4vtH4J-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>There’s no way around it: The <a href="https://www.tomsguide.com/tvs/heres-why-its-hard-to-find-dumb-tv-in-2026-and-why-you-shouldnt-buy-one-anyway">best “Dumb” TVs</a> don’t really exist, and if you’re buying a smart TV, there’s a certain amount of privacy you’ll have to give up in order to use it. There <em>are</em>, however, ways to nibble around the edges of the situation.</p><p>We recently published a guide on <a href="https://www.tomsguide.com/tvs/your-lg-tv-could-be-tracking-devices-on-your-home-wi-fi-heres-how-to-stop-it">how to stop an LG TV from listening</a>, but it wasn’t our first foray into the subject. We’ve also published a guide on <a href="https://www.tomsguide.com/tvs/your-tv-is-watching-you-how-to-turn-off-data-collection-on-lg-samsung-roku-and-more">how to turn off TV data collection</a> for several popular brands including Samsung, Roku, and sets built around Google TV and Amazon Fire TV.</p><p>If you’re unclear whether or not your TV is tapping an on-board listening device, we’ve outlined instructions on <a href="https://www.tomsguide.com/tvs/yes-your-tv-probably-has-a-microphone-in-it-heres-how-to-turn-it-off">how to disable a TV microphone</a>. The exact manner in which these on-board microphones are used depends on the brand associated with the TV and/or its software, but I highly recommend familiarizing yourself with your own set’s functionality.</p><p>Until something powerful compels TV companies to disclose more information about their business practices, we — the viewers — need to take it upon ourselves to understand what’s at stake when it comes to our personal data and to draw our own lines in the sand for what we deem acceptable and unacceptable. LG is the latest brand at the center of controversy, but it surely won’t be the last.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/tvs/your-lg-tv-could-be-tracking-devices-on-your-home-wi-fi-heres-how-to-stop-it">Your LG TV could be tracking devices on your home Wi-Fi — here’s how to stop it</a></li><li><a href="https://www.tomsguide.com/tvs/yes-your-tv-probably-has-a-microphone-in-it-heres-how-to-turn-it-off">Yes, your TV probably has a microphone in it — here's how to turn it off</a></li><li><a href="https://www.tomsguide.com/tvs/heres-why-its-hard-to-find-dumb-tv-in-2026-and-why-you-shouldnt-buy-one-anyway">Here's why it's hard to find 'dumb TV' in 2026 — and why you shouldn't buy one anyway</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[ The new Sony Bravia 6 OLED TV is the LG C6 competitor I've been waiting for ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Sony just dropped a brand-new OLED TV, and the most surprising thing about it (other than its sudden, mid-year announcement) is its relatively low price.</p><p>For the first time, a Sony OLED TV is going toe to toe with more modestly priced OLEDs from Sony’s top rivals. The Bravia 6 is $1,999 for a 65-inch model, which puts it roughly in line with mid-range OLEDs from LG and Samsung.</p><p>That’s exciting news for anyone looking for more OLED-driven options in this price range, but I’m especially interested in the Bravia 6 for two reasons: its hardware and its picture processing.</p><div class="product"><a data-dimension112="6ff900ac-ac86-11f1-944f-f1e0f924b6c8" data-action="Deal Block" data-label="Bravia 6 4K OLED TV" data-dimension48="Bravia 6 4K OLED TV" data-dimension25="$1999" href="https://www.bestbuy.com/product/sony-65-class-bravia-6-oled-4k-hdr-smart-google-tv-with-gemini/J7XSRH5FG5" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><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="o2zzPr8hyKrVuVPesPs6t9" name="Sony-Bravia-6-OLED-TV-16-by-9-deal-block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/o2zzPr8hyKrVuVPesPs6t9-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/product/sony-65-class-bravia-6-oled-4k-hdr-smart-google-tv-with-gemini/J7XSRH5FG5" target="_blank" rel="nofollow" data-dimension112="6ff900ac-ac86-11f1-944f-f1e0f924b6c8" data-action="Deal Block" data-label="Bravia 6 4K OLED TV" data-dimension48="Bravia 6 4K OLED TV" data-dimension25="$1999">Bravia 6 4K OLED TV: $1999</a></strong><br>Sony's most affordable OLED TV of its 2026 Bravia lineup is the first to feature a full slate of four HDMI 2.1 inputs, all of which support 4K gaming at 120Hz. Sony's top-notch picture processing elevates the Bravia 6 above affordable OLEDs from rival brands.<a class="view-deal button" href="https://www.bestbuy.com/product/sony-65-class-bravia-6-oled-4k-hdr-smart-google-tv-with-gemini/J7XSRH5FG5" target="_blank" rel="nofollow" data-dimension112="6ff900ac-ac86-11f1-944f-f1e0f924b6c8" data-action="Deal Block" data-label="Bravia 6 4K OLED TV" data-dimension48="Bravia 6 4K OLED TV" data-dimension25="$1999">View Deal</a></p></div><h2 id="the-bravia-6-is-the-first-sony-oled-tv-with-four-hdmi-2-1-inputs">The Bravia 6 is the first Sony OLED TV with four HDMI 2.1 inputs</h2><p>Believe it or not, there aren’t very many Sony TVs with more than two HDMI 2.1 inputs. Despite the steep price tags associated with top-tier Sony sets, even the brand’s <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a> (like the recently released <a href="https://www.tomsguide.com/tvs/4k-tvs/sony-bravia-9-ii-true-rgb-tv-review">Bravia 9 II</a>) are mostly equipped with just a pair of high-bandwidth ports.</p><p>The Bravia 6 is different. It might not be as bright or as colorful as the <a href="https://www.tomsguide.com/tvs/oled-tvs/sony-bravia-8-ii-review">Sony Bravia 8 II OLED</a>, but the Bravia 6 offers more flexibility when it comes to current- and next-generation gaming. With four HDMI 2.1-compatible inputs, folks who upgrade to the Bravia 6 won’t have to think too hard about what devices are plugged into which input, as <em>all</em> of them support the same slate of features, such as 4K gaming at 120Hz.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="7n3NbVfxXMtxrmDNNbG6G3" name="LG-C6--12" alt="HDMI ports on a LG C6 OLED TV on a table" src="https://cdn.mos.cms.futurecdn.net/7n3NbVfxXMtxrmDNNbG6G3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>For years, LG and Samsung OLED TVs have offered a full slate of HDMI 2.1 inputs. This has been true across nearly all of these brands’ OLEDs — from entry-level models to flagship-level models.</p><p>As expected, the Bravia 6’s closest competitors — the <a href="https://www.tomsguide.com/tvs/oled-tvs/lg-c6-oled-review">LG C6</a> and <a href="https://www.tomsguide.com/tvs/oled-tvs/samsung-s90h-oled-tv-review">Samsung S90H</a> — both carry four HDMI 2.1 inputs. Had Sony’s latest OLED TV arrived with just two high-bandwidth ports, it would have stumbled out of the gate.</p><p>But perhaps the most enticing aspect of the Bravia 6 isn't the hardware on its outside, but rather, the software that makes it all possible.</p><h2 id="sony-39-s-picture-processing-is-among-the-best-in-the-game">Sony's picture processing is among the best in the game</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3008px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LpifwEvPHLE3gisyuowv4d" name="Setting 2 BRAVIA family-FNL" alt="The Sony 2025 lineup of TVs and soundbars" src="https://cdn.mos.cms.futurecdn.net/LpifwEvPHLE3gisyuowv4d-1920-80.jpg" mos="" align="middle" fullscreen="" width="3008" height="1692" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sony)</span></figcaption></figure><div><blockquote><p>Sony's attention to detail could be the ace up its sleeve.</p></blockquote></div><p>Until now, experiencing Sony's exceptional processing on an OLED TV typically meant spending more for the privilege — at least relative to competitive sets. The Bravia 6's aggressive pricing makes the brand's expert engineering a bit more accessible.</p><p>If you’re the type of viewer who values an accurate presentation above all else, it's tough not to respect Sony's commitment to the cause. Even at the lowest end of the Bravia TV lineup (the <a href="https://www.tomsguide.com/tvs/4k-tvs/sony-bravia-3-ii-review">Bravia 3 II</a>), Sony is dedicated to making the most of a TV’s hardware.</p><p>We're still in the process of evaluating the Bravia 6, and while we don't have test results ready to publish, it's quite possible that Sony's new OLED doesn't get quite as bright as mid-range models from LG and Samsung. But if the Bravia 6's picture processing is as good as we've seen on several Bravia TVs this year, Sony's attention to detail could be the ace up its sleeve.</p><h2 id="sony-bravia-6-outlook">Sony Bravia 6: 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:1367px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Kse7LEw8fXkEsjf2atrmBh" name="Bravia 6 OLED-3" alt="The Sony Bravia 6 OLED TV displaying abstract, colorful imagery from a wall-mounted position in a well-lit living room" src="https://cdn.mos.cms.futurecdn.net/Kse7LEw8fXkEsjf2atrmBh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1367" height="769" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sony)</span></figcaption></figure><p>As mentioned, we're still in the process of evaluating the Bravia 6 OLED. However, the TV's surprise announcement coincided with its debut on store shelves.</p><p>The 65-inch Bravia 6 is $1,999, but in the coming months, sale pricing could very well make the Bravia 6 a sleeper hit of the 2026 holiday-shopping season. Nevertheless, its current price makes it an intriguing alternative to the LG C6 and the Samsung S90H.</p><p>It's worth mentioning, too, that Sony recently emerged at the front of our assessment of the <a href="https://www.tomsguide.com/tvs/we-just-graded-every-tv-brand-on-price-performance-and-more-heres-how-their-report-cards-stack-up">best TV brands</a>. When we asked our readers to vote for the TV brand they trust the most, Sony ran away with those results, too.</p><p>Despite the tendency for Sony-branded TVs to carry higher price tags than rival sets, it seems that Sony has maintained a sterling reputation among A/V enthusiasts and casual viewers alike.</p><p>If the Bravia 6 can succeed <em>without</em> the high-price caveat, it could end up being one of the year's smartest buys for anyone in the market for a sensibly priced OLED TV.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePaJpW"></div>                            </div>                            <script src="https://kwizly.com/embed/ePaJpW.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/tvs/theres-no-way-around-it-sony-tvs-are-priced-higher-than-most-of-the-competition-heres-what-sonys-doing-right-what-its-doing-wrong-and-what-needs-to-change-in-2026">Sony TV report card 2026: Is the 'Sony tax' still worth paying?</a></li><li><a href="https://www.tomsguide.com/tvs/tcl-and-sony-are-joining-forces-to-sell-more-tvs-but-is-that-bad-news-for-shoppers">TCL and Sony are joining forces to sell more TVs — but is that bad news for shoppers?</a></li><li><a href="https://www.tomsguide.com/tvs/we-asked-readers-which-tv-brand-they-trusted-most-and-one-company-rose-above-the-rest">We asked readers which TV brand they trusted most — and one company rose above the rest</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tvs/oled-tvs/the-new-sony-bravia-6-oled-tv-is-the-lg-c6-competitor-ive-been-waiting-for</link>
                                                                            <description>
                            <![CDATA[ The all-new Bravia 6 is Sony's most affordable OLED TV, and it's sure to give the LG C6 and Samsung S90H a run for their money. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">FGpwuCrRBff6nSc78ZBKy3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/vMWyy9sNoYS5exE9n6LEu6-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 10 Sep 2026 09:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[OLED TVs]]></category>
                                                    <category><![CDATA[TVs]]></category>
                                                                                                <author><![CDATA[ michael.desjardin@futurenet.com (Michael Desjardin) ]]></author>                    <dc:creator><![CDATA[ Michael Desjardin ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/esytxRqW9GNVZNVCf7BFyV-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Michael Desjardin is a Senior Editor for TVs at Tom&#039;s Guide. He&#039;s been testing and tinkering with TVs professionally for over a decade, previously for Reviewed and USA Today. Michael studied media production and screenwriting at Emerson College. He loves cooking, zoning out to ambient music, and getting way too invested in the Red Sox. He considers himself living proof that TV doesn&#039;t necessarily rot your brain.&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/vMWyy9sNoYS5exE9n6LEu6-1920-80.jpg">
                                                            <media:credit><![CDATA[Sony]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Sony Bravia 6 OLED TV displaying colorful, abstract imagery from atop a credenza in a dimly lit living room]]></media:description>                                                            <media:text><![CDATA[The Sony Bravia 6 OLED TV displaying colorful, abstract imagery from atop a credenza in a dimly lit living room]]></media:text>
                                <media:title type="plain"><![CDATA[The Sony Bravia 6 OLED TV displaying colorful, abstract imagery from atop a credenza in a dimly lit living room]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/vMWyy9sNoYS5exE9n6LEu6-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Sony just dropped a brand-new OLED TV, and the most surprising thing about it (other than its sudden, mid-year announcement) is its relatively low price.</p><p>For the first time, a Sony OLED TV is going toe to toe with more modestly priced OLEDs from Sony’s top rivals. The Bravia 6 is $1,999 for a 65-inch model, which puts it roughly in line with mid-range OLEDs from LG and Samsung.</p><p>That’s exciting news for anyone looking for more OLED-driven options in this price range, but I’m especially interested in the Bravia 6 for two reasons: its hardware and its picture processing.</p><div class="product"><a data-dimension112="6ff900ac-ac86-11f1-944f-f1e0f924b6c8" data-action="Deal Block" data-label="Bravia 6 4K OLED TV" data-dimension48="Bravia 6 4K OLED TV" data-dimension25="$1999" href="https://www.bestbuy.com/product/sony-65-class-bravia-6-oled-4k-hdr-smart-google-tv-with-gemini/J7XSRH5FG5" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><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="o2zzPr8hyKrVuVPesPs6t9" name="Sony-Bravia-6-OLED-TV-16-by-9-deal-block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/o2zzPr8hyKrVuVPesPs6t9-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/product/sony-65-class-bravia-6-oled-4k-hdr-smart-google-tv-with-gemini/J7XSRH5FG5" target="_blank" rel="nofollow" data-dimension112="6ff900ac-ac86-11f1-944f-f1e0f924b6c8" data-action="Deal Block" data-label="Bravia 6 4K OLED TV" data-dimension48="Bravia 6 4K OLED TV" data-dimension25="$1999">Bravia 6 4K OLED TV: $1999</a></strong><br>Sony's most affordable OLED TV of its 2026 Bravia lineup is the first to feature a full slate of four HDMI 2.1 inputs, all of which support 4K gaming at 120Hz. Sony's top-notch picture processing elevates the Bravia 6 above affordable OLEDs from rival brands.<a class="view-deal button" href="https://www.bestbuy.com/product/sony-65-class-bravia-6-oled-4k-hdr-smart-google-tv-with-gemini/J7XSRH5FG5" target="_blank" rel="nofollow" data-dimension112="6ff900ac-ac86-11f1-944f-f1e0f924b6c8" data-action="Deal Block" data-label="Bravia 6 4K OLED TV" data-dimension48="Bravia 6 4K OLED TV" data-dimension25="$1999">View Deal</a></p></div><h2 id="the-bravia-6-is-the-first-sony-oled-tv-with-four-hdmi-2-1-inputs">The Bravia 6 is the first Sony OLED TV with four HDMI 2.1 inputs</h2><p>Believe it or not, there aren’t very many Sony TVs with more than two HDMI 2.1 inputs. Despite the steep price tags associated with top-tier Sony sets, even the brand’s <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a> (like the recently released <a href="https://www.tomsguide.com/tvs/4k-tvs/sony-bravia-9-ii-true-rgb-tv-review">Bravia 9 II</a>) are mostly equipped with just a pair of high-bandwidth ports.</p><p>The Bravia 6 is different. It might not be as bright or as colorful as the <a href="https://www.tomsguide.com/tvs/oled-tvs/sony-bravia-8-ii-review">Sony Bravia 8 II OLED</a>, but the Bravia 6 offers more flexibility when it comes to current- and next-generation gaming. With four HDMI 2.1-compatible inputs, folks who upgrade to the Bravia 6 won’t have to think too hard about what devices are plugged into which input, as <em>all</em> of them support the same slate of features, such as 4K gaming at 120Hz.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="7n3NbVfxXMtxrmDNNbG6G3" name="LG-C6--12" alt="HDMI ports on a LG C6 OLED TV on a table" src="https://cdn.mos.cms.futurecdn.net/7n3NbVfxXMtxrmDNNbG6G3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>For years, LG and Samsung OLED TVs have offered a full slate of HDMI 2.1 inputs. This has been true across nearly all of these brands’ OLEDs — from entry-level models to flagship-level models.</p><p>As expected, the Bravia 6’s closest competitors — the <a href="https://www.tomsguide.com/tvs/oled-tvs/lg-c6-oled-review">LG C6</a> and <a href="https://www.tomsguide.com/tvs/oled-tvs/samsung-s90h-oled-tv-review">Samsung S90H</a> — both carry four HDMI 2.1 inputs. Had Sony’s latest OLED TV arrived with just two high-bandwidth ports, it would have stumbled out of the gate.</p><p>But perhaps the most enticing aspect of the Bravia 6 isn't the hardware on its outside, but rather, the software that makes it all possible.</p><h2 id="sony-39-s-picture-processing-is-among-the-best-in-the-game">Sony's picture processing is among the best in the game</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3008px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LpifwEvPHLE3gisyuowv4d" name="Setting 2 BRAVIA family-FNL" alt="The Sony 2025 lineup of TVs and soundbars" src="https://cdn.mos.cms.futurecdn.net/LpifwEvPHLE3gisyuowv4d-1920-80.jpg" mos="" align="middle" fullscreen="" width="3008" height="1692" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sony)</span></figcaption></figure><div><blockquote><p>Sony's attention to detail could be the ace up its sleeve.</p></blockquote></div><p>Until now, experiencing Sony's exceptional processing on an OLED TV typically meant spending more for the privilege — at least relative to competitive sets. The Bravia 6's aggressive pricing makes the brand's expert engineering a bit more accessible.</p><p>If you’re the type of viewer who values an accurate presentation above all else, it's tough not to respect Sony's commitment to the cause. Even at the lowest end of the Bravia TV lineup (the <a href="https://www.tomsguide.com/tvs/4k-tvs/sony-bravia-3-ii-review">Bravia 3 II</a>), Sony is dedicated to making the most of a TV’s hardware.</p><p>We're still in the process of evaluating the Bravia 6, and while we don't have test results ready to publish, it's quite possible that Sony's new OLED doesn't get quite as bright as mid-range models from LG and Samsung. But if the Bravia 6's picture processing is as good as we've seen on several Bravia TVs this year, Sony's attention to detail could be the ace up its sleeve.</p><h2 id="sony-bravia-6-outlook">Sony Bravia 6: 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:1367px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Kse7LEw8fXkEsjf2atrmBh" name="Bravia 6 OLED-3" alt="The Sony Bravia 6 OLED TV displaying abstract, colorful imagery from a wall-mounted position in a well-lit living room" src="https://cdn.mos.cms.futurecdn.net/Kse7LEw8fXkEsjf2atrmBh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1367" height="769" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sony)</span></figcaption></figure><p>As mentioned, we're still in the process of evaluating the Bravia 6 OLED. However, the TV's surprise announcement coincided with its debut on store shelves.</p><p>The 65-inch Bravia 6 is $1,999, but in the coming months, sale pricing could very well make the Bravia 6 a sleeper hit of the 2026 holiday-shopping season. Nevertheless, its current price makes it an intriguing alternative to the LG C6 and the Samsung S90H.</p><p>It's worth mentioning, too, that Sony recently emerged at the front of our assessment of the <a href="https://www.tomsguide.com/tvs/we-just-graded-every-tv-brand-on-price-performance-and-more-heres-how-their-report-cards-stack-up">best TV brands</a>. When we asked our readers to vote for the TV brand they trust the most, Sony ran away with those results, too.</p><p>Despite the tendency for Sony-branded TVs to carry higher price tags than rival sets, it seems that Sony has maintained a sterling reputation among A/V enthusiasts and casual viewers alike.</p><p>If the Bravia 6 can succeed <em>without</em> the high-price caveat, it could end up being one of the year's smartest buys for anyone in the market for a sensibly priced OLED TV.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePaJpW"></div>                            </div>                            <script src="https://kwizly.com/embed/ePaJpW.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/tvs/theres-no-way-around-it-sony-tvs-are-priced-higher-than-most-of-the-competition-heres-what-sonys-doing-right-what-its-doing-wrong-and-what-needs-to-change-in-2026">Sony TV report card 2026: Is the 'Sony tax' still worth paying?</a></li><li><a href="https://www.tomsguide.com/tvs/tcl-and-sony-are-joining-forces-to-sell-more-tvs-but-is-that-bad-news-for-shoppers">TCL and Sony are joining forces to sell more TVs — but is that bad news for shoppers?</a></li><li><a href="https://www.tomsguide.com/tvs/we-asked-readers-which-tv-brand-they-trusted-most-and-one-company-rose-above-the-rest">We asked readers which TV brand they trusted most — and one company rose above the rest</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ TCL is suing Samsung for false advertising on its Mini-LED TVs — here’s how to tell if your TV is included ]]></title>
                                                                                                <dc:content><![CDATA[ <p>What makes a Mini-LED TV a Mini-LED TV? That’s the question at the heart of a recent lawsuit against Samsung, in which TCL alleges that two of Samsung’s Mini-LED TVs don’t actually use Mini-LED technology at all.</p><p>The complaint, filed Monday by Los Angeles law firm <a href="https://www.larsonllp.com/tcl-north-america-false-advertising-lawsuit-samsung/" target="_blank" rel="nofollow">Larson LLP</a>, states that “[Samsung] took a cheap, non-Mini LED model from a recycled product line and peddled it to the public as a ‘supreme’ Mini LED model at an attractive price point.” </p><p>Obviously, nobody wants to learn that the TV they thought they were buying isn't as advertised. But is there any truth to the claims laid out in TCL’s lawsuit? To better understand the situation, let’s start with which models are being called into question.</p><h2 id="samsung-s-m-series-tvs-and-supreme-mini-led-dimming">Samsung’s M Series TVs and “Supreme Mini LED Dimming”</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1359px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="daJEPnvBBgcPtcoJ94mHxL" name="Samsung-M80H-Mini-LED-TV-Lifestyle" alt="The Samsung M80H Mini-LED TV displaying an AI-generated still of a soccer match from atop a credenza in a modern living room" src="https://cdn.mos.cms.futurecdn.net/daJEPnvBBgcPtcoJ94mHxL-1920-80.jpg" mos="" align="middle" fullscreen="" width="1359" height="764" 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><strong>The claim centers around Samsung’s 2026 M Series lineup, including the M70H, M80H and M90H TVs</strong>. In the complaint, TCL alleges that these models, specifically, “contain none of the technological advancements associated with Mini LED technology, including FALD [full-array local dimming].”</p><p>Instead, TCL says, “Samsung merely recycled its pre-existing low-end standard LED televisions, the Crystal UHD line, and re-labelled them as ‘Mini LED.’” The complaint cites a page on <a href="https://www.samsung.com/us/tvs/tv-buying-guide/mini-led-vs-qled/">Samsung’s website</a> that describes Mini-LED technology as involving both “backlight control” and “local dimming” — two features that, according to TCL, aren’t accounted for across Samsung’s M Series lineup.</p><div><blockquote><p>The claim includes the M70H, M80H and M90H TVs.</p></blockquote></div><p>In other words, TCL alleges Samsung’s edge-lit, Mini-LED-based TVs as not meeting Samsung’s own criteria for what makes Mini-LED technology worth buying over a standard QLED TV.</p><p>A spokesperson from Samsung stated that the brand intends to “vigorously defend against” the lawsuit, and that Samsung “stand[s] behind the quality and accuracy of our product descriptions.”</p><p>Samsung’s M Series lineup sits below the brand’s Neo QLED family of TVs, the latter of which has historically combined <em>both</em> Mini-LED backlighting and quantum-dot color — hence its higher-end status.</p><p>Curiously, when I compared Samsung’s official spec sheets for the M70H (the entry model in the M Series) and the QN70H (the brand’s entry-level Neo QLED TV), I noticed that the “Lighting Technology” labels differ, but their respective “Dimming Technology” classifications are the same.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1164px;"><p class="vanilla-image-block" style="padding-top:71.74%;"><img id="cYam6L5frJ8KZwi4hJxGzj" name="Samsung-M70H-Mini-LED-TV-DISCLAIMER_TG" alt="A side-by-side comparison of spec sheets for the M70H Mini-LED TV and the QN70H Neo QLED TV" src="https://cdn.mos.cms.futurecdn.net/cYam6L5frJ8KZwi4hJxGzj-1920-80.jpg" mos="" align="middle" fullscreen="" width="1164" height="835" 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>You’ll notice, however, that the M70H’s “Supreme Mini LED Dimming” designation is joined by a footnote indicator. And, if you follow that footnote, you’ll find a disclaimer stating that the M70H’s “Supreme Mini LED Dimming” is “[s]oftware-based (not full-array hardware-based) technology.”</p><p>What we’re left with, then, are two TVs — currently separated by about $500 at the 65-inch size point — that are stated by Samsung to use the same dimming technology. However, on only <em>one </em>of these models is this technology described as being software-based rather than hardware-based.</p><p>This is called out directly in TCL’s complaint. It states:</p><p><em>"Samsung’s specification sheets identify the dimming feature available on its Mini LED televisions as 'Supreme Mini LED Dimming,' which, when coupled with its descriptions of Mini LED local dimming on its website, is purposefully designed to suggest dimming that is a better version of typical Mini LED FALD than that of its competitors such as TCL. This is reinforced by the fact that Samsung uses the same terminology— 'Supreme Mini LED Dimming'—to describe its high-end Neo QLED televisions."</em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X11qMX"></div>                            </div>                            <script src="https://kwizly.com/embed/X11qMX.js" async></script><p>It's worth noting that this wouldn't be the first time Samsung released a TV with edge-based lighting under the designation of "Mini-LED TV." One of the brand's latest lifestyle TVs — The Frame Pro — is billed as a Mini-LED-based set with some type of dimming, despite the fact that these LEDs are not arranged in a traditional, backlit array.</p><p>This raises an important question: Are edge-lit Mini-LED TVs — the sort that the M70H and M80H are alleged to be — <em>truly </em>a downgrade compared to Mini-LED models with proper local dimming?</p><h2 id="can-quot-software-based-dimming-quot-be-a-stand-in-for-fald">Can "software-based dimming" be a stand-in for FALD?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:62.53%;"><img id="PVJDp3xAnHpTYCqfuXpEUN" name="MicroLED_shutterstock_COV.jpg" alt="Micro-LED vs. OLED" src="https://cdn.mos.cms.futurecdn.net/PVJDp3xAnHpTYCqfuXpEUN-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="938" 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>TCL claims that the inclusion of "Supreme Mini LED Dimming" on the lower-end M70H misleads people into thinking that the M70H features the same dimming technology as the higher-end Neo QLED, or that the version of Mini-LED dimming found on the M70H is somehow superior to full-array, hardware-based dimming on TCL TVs.</p><p>Should this move to a trial, that'll be up for a court to decide how much water those claims hold. </p><p>For me, the more interesting question is: Are the higher-end QN70H <em>also</em> leveraging edge-lit Mini-LEDs driven by software-based dimming? After all, their spec sheets list identical dimming technologies.</p><p>Back in May, when I was evaluating the QN70H, I reached out to Samsung with this exact question, and a spokesperson from Samsung responded with the following: <em>"Samsung can confirm that both the QN70H and M70H support software-based Supreme Mini LED Dimming."</em></p><div><blockquote><p>Samsung can confirm that both the QN70H and M70H support software-based Supreme Mini LED Dimming.</p><p>Samsung Representative</p></blockquote></div><p>While one can certainly make the argument that traditional, hardware-based dimming is driven in part by software, this could be the first time a TV-maker has used the term "software-based dimming" as a means to describe a TV with full-array local dimming.</p><p>We'll be following this story closely as it evolves, but let us know in the comments below if you purchased one of the aforementioned TVs and if you've seen any issues with its contrast.</p><p><em>In reporting this story, Tom's Guide reached out to Samsung to clarify TCL's claims and a spokesperson said that the brand will “vigorously defend against” the lawsuit, and that Samsung “stand[s] behind the quality and accuracy of our product descriptions.”</em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePaJpW"></div>                            </div>                            <script src="https://kwizly.com/embed/ePaJpW.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/tvs/we-just-graded-every-tv-brand-on-price-performance-and-more-heres-how-their-report-cards-stack-up">Best TV Brands 2026: We just graded them on price, performance and more — here’s how their report cards stack up</a></li><li><a href="https://www.tomsguide.com/tvs/roku-and-tcl-accused-of-bricking-tvs-with-poor-software-updates-in-new-class-action-lawsuit">Roku and TCL accused of 'bricking' TVs with poor software updates in new class action lawsuit</a></li><li><a href="https://www.tomsguide.com/tvs/samsung-tv-report-card-2026-you-can-rely-on-samsung-to-deliver-exceptional-performance">Samsung TV report card 2026: 'You can rely on Samsung to deliver exceptional performance'</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tvs/tcl-is-suing-samsung-for-false-advertising-on-its-mini-led-tvs-heres-how-to-tell-if-your-tv-is-included</link>
                                                                            <description>
                            <![CDATA[ A recent lawsuit from TCL alleges that several Samsung M Series Mini-LED TVs aren't Mini-LED TVs at all. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Nzw9ujCdQXwCtFFRtJtQVH</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/57dGgxoSzPWuGByhKA7bJS-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 04 Sep 2026 08:00:00 +0000</pubDate>                                                                                                                                <updated>Fri, 04 Sep 2026 08:43:08 +0000</updated>
                                                                                                                                            <category><![CDATA[TVs]]></category>
                                                                                                <author><![CDATA[ michael.desjardin@futurenet.com (Michael Desjardin) ]]></author>                    <dc:creator><![CDATA[ Michael Desjardin ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/esytxRqW9GNVZNVCf7BFyV-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Michael Desjardin is a Senior Editor for TVs at Tom&#039;s Guide. He&#039;s been testing and tinkering with TVs professionally for over a decade, previously for Reviewed and USA Today. Michael studied media production and screenwriting at Emerson College. He loves cooking, zoning out to ambient music, and getting way too invested in the Red Sox. He considers himself living proof that TV doesn&#039;t necessarily rot your brain.&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/57dGgxoSzPWuGByhKA7bJS-1920-80.jpg">
                                                            <media:credit><![CDATA[Samsung]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Samsung M70H Mini-LED TV displaying colorful, abstract imagery from a wall-mounted position in a contemporary, well-lit living room]]></media:description>                                                            <media:text><![CDATA[The Samsung M70H Mini-LED TV displaying colorful, abstract imagery from a wall-mounted position in a contemporary, well-lit living room]]></media:text>
                                <media:title type="plain"><![CDATA[The Samsung M70H Mini-LED TV displaying colorful, abstract imagery from a wall-mounted position in a contemporary, well-lit living room]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/57dGgxoSzPWuGByhKA7bJS-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>What makes a Mini-LED TV a Mini-LED TV? That’s the question at the heart of a recent lawsuit against Samsung, in which TCL alleges that two of Samsung’s Mini-LED TVs don’t actually use Mini-LED technology at all.</p><p>The complaint, filed Monday by Los Angeles law firm <a href="https://www.larsonllp.com/tcl-north-america-false-advertising-lawsuit-samsung/" target="_blank" rel="nofollow">Larson LLP</a>, states that “[Samsung] took a cheap, non-Mini LED model from a recycled product line and peddled it to the public as a ‘supreme’ Mini LED model at an attractive price point.” </p><p>Obviously, nobody wants to learn that the TV they thought they were buying isn't as advertised. But is there any truth to the claims laid out in TCL’s lawsuit? To better understand the situation, let’s start with which models are being called into question.</p><h2 id="samsung-s-m-series-tvs-and-supreme-mini-led-dimming">Samsung’s M Series TVs and “Supreme Mini LED Dimming”</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1359px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="daJEPnvBBgcPtcoJ94mHxL" name="Samsung-M80H-Mini-LED-TV-Lifestyle" alt="The Samsung M80H Mini-LED TV displaying an AI-generated still of a soccer match from atop a credenza in a modern living room" src="https://cdn.mos.cms.futurecdn.net/daJEPnvBBgcPtcoJ94mHxL-1920-80.jpg" mos="" align="middle" fullscreen="" width="1359" height="764" 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><strong>The claim centers around Samsung’s 2026 M Series lineup, including the M70H, M80H and M90H TVs</strong>. In the complaint, TCL alleges that these models, specifically, “contain none of the technological advancements associated with Mini LED technology, including FALD [full-array local dimming].”</p><p>Instead, TCL says, “Samsung merely recycled its pre-existing low-end standard LED televisions, the Crystal UHD line, and re-labelled them as ‘Mini LED.’” The complaint cites a page on <a href="https://www.samsung.com/us/tvs/tv-buying-guide/mini-led-vs-qled/">Samsung’s website</a> that describes Mini-LED technology as involving both “backlight control” and “local dimming” — two features that, according to TCL, aren’t accounted for across Samsung’s M Series lineup.</p><div><blockquote><p>The claim includes the M70H, M80H and M90H TVs.</p></blockquote></div><p>In other words, TCL alleges Samsung’s edge-lit, Mini-LED-based TVs as not meeting Samsung’s own criteria for what makes Mini-LED technology worth buying over a standard QLED TV.</p><p>A spokesperson from Samsung stated that the brand intends to “vigorously defend against” the lawsuit, and that Samsung “stand[s] behind the quality and accuracy of our product descriptions.”</p><p>Samsung’s M Series lineup sits below the brand’s Neo QLED family of TVs, the latter of which has historically combined <em>both</em> Mini-LED backlighting and quantum-dot color — hence its higher-end status.</p><p>Curiously, when I compared Samsung’s official spec sheets for the M70H (the entry model in the M Series) and the QN70H (the brand’s entry-level Neo QLED TV), I noticed that the “Lighting Technology” labels differ, but their respective “Dimming Technology” classifications are the same.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1164px;"><p class="vanilla-image-block" style="padding-top:71.74%;"><img id="cYam6L5frJ8KZwi4hJxGzj" name="Samsung-M70H-Mini-LED-TV-DISCLAIMER_TG" alt="A side-by-side comparison of spec sheets for the M70H Mini-LED TV and the QN70H Neo QLED TV" src="https://cdn.mos.cms.futurecdn.net/cYam6L5frJ8KZwi4hJxGzj-1920-80.jpg" mos="" align="middle" fullscreen="" width="1164" height="835" 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>You’ll notice, however, that the M70H’s “Supreme Mini LED Dimming” designation is joined by a footnote indicator. And, if you follow that footnote, you’ll find a disclaimer stating that the M70H’s “Supreme Mini LED Dimming” is “[s]oftware-based (not full-array hardware-based) technology.”</p><p>What we’re left with, then, are two TVs — currently separated by about $500 at the 65-inch size point — that are stated by Samsung to use the same dimming technology. However, on only <em>one </em>of these models is this technology described as being software-based rather than hardware-based.</p><p>This is called out directly in TCL’s complaint. It states:</p><p><em>"Samsung’s specification sheets identify the dimming feature available on its Mini LED televisions as 'Supreme Mini LED Dimming,' which, when coupled with its descriptions of Mini LED local dimming on its website, is purposefully designed to suggest dimming that is a better version of typical Mini LED FALD than that of its competitors such as TCL. This is reinforced by the fact that Samsung uses the same terminology— 'Supreme Mini LED Dimming'—to describe its high-end Neo QLED televisions."</em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X11qMX"></div>                            </div>                            <script src="https://kwizly.com/embed/X11qMX.js" async></script><p>It's worth noting that this wouldn't be the first time Samsung released a TV with edge-based lighting under the designation of "Mini-LED TV." One of the brand's latest lifestyle TVs — The Frame Pro — is billed as a Mini-LED-based set with some type of dimming, despite the fact that these LEDs are not arranged in a traditional, backlit array.</p><p>This raises an important question: Are edge-lit Mini-LED TVs — the sort that the M70H and M80H are alleged to be — <em>truly </em>a downgrade compared to Mini-LED models with proper local dimming?</p><h2 id="can-quot-software-based-dimming-quot-be-a-stand-in-for-fald">Can "software-based dimming" be a stand-in for FALD?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:62.53%;"><img id="PVJDp3xAnHpTYCqfuXpEUN" name="MicroLED_shutterstock_COV.jpg" alt="Micro-LED vs. OLED" src="https://cdn.mos.cms.futurecdn.net/PVJDp3xAnHpTYCqfuXpEUN-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="938" 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>TCL claims that the inclusion of "Supreme Mini LED Dimming" on the lower-end M70H misleads people into thinking that the M70H features the same dimming technology as the higher-end Neo QLED, or that the version of Mini-LED dimming found on the M70H is somehow superior to full-array, hardware-based dimming on TCL TVs.</p><p>Should this move to a trial, that'll be up for a court to decide how much water those claims hold. </p><p>For me, the more interesting question is: Are the higher-end QN70H <em>also</em> leveraging edge-lit Mini-LEDs driven by software-based dimming? After all, their spec sheets list identical dimming technologies.</p><p>Back in May, when I was evaluating the QN70H, I reached out to Samsung with this exact question, and a spokesperson from Samsung responded with the following: <em>"Samsung can confirm that both the QN70H and M70H support software-based Supreme Mini LED Dimming."</em></p><div><blockquote><p>Samsung can confirm that both the QN70H and M70H support software-based Supreme Mini LED Dimming.</p><p>Samsung Representative</p></blockquote></div><p>While one can certainly make the argument that traditional, hardware-based dimming is driven in part by software, this could be the first time a TV-maker has used the term "software-based dimming" as a means to describe a TV with full-array local dimming.</p><p>We'll be following this story closely as it evolves, but let us know in the comments below if you purchased one of the aforementioned TVs and if you've seen any issues with its contrast.</p><p><em>In reporting this story, Tom's Guide reached out to Samsung to clarify TCL's claims and a spokesperson said that the brand will “vigorously defend against” the lawsuit, and that Samsung “stand[s] behind the quality and accuracy of our product descriptions.”</em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePaJpW"></div>                            </div>                            <script src="https://kwizly.com/embed/ePaJpW.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/tvs/we-just-graded-every-tv-brand-on-price-performance-and-more-heres-how-their-report-cards-stack-up">Best TV Brands 2026: We just graded them on price, performance and more — here’s how their report cards stack up</a></li><li><a href="https://www.tomsguide.com/tvs/roku-and-tcl-accused-of-bricking-tvs-with-poor-software-updates-in-new-class-action-lawsuit">Roku and TCL accused of 'bricking' TVs with poor software updates in new class action lawsuit</a></li><li><a href="https://www.tomsguide.com/tvs/samsung-tv-report-card-2026-you-can-rely-on-samsung-to-deliver-exceptional-performance">Samsung TV report card 2026: 'You can rely on Samsung to deliver exceptional performance'</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[ iPhone 18 Pro Max vs. Samsung Galaxy S26 Ultra — Here's how Apple's and Samsung's flagships could compare ]]></title>
                                                                                                <dc:content><![CDATA[ <p>September is just around the corner, and that can only mean one thing: It’s time for Apple to reveal its latest iPhones.</p><p>For the past seven years, the Pro Max has been Apple’s most expensive (and arguably desirable) model, but in 2026 we’re expecting the company’s first foldable to eclipse it in terms of media coverage.</p><p>You can see how the <a href="https://www.tomsguide.com/phones/samsung-phones/3-big-ways-the-iphone-ultra-could-beat-the-galaxy-z-fold-8">iPhone Ultra is lining up against the Samsung Galaxy Z Fold 8 in the battle of the foldables here</a>, but what about the non-folding flagships? Both remain big hitters, so here’s how the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">iPhone 18 Pro Max</a> is set to stack up against the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung Galaxy S26 Ultra</a> as we approach Apple’s September launch date.</p><h2 id="iphone-18-pro-max-vs-samsung-galaxy-s26-ultra-specifications">iPhone 18 Pro Max vs. Samsung Galaxy S26 Ultra: Specifications</h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>iPhone 18 Pro Max (rumored)</strong></p></td><td  ><p><strong>Samsung Galaxy S26 Ultra</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Display size</strong></p></td><td  ><p>6.9 inches</p></td><td  ><p>6.9 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>1-120Hz ProMotion</p></td><td  ><p>1-120Hz adaptive </p></td></tr><tr><td class="firstcol " ><p><strong>CPU</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>Memory</strong></p></td><td  ><p>12GB</p></td><td  ><p>12GB / 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>Cameras</strong></p></td><td  ><p>48MP main with variable aperture, 48MP ultrawide, 48MP telephoto (4x)</p></td><td  ><p>200MP main, 50MP ultrawide, 10MP telephoto (3x), 50MP telephoto (5x)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery Size</strong></p></td><td  ><p>5,567 mAh (eSim) / 5,491 mAh (SIM tray)</p></td><td  ><p>5,000 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p>$1,299</p></td><td  ><p>$1,299</p></td></tr></tbody></table></div><h2 id="iphone-18-pro-max-vs-samsung-galaxy-s26-ultra-release-date-and-price">iPhone 18 Pro Max vs. Samsung Galaxy S26 Ultra: Release date and 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:4982px;"><p class="vanilla-image-block" style="padding-top:42.85%;"><img id="atg4cwWLDkkZyksuPLdtTJ" name="Galaxy-S26-Ultra-HERO2" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/atg4cwWLDkkZyksuPLdtTJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="4982" height="2135" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>For over a decade, Apple has released almost every new numbered iPhone in September (with the exception of the <a href="https://www.tomsguide.com/reviews/iphone-12">iPhone 12</a> because of the coronavirus pandemic), and 2026 will be no different.</p><p>Scratch that, it will be <em>slightly </em>different. While the company has announced its <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-18-event-all-the-new-products-expected-to-launch-in-september">“surprise and shine” event for Wednesday September 9</a>, where it’s set to reveal the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-rumors-everything-we-know-so-far">iPhone 18 Pro</a> family, as well as the new foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra</a>, the regular <a href="https://www.tomsguide.com/phones/iphones/iphone-18-rumors-everything-we-know-so-far">iPhone 18</a> has <a href="https://www.tomsguide.com/phones/iphones/iphone-18-release-schedule-could-be-changing-but-this-rumor-makes-no-sense">reportedly been pushed back to 2027</a>. </p><p>The iPhone 18 Pro Max <em>will</em> be there, however, but the bad news is that it’s facing a price hike. The mild good news is that it’s <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-and-iphone-18-pro-max-price-rumors-heres-how-much-more-you-could-pay-this-year">now expected to be $100</a>, given we were potentially <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-could-see-absolutely-massive-price-hike-according-to-researchers">bracing for more than double that at one point</a>. </p><p>Going by Apple’s previous pricing, that would see the 256GB model starting at $1,299, rising to $1,499 for the 512GB model, $1,699 for 1TB and $2,099 for 2TB.</p><p>That’s actually pretty similar to Samsung’s Galaxy S26 Ultra — or at least its MSRP when it was new in March 2026. It cost $1,299 for the 256GB model, $1,449 for 512GB and $1,799 for 1TB.</p><h2 id="iphone-18-pro-max-vs-samsung-galaxy-s26-ultra-design-and-screens">iPhone 18 Pro Max vs. Samsung Galaxy S26 Ultra: Design and screens</h2><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:55.78%;"><img id="WNJZg5wpSg4yem6kzvAjLN" name="iPhone 18 Pro and Max LIST Large" alt="iPhone 18 Pro vs iPhone 18 Pro Max." src="https://cdn.mos.cms.futurecdn.net/WNJZg5wpSg4yem6kzvAjLN-1920-80.jpg" mos="" align="middle" fullscreen="" width="1280" height="714" 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>Given the <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-pro-review">iPhone 17 Pro</a> series introduced a couple of new design tweaks — the raised camera section and the two-tone colorways — we’re not expecting major changes this time. At a glance, the iPhone 18 Pro Max may be barely distinguishable from the <a href="http://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a>, right down to the 6.9-inch OLED display.</p><p>There will reportedly be a couple of minor changes, mind. To make space for a larger capacity battery, it will apparently be about 0.25mm thicker and seven grams heavier. The Dynamic Island will apparently also be around 35% smaller.</p><p>It would be a big surprise if the screen specs were any different, given the 6.9-inch size. So we’re likely looking at a resolution of 2,868 x 1,320, or around 460 pixels per inch (ppi). ProMotion will offer adaptive refresh rates of up to 120Hz.</p><p>We know the exact screen specifications of the Samsung Galaxy S26 Ultra and they’re pretty similar. It also has a 6.9-inch OLED panel, capable of 120Hz, though the top resolution is higher at 3,120 x 1,440 meaning a sharpness of 505ppi (though it defaults to a lower 2,340 x 1,080 resolution to save battery). </p><p>This year, Samsung introduced a new feature called <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>. When enabled, this prevents others from seeing what’s on your phone screen by switching to dedicated narrow pixels that can only be seen head on. This can be automatically enabled on a per-app basis, so you can have it magically enable itself for your banking apps, but not for YouTube, say.</p><p>That innovation aside, there’s little difference between this and the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-ultra-review">Samsung Galaxy S25 Ultra</a> — both in terms of screen technology and looks. Though that design does allow for a built-in S Pen for note taking and doodling — a real advantage over the iPhone 18 Pro Max.</p><h2 id="iphone-18-pro-max-vs-samsung-galaxy-s26-ultra-performance">iPhone 18 Pro Max vs. Samsung Galaxy S26 Ultra: 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: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="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Let’s start with the one we have already benchmarked. Powered by the Qualcomm Snapdragon 8 Elite Gen 5 for Galaxy and backed by either 12 or 16GB RAM depending on the model, the Samsung Galaxy S26 Ultra is a truly impressive performer. It even has a vapor chamber for heat dissipation, which keeps it running cool even when running graphically demanding content.</p><p>Here’s how it benchmarked compared to the iPhone 17 Pro Max:</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench</strong></p></td><td  ><p><strong>3DMark Solar Bay Unlimited</strong></p></td><td  ><p><strong>Geekbench AI 1.5</strong></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 Core ML/Neural Engine)</p></td></tr></tbody></table></div><p>A modest lead on multi-core and gaming benchmarks, but a huge one when it comes to AI performance.</p><p>But, of course, this is against last year’s iPhone and its A19 chipset. It stands to reason that Apple will at least close the gap and more than likely go further, especially as the A20 Pro is <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-tipped-for-a20-pro-chip-apples-first-2nm-processor-to-power-new-foldable-phone">rumored to be built using the 2nm manufacturing process</a>, meaning a step change in terms of performance. We’re reportedly looking at 18% speed boost and 30% better power efficiency, which would see it blow past the S26 Ultra (though with the Galaxy S27 Ultra likely to regain the throne in early 2027). </p><p>On the subject of efficiency, Apple is set to gain another big advantage over Samsung with the iPhone 18 Pro Max: stamina. While the iPhone 17 Pro Max lasted an impressive 17 hours and 54 minutes in our tests, the next generation is likely to last even longer. That’s not just thanks to the 2nm chip’s efficiency savings, but because Apple is reportedly including a larger battery. This will reportedly be 5,391 mAh for models with a SIM tray, and 5,567mAh for those without  — a big step up from the 4,823 mAh/ 5,088 mAh cells found in the 17 Pro Max.</p><p>By contrast, the Galaxy S26 Ultra packs a 5,000 mAh battery. It lasted a respectable 16 hours and ten minutes in our review test. </p><h2 id="iphone-18-pro-max-vs-samsung-galaxy-s26-ultra-cameras">iPhone 18 Pro Max vs. Samsung Galaxy S26 Ultra: 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WeRkpqbqkJavKd4hmEBzgh" name="iPhone 18 Pro vs iPhone 17 Pro" alt="iPhone 18 Pro vs iPhone 17 Pro" src="https://cdn.mos.cms.futurecdn.net/WeRkpqbqkJavKd4hmEBzgh-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 Samsung Galaxy S26 Ultra currently tops our list of the <a href="https://www.tomsguide.com/us/best-phone-cameras,review-2272.html">best camera phones</a>. A big step up from the previous generation, the 200MP main camera and 50MP 5x telephoto lens have wider apertures, allowing for 47% and 37% brighter images respectively.</p><p>Add in a supplemental 10MP 3x telephoto lens and a 50MP ultra wide camera, and you’ve got an incredibly flexible camera setup that takes great shots whatever the environment. At the time of writing, it can’t be beat.</p><p>On raw specs alone, it doesn’t look like the iPhone 18 Pro Max will be challenging for the title, given leakers point to the same trio of 48MP lenses (regular, ultra wide and 4x optical zoom) again.</p><p>But the iPhone 18 Pro Max does reportedly have an ace up its sleeve: <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-could-be-the-first-iphone-to-get-a-variable-aperture-why-that-matters">variable aperture</a>. This lets you adjust the amount of light entering the lens, rather than having to rigidly stick to presets decided by Apple. While this is a feature that will only appeal to experienced photographers, in the right hands, it could make a huge difference to photographic composition.</p><h2 id="iphone-18-pro-max-vs-samsung-galaxy-s26-ultra-outlook">iPhone 18 Pro Max vs. Samsung Galaxy S26 Ultra: 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="UfraPifaz2CpXLbJKJYqDY" name="S Pen S26 Ultra" alt="Samsung Galaxy S26 Ultra S Pen" src="https://cdn.mos.cms.futurecdn.net/UfraPifaz2CpXLbJKJYqDY-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 Samsung Galaxy S26 Ultra is the <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">best Android phone</a> you can buy right now. It will probably remain so until the Galaxy S27 Ultra replaces it in early 2027.</p><p>But if you’re open to iOS, then it looks like the iPhone 18 Pro Max will eclipse it in a few key ways. It’s set to be faster, last longer, and while the camera specs will likely be weaker, keen photographers will have a lot of fun with the variable rate aperture.</p><p>Of course, the Samsung Galaxy S26 Ultra has a few key advantages, and not just in its overall camera layout. Privacy Display is a marvelous innovation beautifully implemented, the S Pen is really handy, and as it's been out for nearly six months, it can be had for less than its high $1,299 asking price.</p><p>It’s worth considering, however, that we only have iPhone 18 Pro Max rumors and leaks to go on at the moment. While they’ve been pretty reliable in the past, we won’t know for sure what Apple has up its sleeve until <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-18-event-all-the-new-products-expected-to-launch-in-september">September 9th’s iPhone 18 event</a>. </p><div data-widget-type="merchantlink" data-model-name="Samsung Galaxy S26 Ultra"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphone-18-pro-max-vs-samsung-galaxy-s26-ultra-heres-how-apples-and-samsungs-flagships-could-compare</link>
                                                                            <description>
                            <![CDATA[ Which big-screen smartphone should you buy? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">PaYSr3WHfuFuVT64zXVYLW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Gv7fyY2QJ4jPcPsj7so3fX-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 30 Aug 2026 05:45:00 +0000</pubDate>                                                                                                                                <updated>Sun, 30 Aug 2026 12:30:41 +0000</updated>
                                                                                                                                            <category><![CDATA[Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alan Martin ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xMmhmPSssqZHHFWveDgSs7-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Gv7fyY2QJ4jPcPsj7so3fX-1920-80.jpg">
                                                            <media:credit><![CDATA[Macworld/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 18 Pro Max render]]></media:description>                                                            <media:text><![CDATA[iPhone 18 Pro Max render]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 18 Pro Max render]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Gv7fyY2QJ4jPcPsj7so3fX-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>September is just around the corner, and that can only mean one thing: It’s time for Apple to reveal its latest iPhones.</p><p>For the past seven years, the Pro Max has been Apple’s most expensive (and arguably desirable) model, but in 2026 we’re expecting the company’s first foldable to eclipse it in terms of media coverage.</p><p>You can see how the <a href="https://www.tomsguide.com/phones/samsung-phones/3-big-ways-the-iphone-ultra-could-beat-the-galaxy-z-fold-8">iPhone Ultra is lining up against the Samsung Galaxy Z Fold 8 in the battle of the foldables here</a>, but what about the non-folding flagships? Both remain big hitters, so here’s how the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">iPhone 18 Pro Max</a> is set to stack up against the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung Galaxy S26 Ultra</a> as we approach Apple’s September launch date.</p><h2 id="iphone-18-pro-max-vs-samsung-galaxy-s26-ultra-specifications">iPhone 18 Pro Max vs. Samsung Galaxy S26 Ultra: Specifications</h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>iPhone 18 Pro Max (rumored)</strong></p></td><td  ><p><strong>Samsung Galaxy S26 Ultra</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Display size</strong></p></td><td  ><p>6.9 inches</p></td><td  ><p>6.9 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>1-120Hz ProMotion</p></td><td  ><p>1-120Hz adaptive </p></td></tr><tr><td class="firstcol " ><p><strong>CPU</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>Memory</strong></p></td><td  ><p>12GB</p></td><td  ><p>12GB / 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>Cameras</strong></p></td><td  ><p>48MP main with variable aperture, 48MP ultrawide, 48MP telephoto (4x)</p></td><td  ><p>200MP main, 50MP ultrawide, 10MP telephoto (3x), 50MP telephoto (5x)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery Size</strong></p></td><td  ><p>5,567 mAh (eSim) / 5,491 mAh (SIM tray)</p></td><td  ><p>5,000 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p>$1,299</p></td><td  ><p>$1,299</p></td></tr></tbody></table></div><h2 id="iphone-18-pro-max-vs-samsung-galaxy-s26-ultra-release-date-and-price">iPhone 18 Pro Max vs. Samsung Galaxy S26 Ultra: Release date and 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:4982px;"><p class="vanilla-image-block" style="padding-top:42.85%;"><img id="atg4cwWLDkkZyksuPLdtTJ" name="Galaxy-S26-Ultra-HERO2" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/atg4cwWLDkkZyksuPLdtTJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="4982" height="2135" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>For over a decade, Apple has released almost every new numbered iPhone in September (with the exception of the <a href="https://www.tomsguide.com/reviews/iphone-12">iPhone 12</a> because of the coronavirus pandemic), and 2026 will be no different.</p><p>Scratch that, it will be <em>slightly </em>different. While the company has announced its <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-18-event-all-the-new-products-expected-to-launch-in-september">“surprise and shine” event for Wednesday September 9</a>, where it’s set to reveal the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-rumors-everything-we-know-so-far">iPhone 18 Pro</a> family, as well as the new foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra</a>, the regular <a href="https://www.tomsguide.com/phones/iphones/iphone-18-rumors-everything-we-know-so-far">iPhone 18</a> has <a href="https://www.tomsguide.com/phones/iphones/iphone-18-release-schedule-could-be-changing-but-this-rumor-makes-no-sense">reportedly been pushed back to 2027</a>. </p><p>The iPhone 18 Pro Max <em>will</em> be there, however, but the bad news is that it’s facing a price hike. The mild good news is that it’s <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-and-iphone-18-pro-max-price-rumors-heres-how-much-more-you-could-pay-this-year">now expected to be $100</a>, given we were potentially <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-could-see-absolutely-massive-price-hike-according-to-researchers">bracing for more than double that at one point</a>. </p><p>Going by Apple’s previous pricing, that would see the 256GB model starting at $1,299, rising to $1,499 for the 512GB model, $1,699 for 1TB and $2,099 for 2TB.</p><p>That’s actually pretty similar to Samsung’s Galaxy S26 Ultra — or at least its MSRP when it was new in March 2026. It cost $1,299 for the 256GB model, $1,449 for 512GB and $1,799 for 1TB.</p><h2 id="iphone-18-pro-max-vs-samsung-galaxy-s26-ultra-design-and-screens">iPhone 18 Pro Max vs. Samsung Galaxy S26 Ultra: Design and screens</h2><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:55.78%;"><img id="WNJZg5wpSg4yem6kzvAjLN" name="iPhone 18 Pro and Max LIST Large" alt="iPhone 18 Pro vs iPhone 18 Pro Max." src="https://cdn.mos.cms.futurecdn.net/WNJZg5wpSg4yem6kzvAjLN-1920-80.jpg" mos="" align="middle" fullscreen="" width="1280" height="714" 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>Given the <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-pro-review">iPhone 17 Pro</a> series introduced a couple of new design tweaks — the raised camera section and the two-tone colorways — we’re not expecting major changes this time. At a glance, the iPhone 18 Pro Max may be barely distinguishable from the <a href="http://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a>, right down to the 6.9-inch OLED display.</p><p>There will reportedly be a couple of minor changes, mind. To make space for a larger capacity battery, it will apparently be about 0.25mm thicker and seven grams heavier. The Dynamic Island will apparently also be around 35% smaller.</p><p>It would be a big surprise if the screen specs were any different, given the 6.9-inch size. So we’re likely looking at a resolution of 2,868 x 1,320, or around 460 pixels per inch (ppi). ProMotion will offer adaptive refresh rates of up to 120Hz.</p><p>We know the exact screen specifications of the Samsung Galaxy S26 Ultra and they’re pretty similar. It also has a 6.9-inch OLED panel, capable of 120Hz, though the top resolution is higher at 3,120 x 1,440 meaning a sharpness of 505ppi (though it defaults to a lower 2,340 x 1,080 resolution to save battery). </p><p>This year, Samsung introduced a new feature called <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>. When enabled, this prevents others from seeing what’s on your phone screen by switching to dedicated narrow pixels that can only be seen head on. This can be automatically enabled on a per-app basis, so you can have it magically enable itself for your banking apps, but not for YouTube, say.</p><p>That innovation aside, there’s little difference between this and the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-ultra-review">Samsung Galaxy S25 Ultra</a> — both in terms of screen technology and looks. Though that design does allow for a built-in S Pen for note taking and doodling — a real advantage over the iPhone 18 Pro Max.</p><h2 id="iphone-18-pro-max-vs-samsung-galaxy-s26-ultra-performance">iPhone 18 Pro Max vs. Samsung Galaxy S26 Ultra: 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: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="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Let’s start with the one we have already benchmarked. Powered by the Qualcomm Snapdragon 8 Elite Gen 5 for Galaxy and backed by either 12 or 16GB RAM depending on the model, the Samsung Galaxy S26 Ultra is a truly impressive performer. It even has a vapor chamber for heat dissipation, which keeps it running cool even when running graphically demanding content.</p><p>Here’s how it benchmarked compared to the iPhone 17 Pro Max:</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench</strong></p></td><td  ><p><strong>3DMark Solar Bay Unlimited</strong></p></td><td  ><p><strong>Geekbench AI 1.5</strong></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 Core ML/Neural Engine)</p></td></tr></tbody></table></div><p>A modest lead on multi-core and gaming benchmarks, but a huge one when it comes to AI performance.</p><p>But, of course, this is against last year’s iPhone and its A19 chipset. It stands to reason that Apple will at least close the gap and more than likely go further, especially as the A20 Pro is <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-tipped-for-a20-pro-chip-apples-first-2nm-processor-to-power-new-foldable-phone">rumored to be built using the 2nm manufacturing process</a>, meaning a step change in terms of performance. We’re reportedly looking at 18% speed boost and 30% better power efficiency, which would see it blow past the S26 Ultra (though with the Galaxy S27 Ultra likely to regain the throne in early 2027). </p><p>On the subject of efficiency, Apple is set to gain another big advantage over Samsung with the iPhone 18 Pro Max: stamina. While the iPhone 17 Pro Max lasted an impressive 17 hours and 54 minutes in our tests, the next generation is likely to last even longer. That’s not just thanks to the 2nm chip’s efficiency savings, but because Apple is reportedly including a larger battery. This will reportedly be 5,391 mAh for models with a SIM tray, and 5,567mAh for those without  — a big step up from the 4,823 mAh/ 5,088 mAh cells found in the 17 Pro Max.</p><p>By contrast, the Galaxy S26 Ultra packs a 5,000 mAh battery. It lasted a respectable 16 hours and ten minutes in our review test. </p><h2 id="iphone-18-pro-max-vs-samsung-galaxy-s26-ultra-cameras">iPhone 18 Pro Max vs. Samsung Galaxy S26 Ultra: 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WeRkpqbqkJavKd4hmEBzgh" name="iPhone 18 Pro vs iPhone 17 Pro" alt="iPhone 18 Pro vs iPhone 17 Pro" src="https://cdn.mos.cms.futurecdn.net/WeRkpqbqkJavKd4hmEBzgh-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 Samsung Galaxy S26 Ultra currently tops our list of the <a href="https://www.tomsguide.com/us/best-phone-cameras,review-2272.html">best camera phones</a>. A big step up from the previous generation, the 200MP main camera and 50MP 5x telephoto lens have wider apertures, allowing for 47% and 37% brighter images respectively.</p><p>Add in a supplemental 10MP 3x telephoto lens and a 50MP ultra wide camera, and you’ve got an incredibly flexible camera setup that takes great shots whatever the environment. At the time of writing, it can’t be beat.</p><p>On raw specs alone, it doesn’t look like the iPhone 18 Pro Max will be challenging for the title, given leakers point to the same trio of 48MP lenses (regular, ultra wide and 4x optical zoom) again.</p><p>But the iPhone 18 Pro Max does reportedly have an ace up its sleeve: <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-could-be-the-first-iphone-to-get-a-variable-aperture-why-that-matters">variable aperture</a>. This lets you adjust the amount of light entering the lens, rather than having to rigidly stick to presets decided by Apple. While this is a feature that will only appeal to experienced photographers, in the right hands, it could make a huge difference to photographic composition.</p><h2 id="iphone-18-pro-max-vs-samsung-galaxy-s26-ultra-outlook">iPhone 18 Pro Max vs. Samsung Galaxy S26 Ultra: 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="UfraPifaz2CpXLbJKJYqDY" name="S Pen S26 Ultra" alt="Samsung Galaxy S26 Ultra S Pen" src="https://cdn.mos.cms.futurecdn.net/UfraPifaz2CpXLbJKJYqDY-1920-80.jpg" mos="" align="middle" fullscreen="" width="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 Samsung Galaxy S26 Ultra is the <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">best Android phone</a> you can buy right now. It will probably remain so until the Galaxy S27 Ultra replaces it in early 2027.</p><p>But if you’re open to iOS, then it looks like the iPhone 18 Pro Max will eclipse it in a few key ways. It’s set to be faster, last longer, and while the camera specs will likely be weaker, keen photographers will have a lot of fun with the variable rate aperture.</p><p>Of course, the Samsung Galaxy S26 Ultra has a few key advantages, and not just in its overall camera layout. Privacy Display is a marvelous innovation beautifully implemented, the S Pen is really handy, and as it's been out for nearly six months, it can be had for less than its high $1,299 asking price.</p><p>It’s worth considering, however, that we only have iPhone 18 Pro Max rumors and leaks to go on at the moment. While they’ve been pretty reliable in the past, we won’t know for sure what Apple has up its sleeve until <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-18-event-all-the-new-products-expected-to-launch-in-september">September 9th’s iPhone 18 event</a>. </p><div data-widget-type="merchantlink" data-model-name="Samsung Galaxy S26 Ultra"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I wore the Samsung Galaxy Watch 9 for a month — the new health tools impress, but that doesn’t mean you should upgrade ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I've been wearing the latest Samsung Galaxy Watch 9 for over a month — collectively, the TG fitness team has been <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">wearing it even longer</a> than that — and it's ultimately a very minor upgrade over 2025's <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-8-reviewhttps://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-8-review">Galaxy Watch 8.</a></p><p>The design, display, and battery life all remain unchanged, but the Galaxy Watch 9 supports a handful of useful new features, a slightly faster processor, and a comfier strap. It also costs more than its predecessor.</p><p>Here's everything you need to know about the Samsung Galaxy Watch 9.</p><h3 class="article-body__section" id="section-galaxy-watch-9-cheat-sheet"><span>Galaxy Watch 9 cheat sheet</span></h3><ul><li><strong>Price: </strong><a href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-40mm-graphite-bluetooth-sku-sm-l340nzkaxaa/" target="_blank" rel="nofollow">$379 for 40mm</a> (no LTE) or <a href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-44mm-graphite-bluetooth-sku-sm-l350nzkaxaa/" target="_blank" rel="nofollow">$409 for 44mm</a> (no LTE); add $50 to either for cellular</li><li><strong>Design: </strong>Same design and size options as Galaxy Watch 8; 40mm is available in Cream or Graphite; 44mm comes in Graphite or Silver</li><li><strong>'Classic' model</strong>: Samsung did not announce a Galaxy Watch 9 Classic with a clicky bezel</li><li><strong>Screen: </strong>Same max brightness, 3,000 nits, as Galaxy Watch 8</li><li><strong>Health features:</strong> New 'Vitals' dashboard with key metrics including heart rate, HRV, Sp02, body temp, and breath rate in one place; new 'Heart Health' score</li><li><strong>Fitness features:</strong> New 'Cardio Load' insights, new 'Fitness Index' score out of 100 and based on factors like daily step count average, V02 Max, average heart rate, BIA (Bioelectrical Impedance Analysis), and average workout recovery time</li><li><strong>Battery life: </strong>Slight increase in battery capacity, but battery life remains unchanged from the Galaxy Watch 8: 30 hours for the 40mm model and 40 hours for the 44mm</li></ul><h3 class="article-body__section" id="section-galaxy-watch-9-versus-the-competition"><span>Galaxy Watch 9: Versus the competition</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:4182px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="Su4KjbbvHMUJPbJL3EjFJV" name="Galaxy9-Pixel5-01" alt="Close-up of the Samsung Galaxy Watch 9 next to the Google Pixel Watch 5" src="https://cdn.mos.cms.futurecdn.net/Su4KjbbvHMUJPbJL3EjFJV-1920-80.jpg" mos="" align="middle" fullscreen="" width="4182" height="2353" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><div ><table><caption>Samsung Galaxy Watch 9 specs</caption><thead><tr><th class="firstcol empty" ></th><th  ><p>Samsung Galaxy Watch 9</p></th><th  ><p>Samsung Galaxy Watch 8</p></th><th  ><p>Samsung Galaxy Watch Ultra 2</p></th><th  ><p>Pixel Watch 5</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p>$379</p></td><td  ><p>$349</p></td><td  ><p>$699</p></td><td  ><p>$399</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions </strong></p></td><td  ><p>42.7 x 40.4 x 8.6mm /<br>46.0 x 43.7 x 8.6 mm</p></td><td  ><p>42.7 x 40.4 x 8.6mm /<br>46.0 x 43.7 x 8.6 mm</p></td><td  ><p>47 x 47 x 10 mm </p></td><td  ><p>41 x 41 x 12.3 mm /<br>45 x 45 x 12.3 mm</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>31.5 g / 34 g</p></td><td  ><p>30 g / 34 g</p></td><td  ><p>61.5 g</p></td><td  ><p>31 g / 36.7 g</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>1.34-inch / 1.47-inch; 3,000 nits max brightness</p></td><td  ><p>1.34-inch / 1.47-inch; 3,000 nits max brightness</p></td><td  ><p>1.52-inch AMOLED, 5,000 nits max brightness </p></td><td  ><p>1.2-inch, 1.4-inch AMOLED; 3,000 nits max brightness</p></td></tr><tr><td class="firstcol " ><p><strong>Water resistance </strong></p></td><td  ><p>50 meters</p></td><td  ><p>50 meters</p></td><td  ><p>100 meters</p></td><td  ><p>50 meters</p></td></tr><tr><td class="firstcol " ><p><strong>Battery capacity</strong></p></td><td  ><p>40mm: 390mAh / 44mm: 445mAh</p></td><td  ><p>40mm: 325mAh / 44mm: 435mAh</p></td><td  ><p>800 mAh</p></td><td  ><p>41mm: 332mAh / <br>45mm: 465 mAh</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-samsung-galaxy-watch-9-value-3-5-5"><span>Samsung Galaxy Watch 9 value: 3.5/5</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5322px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="ryz4WsgNuzbFG2wC9R8VKk" name="GalaxyWatch9-03" alt="Close-up of the Samsung Galaxy Watch 9 in white" src="https://cdn.mos.cms.futurecdn.net/ryz4WsgNuzbFG2wC9R8VKk-1920-80.jpg" mos="" align="middle" fullscreen="" width="5322" height="2994" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy Watch 9 was announced on July 22, 2026. It is available worldwide now.</p><p>When Samsung announced the Galaxy Watch 8 this time last year, I wasn't surprised to see a $50 price increase across the board compared to the <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-7-review">Galaxy Watch 7</a>. However, I was surprised to see Samsung raise the price of the Watch 9 this time around.</p><p>The 40mm Galaxy Watch 9, for example, <a href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-40mm-graphite-bluetooth-sku-sm-l340nzkaxaa/" target="_blank" rel="nofollow">starts at $379</a> without LTE, compared to $349 for the Galaxy Watch 8 equivalent. The 44mm Galaxy Watch 9, meanwhile, is $409 versus $379 for last year's equivalent. </p><p>Fortunately for Samsung (and Samsung alone), Google also raised prices across the <a href="https://www.tomsguide.com/wellness/smartwatches/google-pixel-watch5-review" target="_blank">Google Pixel Watch 5</a> lineup, which means the Galaxy Watch 9 is technically the most wallet-friendly 2026 full-featured smartwatch for Android (by $20). </p><ul><li><strong>Galaxy Watch 9 (Bluetooth, 40mm): $379</strong></li><li><strong>Galaxy Watch 9 (LTE, 40mm): $429</strong></li><li><strong>Galaxy Watch 9 (Bluetooth, 44mm): $409</strong></li><li><strong>Galaxy Watch 9 (LTE, 44mm): $459</strong></li></ul><h3 class="article-body__section" id="section-samsung-galaxy-watch-9-design-and-display-3-5-5"><span>Samsung Galaxy Watch 9 design and display: 3.5/5 </span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5294px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="u4bJvYVtRRHJ63QdqboeXM" name="GalaxyWatch9-design" alt="Close-up of the Samsung Galaxy Watch 9 on a user's wrist" src="https://cdn.mos.cms.futurecdn.net/u4bJvYVtRRHJ63QdqboeXM-1920-80.jpg" mos="" align="middle" fullscreen="" width="5294" height="2977" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>While Samsung made all sorts of under-the-hood upgrades to the Galaxy Watch 9, including a new processor and increased battery capacity, the outward appearance remains unchanged from its predecessor.</p><p>The physical dimensions and the weight are also essentially the same, as is the 50-meter water resistance rating. Finally, the Galaxy Watch 9 also boasts the same 3,000-nit max brightness display and twin-button design as the Galaxy Watch 8.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JN2bbBaBoTPrpbhNd9WPLj" name="GalaxyWatch8-rev-19" alt="Close-up of the Samsung Galaxy Watch Classic on a user's wrist with the Gemini AI app open" src="https://cdn.mos.cms.futurecdn.net/JN2bbBaBoTPrpbhNd9WPLj-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: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>I was a big fan of the Samsung Galaxy Watch 8 Classic (see image above), which sports a bidirectional clicky bezel for navigation and an additional customizable button compared to the standard Galaxy Watch 8 models.</p><p>Unfortunately, there is no Samsung Galaxy Watch 9 Classic. That said, Samsung has confirmed that the Galaxy Watch 8 Classic will remain in the brand's lineup for the time being. </p><h3 class="article-body__section" id="section-samsung-galaxy-watch-9-wellness-tools-4-5-5"><span>Samsung Galaxy Watch 9 wellness tools: 4.5/5</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4889px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9VYZkwkFKGrzUBK9zzEc3k" name="GalaxyWatch9-02" alt="Close-up of the Samsung Galaxy Watch 9 in white" src="https://cdn.mos.cms.futurecdn.net/9VYZkwkFKGrzUBK9zzEc3k-1920-80.jpg" mos="" align="middle" fullscreen="" width="4889" height="2750" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Samsung already offers an impressive suite of completely free wellness tracking insights, and they only get better with the Galaxy Watch 9. Better yet, important health info is now more visible in the companion app thanks to a new "Vitals" tab. There's additionally a greater focus on long-term trend reports and preventive health.</p><p>The newly introduced Vitals dashboard in the Health app brings your most important wellness metrics into one easy-to-view panel. It displays your current heart rate, heart rate variability (HRV), blood oxygen saturation percentage (Sp02), body temperature, and breath rate.</p><p>To keep you looped into your cardiovascular well-being, the Galaxy Watch 9 boasts a new Heart Health score based on a scale from one to 100. You'll need to wear the device for at least four consecutive nights to generate your initial score. Ultimately, what makes this tool valuable is its long-term insights, which can clue you in to how your day-to-day choices may be impacting your heart health for better or worse. </p><p>Note: As of writing, Samsung's Heart Health score is exclusive to the latest 2026 models.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4996px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="qkNNwr3UPRR6b8yK94DdDk" name="GalaxyWatch9-01" alt="Close-up of the Samsung Galaxy Watch 9 on a user's wrist against a blue background" src="https://cdn.mos.cms.futurecdn.net/qkNNwr3UPRR6b8yK94DdDk-1920-80.jpg" mos="" align="middle" fullscreen="" width="4996" height="2810" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>When it comes to sleep tracking, not much has changed from the Galaxy Watch 8. Users are still presented with a daily sleep score and energy score, both out of 100, along with a breakdown of time spent in each of the various sleep cycles, total time spent asleep, sleep disturbances, the consistency of your bedtime, and more.</p><p>I wore both the Samsung <a href="https://www.tomsguide.com/wellness/smartwatches/pixel-watch-5-vs-samsung-galaxy-watch-9-5-key-differences-you-need-to-know">Galaxy Watch 9 and Google Pixel Watch 5</a> to bed for a week and discovered that both of these flagship Android smartwatches calculated surprisingly similar sleep data. </p><p>Finally, one major advantage the Samsung Galaxy Watch 9 has over the Google Pixel Watch 5 is an FDA-cleared sleep apnea detection feature. On the flip side, the newest Galaxy Watch lacks some of the heady health safety tools found on the latest Pixel Watch, like <a href="https://www.tomsguide.com/wellness/smartwatches/exclusive-google-pm-says-the-pixel-watch-5-is-like-an-airbag-on-your-wrist-thanks-to-features-like-breathing-emergency-detection">Breathing Emergency Detection</a> and <a href="https://www.tomsguide.com/wellness/smartwatches/google-exclusive-how-the-pixel-watch-3-got-a-life-saving-feature-the-apple-watch-cant-match">Loss of Pulse Detection</a>.</p><h3 class="article-body__section" id="section-samsung-galaxy-watch-9-fitness-tracking-4-5"><span>Samsung Galaxy Watch 9 fitness tracking: 4/5 </span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4834px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kuTYfGbyRcRugdWr8FJdqf" name="Galaxy9-v-Instinct3-02" alt="Close-up of the Garmin Instinct 3 next to the Samsung Galaxy Watch 9 with evergreens in the background" src="https://cdn.mos.cms.futurecdn.net/kuTYfGbyRcRugdWr8FJdqf-1920-80.jpg" mos="" align="middle" fullscreen="" width="4834" height="2719" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy Watch 9 is a fairly reliable fitness tracker for both indoor and outdoor workouts. When I tested it <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-4-000-steps-with-the-pixel-watch-5-vs-samsung-galaxy-watch-9-and-we-have-a-new-android-champ">against the Pixel Watch 5</a>, the Google smartwatch proved slightly more precise, but the Galaxy Watch 9's performance wasn't far behind. </p><p>I also pitted the Galaxy Watch 9 <a href="https://www.tomsguide.com/wellness/smartwatches/i-hiked-7-miles-with-the-garmin-instinct-3-vs-samsung-galaxy-watch-9-and-the-winner-is-clear-as-day">against the Garmin Instinct 3</a>, my go-to smartwatch for logging outdoor adventures, and a model that costs roughly the same. During my seven-mile hike, the Samsung watch again performed pretty well, but ultimately struggled to accurately log my climb.</p><p>The Galaxy Watch 9 also lacks some of the more common workout tracking modes offered by the competition, like e-biking and skateboarding (two of my faves). That said, the auto workout tracking feature works quite well, a finding my colleague <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">Sam also found impressive</a>.</p><p>The new Galaxy Watch also boasts several new fitness-focused metrics, including Cardio Load and a Fitness Index score. While Cardio Load will be supported by older Galaxy Watch models, the Fitness Index Score is, for now, exclusive to the Galaxy Watch 9 and <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Galaxy Watch Ultra 2</a>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5408px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="r8eU5UpsMnb4H9VFcKFJiV" name="Galaxy9-Pixel5-04" alt="Close-up of the Samsung Galaxy Watch 9 next to the Google Pixel Watch 5" src="https://cdn.mos.cms.futurecdn.net/r8eU5UpsMnb4H9VFcKFJiV-1920-80.jpg" mos="" align="middle" fullscreen="" width="5408" height="3042" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Based on factors like daily step count average, V02 Max, average heart rate, BIA (Bioelectrical Impedance Analysis), and average workout recovery time, the Fitness Index score is on a scale from zero to 100. </p><p>As of writing, mine is an 82, or "average." The Health app further breaks that score down into five individual categories, each with its own score: Body Composition, Cardio, Endurance, Strength, and Flexibility. These scores, along with the overall Fitness Index score, are calculated by comparing your fitness levels to other users in your age range.</p><p>For example, from my score breakdown, I can glean that my endurance is solid (rated 93/100) while my overall strength could use attention (rated 63/100).</p><p>For high-cardio athletes, the new Cardio Load metric is designed to help you train more effectively. It takes seven days to fully calibrate, i.e., establish a baseline for your maximum training capacity. Once complete, users get a daily cardio intensity rating ranging from "under target" to "over." This rating is calculated by analyzing how much time you spent doing activities that pushed your heart rate into Zone 3 or higher. </p><h3 class="article-body__section" id="section-samsung-galaxy-watch-9-ai-features-3-5"><span>Samsung Galaxy Watch 9 AI features: 3/5</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4384px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bAoGSNWdD3TukFKtx2DHpA" name="GalaxyWatch9-raise" alt="Close-up of the Samsung Galaxy Watch 9 on a user's wrist showing the gesture control options" src="https://cdn.mos.cms.futurecdn.net/bAoGSNWdD3TukFKtx2DHpA-1920-80.jpg" mos="" align="middle" fullscreen="" width="4384" height="2466" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy Watch 9 ships with Google's Gemini AI voice assistant built in, and it's easily the best smartwatch personal assistant I've tested. Even better, the Galaxy Watch 9 now supports a wrist raise gesture control to unlock Gemini, something first introduced in last year's <a href="https://www.tomsguide.com/wellness/smartwatches/i-just-went-hands-on-with-google-pixel-watch-4-and-it-could-be-my-new-favorite-smartwatch-for-android">Pixel Watch 4</a>.</p><p>As of writing, the Galaxy Watch 9 and Galaxy Watch Ultra 2 are the only two Samsung models that support using Raise to talk to unlock Gemini. </p><p>In terms of usefulness, Samsung's Google AI assistant does a reasonably good job answering random, hyper-specific questions like, "How many adult penguins can I fit in a 1995 Ford Taurus?"</p><p>It's also good at context-specific tasks. For example, Gemini was helpful when I was searching for new restaurants within walking distance of my house to order for dinner. The Gemini AI assistant additionally correctly named the opening acts and start time for an upcoming concert I was seeing (The Strokes). </p><h3 class="article-body__section" id="section-samsung-galaxy-watch-9-battery-life-3-5"><span>Samsung Galaxy Watch 9 battery life: 3/5</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4874px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="XLQGGRLwUHbnZNMdPut7Aj" name="GalaxyWatch9-05" alt="Close-up of the Samsung Galaxy Watch 9 in white" src="https://cdn.mos.cms.futurecdn.net/XLQGGRLwUHbnZNMdPut7Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="4874" height="2742" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Both the 40mm and 44mm Samsung Galaxy Watch 9 models see tiny battery capacity increases. The smaller model jumps from 325 mAh for the Galaxy Watch 8 to 390 mAh for the Galaxy Watch 9. The bigger model has increased from 435 mAh on the Galaxy Watch 8 to 445 mAh for the Galaxy Watch 9.</p><p>Unfortunately, these bigger batteries don't result in any tangible longevity improvements. The 40mm is still rated at 30 hours per charge, and the 44mm is still rated at 40 hours per charge, just like last year's model.</p><p>In real-world use,  the 40mm Galaxy Watch 9 averaged about 32 hours of use per charge. That's behind the Pixel Watch 5, which averages closer to 48 hours of use per charge in my testing. </p><p>The Galaxy Watch 9 also recharges a little slower than its Google rival. Again, testing the smaller model, a full recharge took about 90 minutes for the Galaxy Watch 9, compared to closer to 60 minutes for the Pixel Watch 5.</p><h3 class="article-body__section" id="section-samsung-galaxy-watch-9-verdict"><span>Samsung Galaxy Watch 9: 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:5053px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="hM7Qvm7gLY6iCvAnLrV5tU" name="Galaxy9-Pixel5-03" alt="Close-up of the Samsung Galaxy Watch 9 next to the Google Pixel Watch 5" src="https://cdn.mos.cms.futurecdn.net/hM7Qvm7gLY6iCvAnLrV5tU-1920-80.jpg" mos="" align="middle" fullscreen="" width="5053" height="2842" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy Watch 9 is easily one of the <a href="https://www.tomsguide.com/best-picks/best-smartwatches-android">best smartwatches</a> for Android, but that doesn't mean you should buy one, especially if you already own the Galaxy Watch 8. Aside from a faster processor, a softer strap, and a couple of exclusive health metrics, the Galaxy Watch 9 is pretty much the same as the Galaxy Watch 8, just pricier.</p><p>It does support a handy new (for Samsung) raise-wrist gesture for unlocking the excellent onboard Gemini AI assistant. However, battery life remains unchanged compared to its predecessor. More notably, the Galaxy Watch 9 doesn't last as long per charge as its biggest rival, the Google Pixel Watch 5. It also lacks the Pixel Watch's impressive suite of safety tools.</p><p>That said, Samsung, unlike Google and Garmin, provides all of its wellness and fitness insights without forcing you to pony up for a monthly/annual subscription. That I like.</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/wellness/smartwatches/im-a-smartwatch-reviewer-and-heres-my-apple-watch-series-12-wish-list-three-upgrades-i-want-and-one-i-dont"><strong>I'm a smartwatch reviewer, and here's my Apple Watch Series 12 wish list — three upgrades I want, and one I don't</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried"><strong>Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-needs-these-3-upgrades-to-convince-me-to-switch-from-my-apple-watch-ultra-3"><strong>Samsung Galaxy Watch Ultra 2 needs these 3 upgrades to convince me to switch from my Apple Watch Ultra 3</strong></a><strong></strong></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/smartwatches/i-wore-the-samsung-galaxy-watch-9-for-a-month-the-new-health-tools-impress-but-that-doesnt-mean-you-should-upgrade</link>
                                                                            <description>
                            <![CDATA[ The Galaxy Watch 9 looks exactly like the Galaxy Watch 8, but don't let that fool you. Samsung went ahead and added some useful new health, fitness, and AI features. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CdpNZobMQf2DrJxJePdUYJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ZfFbLbSaYpGwerPZTYP73j-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 30 Aug 2026 05:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&gt;&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ZfFbLbSaYpGwerPZTYP73j-1920-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Samsung Galaxy Watch 9 in white]]></media:description>                                                            <media:text><![CDATA[Close-up of the Samsung Galaxy Watch 9 in white]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Samsung Galaxy Watch 9 in white]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ZfFbLbSaYpGwerPZTYP73j-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I've been wearing the latest Samsung Galaxy Watch 9 for over a month — collectively, the TG fitness team has been <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">wearing it even longer</a> than that — and it's ultimately a very minor upgrade over 2025's <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-8-reviewhttps://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-8-review">Galaxy Watch 8.</a></p><p>The design, display, and battery life all remain unchanged, but the Galaxy Watch 9 supports a handful of useful new features, a slightly faster processor, and a comfier strap. It also costs more than its predecessor.</p><p>Here's everything you need to know about the Samsung Galaxy Watch 9.</p><h3 class="article-body__section" id="section-galaxy-watch-9-cheat-sheet"><span>Galaxy Watch 9 cheat sheet</span></h3><ul><li><strong>Price: </strong><a href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-40mm-graphite-bluetooth-sku-sm-l340nzkaxaa/" target="_blank" rel="nofollow">$379 for 40mm</a> (no LTE) or <a href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-44mm-graphite-bluetooth-sku-sm-l350nzkaxaa/" target="_blank" rel="nofollow">$409 for 44mm</a> (no LTE); add $50 to either for cellular</li><li><strong>Design: </strong>Same design and size options as Galaxy Watch 8; 40mm is available in Cream or Graphite; 44mm comes in Graphite or Silver</li><li><strong>'Classic' model</strong>: Samsung did not announce a Galaxy Watch 9 Classic with a clicky bezel</li><li><strong>Screen: </strong>Same max brightness, 3,000 nits, as Galaxy Watch 8</li><li><strong>Health features:</strong> New 'Vitals' dashboard with key metrics including heart rate, HRV, Sp02, body temp, and breath rate in one place; new 'Heart Health' score</li><li><strong>Fitness features:</strong> New 'Cardio Load' insights, new 'Fitness Index' score out of 100 and based on factors like daily step count average, V02 Max, average heart rate, BIA (Bioelectrical Impedance Analysis), and average workout recovery time</li><li><strong>Battery life: </strong>Slight increase in battery capacity, but battery life remains unchanged from the Galaxy Watch 8: 30 hours for the 40mm model and 40 hours for the 44mm</li></ul><h3 class="article-body__section" id="section-galaxy-watch-9-versus-the-competition"><span>Galaxy Watch 9: Versus the competition</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:4182px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="Su4KjbbvHMUJPbJL3EjFJV" name="Galaxy9-Pixel5-01" alt="Close-up of the Samsung Galaxy Watch 9 next to the Google Pixel Watch 5" src="https://cdn.mos.cms.futurecdn.net/Su4KjbbvHMUJPbJL3EjFJV-1920-80.jpg" mos="" align="middle" fullscreen="" width="4182" height="2353" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><div ><table><caption>Samsung Galaxy Watch 9 specs</caption><thead><tr><th class="firstcol empty" ></th><th  ><p>Samsung Galaxy Watch 9</p></th><th  ><p>Samsung Galaxy Watch 8</p></th><th  ><p>Samsung Galaxy Watch Ultra 2</p></th><th  ><p>Pixel Watch 5</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p>$379</p></td><td  ><p>$349</p></td><td  ><p>$699</p></td><td  ><p>$399</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions </strong></p></td><td  ><p>42.7 x 40.4 x 8.6mm /<br>46.0 x 43.7 x 8.6 mm</p></td><td  ><p>42.7 x 40.4 x 8.6mm /<br>46.0 x 43.7 x 8.6 mm</p></td><td  ><p>47 x 47 x 10 mm </p></td><td  ><p>41 x 41 x 12.3 mm /<br>45 x 45 x 12.3 mm</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>31.5 g / 34 g</p></td><td  ><p>30 g / 34 g</p></td><td  ><p>61.5 g</p></td><td  ><p>31 g / 36.7 g</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>1.34-inch / 1.47-inch; 3,000 nits max brightness</p></td><td  ><p>1.34-inch / 1.47-inch; 3,000 nits max brightness</p></td><td  ><p>1.52-inch AMOLED, 5,000 nits max brightness </p></td><td  ><p>1.2-inch, 1.4-inch AMOLED; 3,000 nits max brightness</p></td></tr><tr><td class="firstcol " ><p><strong>Water resistance </strong></p></td><td  ><p>50 meters</p></td><td  ><p>50 meters</p></td><td  ><p>100 meters</p></td><td  ><p>50 meters</p></td></tr><tr><td class="firstcol " ><p><strong>Battery capacity</strong></p></td><td  ><p>40mm: 390mAh / 44mm: 445mAh</p></td><td  ><p>40mm: 325mAh / 44mm: 435mAh</p></td><td  ><p>800 mAh</p></td><td  ><p>41mm: 332mAh / <br>45mm: 465 mAh</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-samsung-galaxy-watch-9-value-3-5-5"><span>Samsung Galaxy Watch 9 value: 3.5/5</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5322px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="ryz4WsgNuzbFG2wC9R8VKk" name="GalaxyWatch9-03" alt="Close-up of the Samsung Galaxy Watch 9 in white" src="https://cdn.mos.cms.futurecdn.net/ryz4WsgNuzbFG2wC9R8VKk-1920-80.jpg" mos="" align="middle" fullscreen="" width="5322" height="2994" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy Watch 9 was announced on July 22, 2026. It is available worldwide now.</p><p>When Samsung announced the Galaxy Watch 8 this time last year, I wasn't surprised to see a $50 price increase across the board compared to the <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-7-review">Galaxy Watch 7</a>. However, I was surprised to see Samsung raise the price of the Watch 9 this time around.</p><p>The 40mm Galaxy Watch 9, for example, <a href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-40mm-graphite-bluetooth-sku-sm-l340nzkaxaa/" target="_blank" rel="nofollow">starts at $379</a> without LTE, compared to $349 for the Galaxy Watch 8 equivalent. The 44mm Galaxy Watch 9, meanwhile, is $409 versus $379 for last year's equivalent. </p><p>Fortunately for Samsung (and Samsung alone), Google also raised prices across the <a href="https://www.tomsguide.com/wellness/smartwatches/google-pixel-watch5-review" target="_blank">Google Pixel Watch 5</a> lineup, which means the Galaxy Watch 9 is technically the most wallet-friendly 2026 full-featured smartwatch for Android (by $20). </p><ul><li><strong>Galaxy Watch 9 (Bluetooth, 40mm): $379</strong></li><li><strong>Galaxy Watch 9 (LTE, 40mm): $429</strong></li><li><strong>Galaxy Watch 9 (Bluetooth, 44mm): $409</strong></li><li><strong>Galaxy Watch 9 (LTE, 44mm): $459</strong></li></ul><h3 class="article-body__section" id="section-samsung-galaxy-watch-9-design-and-display-3-5-5"><span>Samsung Galaxy Watch 9 design and display: 3.5/5 </span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5294px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="u4bJvYVtRRHJ63QdqboeXM" name="GalaxyWatch9-design" alt="Close-up of the Samsung Galaxy Watch 9 on a user's wrist" src="https://cdn.mos.cms.futurecdn.net/u4bJvYVtRRHJ63QdqboeXM-1920-80.jpg" mos="" align="middle" fullscreen="" width="5294" height="2977" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>While Samsung made all sorts of under-the-hood upgrades to the Galaxy Watch 9, including a new processor and increased battery capacity, the outward appearance remains unchanged from its predecessor.</p><p>The physical dimensions and the weight are also essentially the same, as is the 50-meter water resistance rating. Finally, the Galaxy Watch 9 also boasts the same 3,000-nit max brightness display and twin-button design as the Galaxy Watch 8.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JN2bbBaBoTPrpbhNd9WPLj" name="GalaxyWatch8-rev-19" alt="Close-up of the Samsung Galaxy Watch Classic on a user's wrist with the Gemini AI app open" src="https://cdn.mos.cms.futurecdn.net/JN2bbBaBoTPrpbhNd9WPLj-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: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>I was a big fan of the Samsung Galaxy Watch 8 Classic (see image above), which sports a bidirectional clicky bezel for navigation and an additional customizable button compared to the standard Galaxy Watch 8 models.</p><p>Unfortunately, there is no Samsung Galaxy Watch 9 Classic. That said, Samsung has confirmed that the Galaxy Watch 8 Classic will remain in the brand's lineup for the time being. </p><h3 class="article-body__section" id="section-samsung-galaxy-watch-9-wellness-tools-4-5-5"><span>Samsung Galaxy Watch 9 wellness tools: 4.5/5</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4889px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9VYZkwkFKGrzUBK9zzEc3k" name="GalaxyWatch9-02" alt="Close-up of the Samsung Galaxy Watch 9 in white" src="https://cdn.mos.cms.futurecdn.net/9VYZkwkFKGrzUBK9zzEc3k-1920-80.jpg" mos="" align="middle" fullscreen="" width="4889" height="2750" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Samsung already offers an impressive suite of completely free wellness tracking insights, and they only get better with the Galaxy Watch 9. Better yet, important health info is now more visible in the companion app thanks to a new "Vitals" tab. There's additionally a greater focus on long-term trend reports and preventive health.</p><p>The newly introduced Vitals dashboard in the Health app brings your most important wellness metrics into one easy-to-view panel. It displays your current heart rate, heart rate variability (HRV), blood oxygen saturation percentage (Sp02), body temperature, and breath rate.</p><p>To keep you looped into your cardiovascular well-being, the Galaxy Watch 9 boasts a new Heart Health score based on a scale from one to 100. You'll need to wear the device for at least four consecutive nights to generate your initial score. Ultimately, what makes this tool valuable is its long-term insights, which can clue you in to how your day-to-day choices may be impacting your heart health for better or worse. </p><p>Note: As of writing, Samsung's Heart Health score is exclusive to the latest 2026 models.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4996px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="qkNNwr3UPRR6b8yK94DdDk" name="GalaxyWatch9-01" alt="Close-up of the Samsung Galaxy Watch 9 on a user's wrist against a blue background" src="https://cdn.mos.cms.futurecdn.net/qkNNwr3UPRR6b8yK94DdDk-1920-80.jpg" mos="" align="middle" fullscreen="" width="4996" height="2810" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>When it comes to sleep tracking, not much has changed from the Galaxy Watch 8. Users are still presented with a daily sleep score and energy score, both out of 100, along with a breakdown of time spent in each of the various sleep cycles, total time spent asleep, sleep disturbances, the consistency of your bedtime, and more.</p><p>I wore both the Samsung <a href="https://www.tomsguide.com/wellness/smartwatches/pixel-watch-5-vs-samsung-galaxy-watch-9-5-key-differences-you-need-to-know">Galaxy Watch 9 and Google Pixel Watch 5</a> to bed for a week and discovered that both of these flagship Android smartwatches calculated surprisingly similar sleep data. </p><p>Finally, one major advantage the Samsung Galaxy Watch 9 has over the Google Pixel Watch 5 is an FDA-cleared sleep apnea detection feature. On the flip side, the newest Galaxy Watch lacks some of the heady health safety tools found on the latest Pixel Watch, like <a href="https://www.tomsguide.com/wellness/smartwatches/exclusive-google-pm-says-the-pixel-watch-5-is-like-an-airbag-on-your-wrist-thanks-to-features-like-breathing-emergency-detection">Breathing Emergency Detection</a> and <a href="https://www.tomsguide.com/wellness/smartwatches/google-exclusive-how-the-pixel-watch-3-got-a-life-saving-feature-the-apple-watch-cant-match">Loss of Pulse Detection</a>.</p><h3 class="article-body__section" id="section-samsung-galaxy-watch-9-fitness-tracking-4-5"><span>Samsung Galaxy Watch 9 fitness tracking: 4/5 </span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4834px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kuTYfGbyRcRugdWr8FJdqf" name="Galaxy9-v-Instinct3-02" alt="Close-up of the Garmin Instinct 3 next to the Samsung Galaxy Watch 9 with evergreens in the background" src="https://cdn.mos.cms.futurecdn.net/kuTYfGbyRcRugdWr8FJdqf-1920-80.jpg" mos="" align="middle" fullscreen="" width="4834" height="2719" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy Watch 9 is a fairly reliable fitness tracker for both indoor and outdoor workouts. When I tested it <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-4-000-steps-with-the-pixel-watch-5-vs-samsung-galaxy-watch-9-and-we-have-a-new-android-champ">against the Pixel Watch 5</a>, the Google smartwatch proved slightly more precise, but the Galaxy Watch 9's performance wasn't far behind. </p><p>I also pitted the Galaxy Watch 9 <a href="https://www.tomsguide.com/wellness/smartwatches/i-hiked-7-miles-with-the-garmin-instinct-3-vs-samsung-galaxy-watch-9-and-the-winner-is-clear-as-day">against the Garmin Instinct 3</a>, my go-to smartwatch for logging outdoor adventures, and a model that costs roughly the same. During my seven-mile hike, the Samsung watch again performed pretty well, but ultimately struggled to accurately log my climb.</p><p>The Galaxy Watch 9 also lacks some of the more common workout tracking modes offered by the competition, like e-biking and skateboarding (two of my faves). That said, the auto workout tracking feature works quite well, a finding my colleague <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">Sam also found impressive</a>.</p><p>The new Galaxy Watch also boasts several new fitness-focused metrics, including Cardio Load and a Fitness Index score. While Cardio Load will be supported by older Galaxy Watch models, the Fitness Index Score is, for now, exclusive to the Galaxy Watch 9 and <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Galaxy Watch Ultra 2</a>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5408px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="r8eU5UpsMnb4H9VFcKFJiV" name="Galaxy9-Pixel5-04" alt="Close-up of the Samsung Galaxy Watch 9 next to the Google Pixel Watch 5" src="https://cdn.mos.cms.futurecdn.net/r8eU5UpsMnb4H9VFcKFJiV-1920-80.jpg" mos="" align="middle" fullscreen="" width="5408" height="3042" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Based on factors like daily step count average, V02 Max, average heart rate, BIA (Bioelectrical Impedance Analysis), and average workout recovery time, the Fitness Index score is on a scale from zero to 100. </p><p>As of writing, mine is an 82, or "average." The Health app further breaks that score down into five individual categories, each with its own score: Body Composition, Cardio, Endurance, Strength, and Flexibility. These scores, along with the overall Fitness Index score, are calculated by comparing your fitness levels to other users in your age range.</p><p>For example, from my score breakdown, I can glean that my endurance is solid (rated 93/100) while my overall strength could use attention (rated 63/100).</p><p>For high-cardio athletes, the new Cardio Load metric is designed to help you train more effectively. It takes seven days to fully calibrate, i.e., establish a baseline for your maximum training capacity. Once complete, users get a daily cardio intensity rating ranging from "under target" to "over." This rating is calculated by analyzing how much time you spent doing activities that pushed your heart rate into Zone 3 or higher. </p><h3 class="article-body__section" id="section-samsung-galaxy-watch-9-ai-features-3-5"><span>Samsung Galaxy Watch 9 AI features: 3/5</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4384px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bAoGSNWdD3TukFKtx2DHpA" name="GalaxyWatch9-raise" alt="Close-up of the Samsung Galaxy Watch 9 on a user's wrist showing the gesture control options" src="https://cdn.mos.cms.futurecdn.net/bAoGSNWdD3TukFKtx2DHpA-1920-80.jpg" mos="" align="middle" fullscreen="" width="4384" height="2466" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy Watch 9 ships with Google's Gemini AI voice assistant built in, and it's easily the best smartwatch personal assistant I've tested. Even better, the Galaxy Watch 9 now supports a wrist raise gesture control to unlock Gemini, something first introduced in last year's <a href="https://www.tomsguide.com/wellness/smartwatches/i-just-went-hands-on-with-google-pixel-watch-4-and-it-could-be-my-new-favorite-smartwatch-for-android">Pixel Watch 4</a>.</p><p>As of writing, the Galaxy Watch 9 and Galaxy Watch Ultra 2 are the only two Samsung models that support using Raise to talk to unlock Gemini. </p><p>In terms of usefulness, Samsung's Google AI assistant does a reasonably good job answering random, hyper-specific questions like, "How many adult penguins can I fit in a 1995 Ford Taurus?"</p><p>It's also good at context-specific tasks. For example, Gemini was helpful when I was searching for new restaurants within walking distance of my house to order for dinner. The Gemini AI assistant additionally correctly named the opening acts and start time for an upcoming concert I was seeing (The Strokes). </p><h3 class="article-body__section" id="section-samsung-galaxy-watch-9-battery-life-3-5"><span>Samsung Galaxy Watch 9 battery life: 3/5</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4874px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="XLQGGRLwUHbnZNMdPut7Aj" name="GalaxyWatch9-05" alt="Close-up of the Samsung Galaxy Watch 9 in white" src="https://cdn.mos.cms.futurecdn.net/XLQGGRLwUHbnZNMdPut7Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="4874" height="2742" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Both the 40mm and 44mm Samsung Galaxy Watch 9 models see tiny battery capacity increases. The smaller model jumps from 325 mAh for the Galaxy Watch 8 to 390 mAh for the Galaxy Watch 9. The bigger model has increased from 435 mAh on the Galaxy Watch 8 to 445 mAh for the Galaxy Watch 9.</p><p>Unfortunately, these bigger batteries don't result in any tangible longevity improvements. The 40mm is still rated at 30 hours per charge, and the 44mm is still rated at 40 hours per charge, just like last year's model.</p><p>In real-world use,  the 40mm Galaxy Watch 9 averaged about 32 hours of use per charge. That's behind the Pixel Watch 5, which averages closer to 48 hours of use per charge in my testing. </p><p>The Galaxy Watch 9 also recharges a little slower than its Google rival. Again, testing the smaller model, a full recharge took about 90 minutes for the Galaxy Watch 9, compared to closer to 60 minutes for the Pixel Watch 5.</p><h3 class="article-body__section" id="section-samsung-galaxy-watch-9-verdict"><span>Samsung Galaxy Watch 9: 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:5053px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="hM7Qvm7gLY6iCvAnLrV5tU" name="Galaxy9-Pixel5-03" alt="Close-up of the Samsung Galaxy Watch 9 next to the Google Pixel Watch 5" src="https://cdn.mos.cms.futurecdn.net/hM7Qvm7gLY6iCvAnLrV5tU-1920-80.jpg" mos="" align="middle" fullscreen="" width="5053" height="2842" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy Watch 9 is easily one of the <a href="https://www.tomsguide.com/best-picks/best-smartwatches-android">best smartwatches</a> for Android, but that doesn't mean you should buy one, especially if you already own the Galaxy Watch 8. Aside from a faster processor, a softer strap, and a couple of exclusive health metrics, the Galaxy Watch 9 is pretty much the same as the Galaxy Watch 8, just pricier.</p><p>It does support a handy new (for Samsung) raise-wrist gesture for unlocking the excellent onboard Gemini AI assistant. However, battery life remains unchanged compared to its predecessor. More notably, the Galaxy Watch 9 doesn't last as long per charge as its biggest rival, the Google Pixel Watch 5. It also lacks the Pixel Watch's impressive suite of safety tools.</p><p>That said, Samsung, unlike Google and Garmin, provides all of its wellness and fitness insights without forcing you to pony up for a monthly/annual subscription. That I like.</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/wellness/smartwatches/im-a-smartwatch-reviewer-and-heres-my-apple-watch-series-12-wish-list-three-upgrades-i-want-and-one-i-dont"><strong>I'm a smartwatch reviewer, and here's my Apple Watch Series 12 wish list — three upgrades I want, and one I don't</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried"><strong>Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-needs-these-3-upgrades-to-convince-me-to-switch-from-my-apple-watch-ultra-3"><strong>Samsung Galaxy Watch Ultra 2 needs these 3 upgrades to convince me to switch from my Apple Watch Ultra 3</strong></a><strong></strong></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, 08 Oct 2026 17:50:57 +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[ Cheaper OLED TVs might finally be on the way — here's when they could arrive ]]></title>
                                                                                                <dc:content><![CDATA[ <p>OLED TVs have long since been the darling of A/V aficionados, home theater enthusiasts and TV dorks like myself. While OLEDs aren’t ideal for every viewing environment, the technology is nonetheless capable of performance- and design-related feats that even the top Mini-LED TVs can’t pull off.</p><p>There’s just one problem: OLED TVs don’t come cheap. Even entry-level OLEDs tend to be priced higher than mid-range Mini-LED TVs, and the <a href="https://www.tomsguide.com/tvs/oled-tvs/best-oled-tvs">best OLED TVs</a> are often more expensive than some brands’ best LCD-based sets.</p><p>But there are signs that the status quo could be changing. This year, LG Display is manufacturing cheaper OLED panels for LG and its competitors, and it’s happening at a time where the top OLED-maker is also reportedly developing an even-cheaper panel for the next generation of OLED TVs. Here’s how these advancements could usher in an era of cheap OLEDs.</p><h2 id="lg-display-s-quest-to-make-oled-cheaper-more-efficient-and-longer-lasting">LG Display’s quest to make OLED cheaper, more efficient and longer 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="z8cwLfSQU23Gt58Y7C5R5n" name="LG-B6--11" alt="LG B6 OLED TV on a table" src="https://cdn.mos.cms.futurecdn.net/z8cwLfSQU23Gt58Y7C5R5n-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There are two exciting developments in the realm of affordable OLED technology playing out as we speak. The first spin on OLED technology is already available to buy and it's called OLED SE.</p><p>Announced back in March by <a href="https://news.lgdisplay.com/en/2026/03/from-premium-to-entry-levellg-display-expands-the-oled-tv-market-with-new-sepanels/?ckattempt=2" target="_blank" rel="nofollow">LG Display</a>, OLED SE sits below OLED EX, the latter of which is the panel-type associated with the mid-range <a href="https://www.tomsguide.com/tvs/oled-tvs/lg-c6-oled">LG C6</a>. OLED EX, however, sits below OLED META, the panel-type associated with the flagship-level <a href="https://www.tomsguide.com/tvs/oled-tvs/the-lg-g6-oled-has-a-new-feature-i-desperately-need-and-it-could-be-the-biggest-tv-upgrade-in-years">LG G6</a>. This makes the OLED SE one of the most affordable panel options for any brand looking to sell an OLED TV.</p><p>There’s been speculation among industry insiders that the all-new LG B6E OLED — one of LG’s most-affordable OLED TVs this year — is built around LG Display’s OLED SE panel. We’ve yet to take this model for a test spin in our lab, but there’s no denying its relatively friendly price tag of just $899 for a 55-inch model.</p><div class="product"><a data-dimension112="0b677852-a188-11f1-ae6b-2f2bff7b20f9" data-action="Deal Block" data-label="55" B6E 4K OLED TV" data-dimension48="55" B6E 4K OLED TV" data-dimension25="$899" href="https://www.bestbuy.com/product/lg-55-class-b6e-series-oled-ai-4k-smart-webos-tv-2026/JJ8VPZZ7PZ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><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="2FCFUfHnMLGgUA6cgCxeVF" name="LG-B6E-OLED-TV-16-by-9-deal-block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2FCFUfHnMLGgUA6cgCxeVF-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/product/lg-55-class-b6e-series-oled-ai-4k-smart-webos-tv-2026/JJ8VPZZ7PZ" target="_blank" rel="nofollow" data-dimension112="0b677852-a188-11f1-ae6b-2f2bff7b20f9" data-action="Deal Block" data-label='55" B6E 4K OLED TV' data-dimension48='55" B6E 4K OLED TV' data-dimension25="$899">55" B6E 4K OLED TV: was $1299 now $899</a></strong><br>The LG B6E is a fantastic, entry-level OLED TV for folks who are intrigued by this high-performance display tech, but who'd rather not shell out for a high-end panel. In addition to being one of the most-affordable OLED TVs on shelves in 2026, it also comes with webOS built in and a wide selection of gaming-related features.<a class="view-deal button" href="https://www.bestbuy.com/product/lg-55-class-b6e-series-oled-ai-4k-smart-webos-tv-2026/JJ8VPZZ7PZ" target="_blank" rel="nofollow" data-dimension112="0b677852-a188-11f1-ae6b-2f2bff7b20f9" data-action="Deal Block" data-label="55" B6E 4K OLED TV" data-dimension48="55" B6E 4K OLED TV" data-dimension25="$899">View Deal</a></p></div><p>Earlier this year, rumors began circulating that a <a href="https://www.tomsguide.com/tvs/oled-tvs/is-this-rumored-sony-oled-tv-the-lg-c6-rival-weve-been-waiting-for">new Sony OLED</a> could be on the horizon — a more-affordable set that could compete with entry-level and mid-range OLEDs from Samsung and Sony. At the time, I floated the possibility that this TV could very well leverage LG Display’s OLED SE panel, too.</p><p>Even if we assume that OLED SE panels are present in TVs like the LG B6E (and in entry-level OLEDs from LG’s competitors), $899 for an entry-level model isn’t exactly <em>cheap</em>. Fortunately, it doesn’t seem like LG Display’s work is done.</p><h2 id="what-is-two-stack-oled">What is two-stack OLED?</h2><p>According to Korean newspaper <a href="https://www.etnews.com/20260731000155">ETNews</a> (as reported by <a href="https://www.flatpanelshd.com/news.php?subaction=showfull&id=1785923042">FlatpanelsHD</a>), LG Display is reportedly developing an all-new, “two-stack” WOLED panel for use in TVs and monitors. The design is built around a simplified structure that relies on just two emission layers, while previous WOLED-based designs (like the one found on the LG C6) rely on three layers.</p><div><blockquote><p>The design is built around a simplified structure that relies on just two emission layers.</p></blockquote></div><p>LG Display claims that the new two-stack structure is capable of covering about 82.5% of BT.2020. </p><p>If true, that would be an impressive step up from what we've measured on the three-stack OLED panels we've tested, which tend to settle in the 75% to 77% range.</p><p>While there's no guarantee that future OLED TVs built around this new, two-stack structure will ultimately be cheaper than what we're used to seeing within the entry-level and mid-range class, it's likely a net-positive for the market (and shoppers) for the manufacturing of OLED technology to get more efficient in the long run.</p><h2 id="cheaper-oleds-in-2027-and-beyond">Cheaper OLEDs in 2027 and beyond</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="GWsne6iGdwXHY8nNvFcrMh" name="LG-C6--14" alt="The LG C6 OLED at Future's testing labs in New York." src="https://cdn.mos.cms.futurecdn.net/GWsne6iGdwXHY8nNvFcrMh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" attribution="" endorsement="" class="inline"></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 development of new OLED technology won't immediately crash the price of OLED TVs around the world. But new, more-cost-effective ways of manufacturing this infamously finnicky display tech is essential to its long-term viability.</p><p>Whether we're talking OLED SE, "two-stack" WOLED or something not yet fully realized, these developments are all stops on the road to OLED TVs' becoming less of a luxury for the average person.</p><p>Shared adoption of these new panel types from brands like Samsung, Sony and others is key, too, because the more options people have when buying a new TV, the better (and cheaper) those options are likely to become. Additionally, if LG Display is successful in these endeavors, it could entice TV brands that haven't previously developed OLED TVs to finally take the plunge.</p><div><blockquote><p>If LG Display is successful in these endeavors, it could entice TV brands that haven't previously developed OLED TVs to finally take the plunge.</p></blockquote></div><p>In 2027 and beyond, OLED TVs could see even cheaper pricing, provided these advancements aren't offset by additional supply-chain shortages. </p><p>It's possible that the next major OLED frontier <em>won't</em> be about making these TVs bigger and brighter, but rather, leaner and cheaper.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePaJpW"></div>                            </div>                            <script src="https://kwizly.com/embed/ePaJpW.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/tvs/4k-tvs/rgb-led-vs-tandem-oled-tvs-weve-tested-both-and-here-are-the-differences">RGB LED vs Tandem OLED TVs: We’ve tested both and here are the differences</a></li><li><a href="https://www.tomsguide.com/tvs/we-just-graded-every-tv-brand-on-price-performance-and-more-heres-how-their-report-cards-stack-up">We just graded every TV brand on price, performance and more — here’s how their report cards stack up</a></li><li><a href="https://www.tomsguide.com/tvs/tcl-and-sony-are-joining-forces-to-sell-more-tvs-but-is-that-bad-news-for-shoppers">TCL and Sony are joining forces to sell more TVs — but is that bad news for shoppers?</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tvs/oled-tvs/cheaper-oled-tvs-might-finally-be-on-the-way-heres-when-they-could-arrive</link>
                                                                            <description>
                            <![CDATA[ LG Display has developed two new types of OLED panels aimed to cut manufacturing costs without sacrificing performance. Here's what to know about OLED SE and the new, "two-stack" OLED design. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">vi42A2p4wNFq2D87GzYKAC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/VusmP5N5Xg6B4xnE38CZXh-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 27 Aug 2026 10:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[OLED TVs]]></category>
                                                    <category><![CDATA[TVs]]></category>
                                                                                                <author><![CDATA[ michael.desjardin@futurenet.com (Michael Desjardin) ]]></author>                    <dc:creator><![CDATA[ Michael Desjardin ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/esytxRqW9GNVZNVCf7BFyV-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Michael Desjardin is a Senior Editor for TVs at Tom&#039;s Guide. He&#039;s been testing and tinkering with TVs professionally for over a decade, previously for Reviewed and USA Today. Michael studied media production and screenwriting at Emerson College. He loves cooking, zoning out to ambient music, and getting way too invested in the Red Sox. He considers himself living proof that TV doesn&#039;t necessarily rot your brain.&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/VusmP5N5Xg6B4xnE38CZXh-1920-80.jpg">
                                                            <media:credit><![CDATA[LG]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The LG B4 OLED on a living room wall.]]></media:description>                                                            <media:text><![CDATA[The LG B4 OLED on a living room wall.]]></media:text>
                                <media:title type="plain"><![CDATA[The LG B4 OLED on a living room wall.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/VusmP5N5Xg6B4xnE38CZXh-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>OLED TVs have long since been the darling of A/V aficionados, home theater enthusiasts and TV dorks like myself. While OLEDs aren’t ideal for every viewing environment, the technology is nonetheless capable of performance- and design-related feats that even the top Mini-LED TVs can’t pull off.</p><p>There’s just one problem: OLED TVs don’t come cheap. Even entry-level OLEDs tend to be priced higher than mid-range Mini-LED TVs, and the <a href="https://www.tomsguide.com/tvs/oled-tvs/best-oled-tvs">best OLED TVs</a> are often more expensive than some brands’ best LCD-based sets.</p><p>But there are signs that the status quo could be changing. This year, LG Display is manufacturing cheaper OLED panels for LG and its competitors, and it’s happening at a time where the top OLED-maker is also reportedly developing an even-cheaper panel for the next generation of OLED TVs. Here’s how these advancements could usher in an era of cheap OLEDs.</p><h2 id="lg-display-s-quest-to-make-oled-cheaper-more-efficient-and-longer-lasting">LG Display’s quest to make OLED cheaper, more efficient and longer 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="z8cwLfSQU23Gt58Y7C5R5n" name="LG-B6--11" alt="LG B6 OLED TV on a table" src="https://cdn.mos.cms.futurecdn.net/z8cwLfSQU23Gt58Y7C5R5n-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There are two exciting developments in the realm of affordable OLED technology playing out as we speak. The first spin on OLED technology is already available to buy and it's called OLED SE.</p><p>Announced back in March by <a href="https://news.lgdisplay.com/en/2026/03/from-premium-to-entry-levellg-display-expands-the-oled-tv-market-with-new-sepanels/?ckattempt=2" target="_blank" rel="nofollow">LG Display</a>, OLED SE sits below OLED EX, the latter of which is the panel-type associated with the mid-range <a href="https://www.tomsguide.com/tvs/oled-tvs/lg-c6-oled">LG C6</a>. OLED EX, however, sits below OLED META, the panel-type associated with the flagship-level <a href="https://www.tomsguide.com/tvs/oled-tvs/the-lg-g6-oled-has-a-new-feature-i-desperately-need-and-it-could-be-the-biggest-tv-upgrade-in-years">LG G6</a>. This makes the OLED SE one of the most affordable panel options for any brand looking to sell an OLED TV.</p><p>There’s been speculation among industry insiders that the all-new LG B6E OLED — one of LG’s most-affordable OLED TVs this year — is built around LG Display’s OLED SE panel. We’ve yet to take this model for a test spin in our lab, but there’s no denying its relatively friendly price tag of just $899 for a 55-inch model.</p><div class="product"><a data-dimension112="0b677852-a188-11f1-ae6b-2f2bff7b20f9" data-action="Deal Block" data-label="55" B6E 4K OLED TV" data-dimension48="55" B6E 4K OLED TV" data-dimension25="$899" href="https://www.bestbuy.com/product/lg-55-class-b6e-series-oled-ai-4k-smart-webos-tv-2026/JJ8VPZZ7PZ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><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="2FCFUfHnMLGgUA6cgCxeVF" name="LG-B6E-OLED-TV-16-by-9-deal-block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2FCFUfHnMLGgUA6cgCxeVF-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/product/lg-55-class-b6e-series-oled-ai-4k-smart-webos-tv-2026/JJ8VPZZ7PZ" target="_blank" rel="nofollow" data-dimension112="0b677852-a188-11f1-ae6b-2f2bff7b20f9" data-action="Deal Block" data-label='55" B6E 4K OLED TV' data-dimension48='55" B6E 4K OLED TV' data-dimension25="$899">55" B6E 4K OLED TV: was $1299 now $899</a></strong><br>The LG B6E is a fantastic, entry-level OLED TV for folks who are intrigued by this high-performance display tech, but who'd rather not shell out for a high-end panel. In addition to being one of the most-affordable OLED TVs on shelves in 2026, it also comes with webOS built in and a wide selection of gaming-related features.<a class="view-deal button" href="https://www.bestbuy.com/product/lg-55-class-b6e-series-oled-ai-4k-smart-webos-tv-2026/JJ8VPZZ7PZ" target="_blank" rel="nofollow" data-dimension112="0b677852-a188-11f1-ae6b-2f2bff7b20f9" data-action="Deal Block" data-label="55" B6E 4K OLED TV" data-dimension48="55" B6E 4K OLED TV" data-dimension25="$899">View Deal</a></p></div><p>Earlier this year, rumors began circulating that a <a href="https://www.tomsguide.com/tvs/oled-tvs/is-this-rumored-sony-oled-tv-the-lg-c6-rival-weve-been-waiting-for">new Sony OLED</a> could be on the horizon — a more-affordable set that could compete with entry-level and mid-range OLEDs from Samsung and Sony. At the time, I floated the possibility that this TV could very well leverage LG Display’s OLED SE panel, too.</p><p>Even if we assume that OLED SE panels are present in TVs like the LG B6E (and in entry-level OLEDs from LG’s competitors), $899 for an entry-level model isn’t exactly <em>cheap</em>. Fortunately, it doesn’t seem like LG Display’s work is done.</p><h2 id="what-is-two-stack-oled">What is two-stack OLED?</h2><p>According to Korean newspaper <a href="https://www.etnews.com/20260731000155">ETNews</a> (as reported by <a href="https://www.flatpanelshd.com/news.php?subaction=showfull&id=1785923042">FlatpanelsHD</a>), LG Display is reportedly developing an all-new, “two-stack” WOLED panel for use in TVs and monitors. The design is built around a simplified structure that relies on just two emission layers, while previous WOLED-based designs (like the one found on the LG C6) rely on three layers.</p><div><blockquote><p>The design is built around a simplified structure that relies on just two emission layers.</p></blockquote></div><p>LG Display claims that the new two-stack structure is capable of covering about 82.5% of BT.2020. </p><p>If true, that would be an impressive step up from what we've measured on the three-stack OLED panels we've tested, which tend to settle in the 75% to 77% range.</p><p>While there's no guarantee that future OLED TVs built around this new, two-stack structure will ultimately be cheaper than what we're used to seeing within the entry-level and mid-range class, it's likely a net-positive for the market (and shoppers) for the manufacturing of OLED technology to get more efficient in the long run.</p><h2 id="cheaper-oleds-in-2027-and-beyond">Cheaper OLEDs in 2027 and beyond</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="GWsne6iGdwXHY8nNvFcrMh" name="LG-C6--14" alt="The LG C6 OLED at Future's testing labs in New York." src="https://cdn.mos.cms.futurecdn.net/GWsne6iGdwXHY8nNvFcrMh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" attribution="" endorsement="" class="inline"></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 development of new OLED technology won't immediately crash the price of OLED TVs around the world. But new, more-cost-effective ways of manufacturing this infamously finnicky display tech is essential to its long-term viability.</p><p>Whether we're talking OLED SE, "two-stack" WOLED or something not yet fully realized, these developments are all stops on the road to OLED TVs' becoming less of a luxury for the average person.</p><p>Shared adoption of these new panel types from brands like Samsung, Sony and others is key, too, because the more options people have when buying a new TV, the better (and cheaper) those options are likely to become. Additionally, if LG Display is successful in these endeavors, it could entice TV brands that haven't previously developed OLED TVs to finally take the plunge.</p><div><blockquote><p>If LG Display is successful in these endeavors, it could entice TV brands that haven't previously developed OLED TVs to finally take the plunge.</p></blockquote></div><p>In 2027 and beyond, OLED TVs could see even cheaper pricing, provided these advancements aren't offset by additional supply-chain shortages. </p><p>It's possible that the next major OLED frontier <em>won't</em> be about making these TVs bigger and brighter, but rather, leaner and cheaper.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePaJpW"></div>                            </div>                            <script src="https://kwizly.com/embed/ePaJpW.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/tvs/4k-tvs/rgb-led-vs-tandem-oled-tvs-weve-tested-both-and-here-are-the-differences">RGB LED vs Tandem OLED TVs: We’ve tested both and here are the differences</a></li><li><a href="https://www.tomsguide.com/tvs/we-just-graded-every-tv-brand-on-price-performance-and-more-heres-how-their-report-cards-stack-up">We just graded every TV brand on price, performance and more — here’s how their report cards stack up</a></li><li><a href="https://www.tomsguide.com/tvs/tcl-and-sony-are-joining-forces-to-sell-more-tvs-but-is-that-bad-news-for-shoppers">TCL and Sony are joining forces to sell more TVs — but is that bad news for shoppers?</a></li></ul>
                                                            </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 been training with the Galaxy Watch 9 for a month — 3 things I like (and 3 I don't) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Samsung Galaxy Watch 9 was unveiled at the <a href="https://www.tomsguide.com/news/live/samsung-galaxy-unpacked-2026-live">Galaxy Unpacked</a> event alongside the <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Galaxy Watch Ultra 2</a>.</p><p>To read the full lowdown on what you can do with the latest Galaxy Watch model, my wearables expert colleague <a href="https://www.tomsguide.com/author/dan-bracaglia">Dan Bracaglia</a> discusses the <a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9">5 things you need to know about the Galaxy Watch 9</a> in more detail. However, as a trainer and fitness editor, I'm more concerned about whether it's the type of watch I want strapped to my wrist during workouts. </p><p>Recently, I attended BXR to get first-hand experience with the watch on behalf of Samsung; we hit the treadmills, did some strength training and even stretched it out in a 20-minute yoga class. But for me, that wasn't enough. Thankfully, I got to spend more time with the model, training at home, in the gym and in my yoga classes, to really see what it's about. </p><p>Here are three things I like so far, and three that I'm really not a fan of if you're looking to purchase one of the <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">best smartwatches</a> in 2026.</p><div class="product"><a data-dimension112="ade90f98-9cd1-11f1-a314-f7a6b93fb3ee" data-action="Deal Block" data-label="Galaxy Watch 9" data-dimension48="Galaxy Watch 9" data-dimension25="£379.99" href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-40mm-graphite-bluetooth-sku-sm-l340nzkaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1148px;"><p class="vanilla-image-block" style="padding-top:116.72%;"><img id="tEF32W52wJvZ9enzPgBxfB" name="Galaxy Watch 9 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tEF32W52wJvZ9enzPgBxfB-1920-80.jpg" mos="" align="middle" fullscreen="" width="1148" height="1340" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Galaxy Watch 9 offers better battery life and a wealth of health and fitness tracking capabilities that aren't all locked behind a paywall. <a class="view-deal button" href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-40mm-graphite-bluetooth-sku-sm-l340nzkaxaa/" target="_blank" rel="nofollow" data-dimension112="ade90f98-9cd1-11f1-a314-f7a6b93fb3ee" data-action="Deal Block" data-label="Galaxy Watch 9" data-dimension48="Galaxy Watch 9" data-dimension25="£379.99">View Deal</a></p></div><h3 class="article-body__section" id="section-like-1-aesthetics"><span>Like 1: Aesthetics</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:5322px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="ryz4WsgNuzbFG2wC9R8VKk" name="GalaxyWatch9-03" alt="Close-up of the Samsung Galaxy Watch 9 in white" src="https://cdn.mos.cms.futurecdn.net/ryz4WsgNuzbFG2wC9R8VKk-1920-80.jpg" mos="" align="middle" fullscreen="" width="5322" height="2994" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Retailing at $379 for 40mm (no LTE, which is $50 extra) or $409 for 44mm (no LTE) compared to $349 for the Galaxy Watch 8, the 9 is no doubt a good-looking smartwatch-fitness tracker with a premium price tag. </p><p>I like how easy it is to set up and pair with the <a href="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">Samsung Galaxy Z Flip 8</a>, and the sleek sports strap and screen design are right up my alley; I don't like having garish fitness trackers or fussy smartwatches on my wrist, especially when lifting weights. 40mm is available in Cream or Graphite; 44mm comes in Graphite or Silver.</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/DbK_qq0gAGV/" target="_blank">A post shared by Tom's Guide Fitness (@tomsguidefitness)</a></p><p>A photo posted by </p></blockquote></div><p>We'll get on to size (one of my dislikes) below, but in terms of design, you get pretty much the same aesthetics, screen brightness and size options as the 8. However, the 9 boasts a faster processor and up to 20% better battery life. You can also customize your sports bands with various color options, too.</p><p>I highly recommend leaving the always-on option enabled so you can glance during workouts. I didn't do this at first and it caused me some very high cortisol levels and extra faff.</p><p>But let's focus on the real MVP: new health and fitness tracking tools. </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/DcN39S0IeBU/" target="_blank">A post shared by Tom's Guide Fitness (@tomsguidefitness)</a></p><p>A photo posted by </p></blockquote></div><h3 class="article-body__section" id="section-like-2-swipeable-health-features-upgraded"><span>Like 2: Swipeable health features upgraded</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:4996px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="qkNNwr3UPRR6b8yK94DdDk" name="GalaxyWatch9-01" alt="Close-up of the Samsung Galaxy Watch 9 on a user's wrist against a blue background" src="https://cdn.mos.cms.futurecdn.net/qkNNwr3UPRR6b8yK94DdDk-1920-80.jpg" mos="" align="middle" fullscreen="" width="4996" height="2810" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Samsung Health offers a wealth of fitness and health tracking and insights, without locking it all behind a paywall. There are plenty of sports and activities to choose from, and an array of sensors means you can pick up pretty detailed data.</p><p>Some of the latest upgrades include a <strong>Vitals dashboard </strong>with metrics for heart rate, HRV, sp02, body temperature, breathing, and <strong>Heart Health Score.</strong> Alongside this, you get fitness features such as <strong>Cardio Load</strong> and <strong>Fitness Index</strong> (a score out of 100 based on activity levels, VO2 max, recovery time and more).</p><p>The idea is to be preventative, which means more of a holistic focus on wellbeing and useful insights. The Vitals dashboard features one easy-to-view panel with information on heart rate, blood pressure and ECG. It's handy to swipe left and right to catch a quick glance while on the go. You can also swipe to use quick features such as <strong>Running Coach, Body Composition and Sleep. </strong></p><p>By swiping twice to my left, I could quickly access the <strong>Fitness</strong> section, where I could select from a list of activities or add my own via my Samsung Galaxy phone or on the watch itself. You can set up your watch to suit your preferences, but note that you'll need to sleep with it on to access some of the longer-term trends and vitals, particularly sleep, of course.</p><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="o3hRCLxa7rk5VKMhfRf2Wa" name="samsung galaxy watch vs coros 2" alt="Samsung Galaxy Watch 9 on user wrist during treadmill workout" src="https://cdn.mos.cms.futurecdn.net/o3hRCLxa7rk5VKMhfRf2Wa-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: Future)</span></figcaption></figure><p>I’ve worn the<a href="https://www.tomsguide.com/wellness/smartwatches/coros-pace-4-review"> Coros Pace 4 </a>alongside the Samsung Galaxy Watch 9 on several occasions. Not because it's a totally fair comparison, but if I'm exploring what I like and don't like about a watch during exercise, I'm doing it with my favorite one on my wrist, too. </p><p>The Coros Pace 4 has proved reliable for workouts for me and my colleague <a href="https://www.tomsguide.com/author/nick-harris-fry">Nick Harris-Fry</a>, who runs regularly wearing it alongside other wearables because of dual-band GPS tracking and top sports features.</p><p>Throughout testing, the Galaxy Watch 9 has been fairly consistent with my trusty Coros Pace 4, though the Watch 9 tends to track more time spent in heart rate zones 1, 2, and 3 during my running efforts than the Pace 4. The Watch 9 also tends to overestimate calorie burn, but I don't pay too much attention to <a href="https://www.tomsguide.com/wellness/workouts/we-asked-toms-guide-readers-which-fitness-tracking-metrics-do-you-trust-the-least-heres-the-surprising-answer">calorie burn on fitness trackers</a> anyway, as so many variables impact how many active calories you can burn.</p><p>That aside, distances and paces have been around the same, and the Galaxy Watch 9 is intuitive at picking up workouts through auto-detection. And it's useful to remember that the Pace 4 is a sports watch, after all, not a smart one, so those who are most likely to purchase this smartwatch-come-fitness tracker will be looking at a lot more than just workouts.</p><h3 class="article-body__section" id="section-like-3-auto-activity-detection"><span>Like 3: Auto activity detection</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1440px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Um6SwSAjctWztR46p2WpVa" name="samsung galaxy v coros" alt="Samsung Galaxy Watch 9 on user wrist during treadmill workout" src="https://cdn.mos.cms.futurecdn.net/Um6SwSAjctWztR46p2WpVa-1920-80.jpg" mos="" align="middle" fullscreen="" width="1440" height="810" attribution="" endorsement="" 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 Watch 9 can automatically track exercises, including walking, running, cycling, swimming, rowing, and elliptical, using its BioActive Sensor and accelerometer. That means you don't need to rely on manually starting some activities, which I found really handy.</p><p>The watch automatically picked up when I walked and paused when it detected I was stationary. I found this to be pretty accurate for time and distance, and it's good to know that this data feeds into my overall activity levels, trends and insights. I'd like this feature to roll out across more activities, but it's great that the basics are there.</p><p>I could view duration, pace, distance and time of day at a glance, and I found the watch particularly good for tracking running data. That said, if you take your running seriously, you'd be looking more at the <a href="https://www.tomsguide.com/wellness/smartwatches/i-tested-19-running-watches-in-2025-these-are-the-2-that-id-actually-buy">best running watch</a> anyway. </p><h3 class="article-body__section" id="section-dislike-1-hard-to-use-on-the-go"><span>Dislike 1: Hard to use on the go</span></h3><p>I recently became emotionally dependent on my Coros Pace 4 sports watch, which is easy to wear, tight-fitting, rugged, very easy to use on the go and tracks everything I need during exercise. It also has excellent battery life without overwhelming me. </p><p>While this is not a head-to-head comparison, using both watches has given me a strong sense of what works and doesn't work for me personally during exercise.</p><p>I've worn both watches for yoga, Pilates, strength training and running, and I find the Galaxy Watch 9 "faffy" to use. The screen is extremely sensitive (but yes, it is fast), and I find it hard to navigate the tiles and swipe left-to-right quickly while running and walking.</p><p>I'm a button girlie, and while the swipeable screen is handy, I will always prefer navigating settings primarily with buttons. There are two on the watch on the right side, but I couldn't use them as much as I wanted to.</p><p>I'm also not a fan of overcomplicated screens and having to swipe this way and that to see a handful of the metrics I find most important. I recommend spending some time setting up your Galaxy Watch 9 by configuring the layout and features you need most, plus choosing a clean watch face via the Galaxy Wearable app, if you're a bit like me with tech overwhelm.</p><p>You'll also need to go into the Samsung Health app to enable various health and fitness tracking features, which aren't automatically set up; be warned, there are many, and it takes a little time. </p><h3 class="article-body__section" id="section-dislike-2-sizing"><span>Dislike 2: Sizing</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="eFPf6iF8xmwkUeBk8Z7uTa" name="samsung galaxy watch vs coros 3" alt="Samsung Galaxy Watch 9 on user wrist during treadmill workout" src="https://cdn.mos.cms.futurecdn.net/eFPf6iF8xmwkUeBk8Z7uTa-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: Future)</span></figcaption></figure><p>As a female with small wrists, I have this issue with sports and smartwatches all the time. It's one of the areas where my colleague Jane McGuire says<a href="https://www.tomsguide.com/wellness/fitness-trackers/ive-been-writing-about-fitness-trackers-for-a-decade-10-years-later-they-are-still-falling-short-for-women"> fitness trackers still fall short for women.  </a></p><p>I don't need bulk on my wrists when I lift weights or run; it is distracting and creates more weight and fuss when I'm trying to position weights along my forearms for exercises like front rack squats or cleans.  </p><p>For me, the Galaxy Watch 9 feels heavy, even with the aluminum casing, which is supposed to help make the watch lightweight. I was given a M/L wrist strap, so I highly recommend picking a S/M strap if you have small wrists like mine, as the watch slid around even on the tightest strap setting.</p><p>For those who get sweaty during workouts, I'd also consider the fabric band instead of the sports band that came with my watch.</p><p>While I do like how the watch looks and I enjoy the understated design, I'm not a fan of the sizing overall, even for the smaller 40mm model. I still think brands need to think more about their female customers when designing smartwatches and sports watches in general.</p><p>For that reason, I wouldn't want to wear this watch to bed. But that said, I generally don't like having anything on my wrist at night and rely on my <a href="https://www.tomsguide.com/wellness/smart-rings/ive-worn-the-oura-ring-5-for-six-weeks-here-are-3-things-i-love-and-2-things-i-wish-i-could-change">Oura Ring 5</a> to track sleep instead. If this is a problem for you, note that some features rely on you sleeping in your watch.</p><h3 class="article-body__section" id="section-dislike-3-battery-life"><span>Dislike 3: Battery life</span></h3><p>Both the 40mm and 44mm Samsung Galaxy Watch 9 models feature modest battery capacity increases. For the smaller model, that's a jump from 325 mAh for the Galaxy Watch 8 to 390 mAh for the Galaxy Watch 9. For the bigger model, the capacity has increased from 435 mAh on the Galaxy Watch 8 to 445 mAh for the Galaxy Watch 9.</p><p>This, coupled with up to 15% more efficient processing,<em> should </em>mean that the Galaxy Watch 9 lasts longer than the average of roughly 30 hours per charge (for the 8) with the always-on enabled.</p><p>I'd say I'm very active, and mine has lasted roughly 24 hours on a charge. Compare that with watches like the <a href="https://www.tomsguide.com/wellness/smartwatches/i-just-tried-the-new-google-pixel-watch-5-and-its-new-health-and-safety-features-blow-the-apple-watch-out-of-the-water">Pixel Watch 5,</a> which should last around two days, and the <a href="https://www.tomsguide.com/wellness/smartwatches/coros-pace-4-review">Coros Pace 4</a>, which I usually wear and can last me about a week, and the battery life could be better. </p><p>I'm a little disappointed, as battery life is one of the features most celebrated with the Galaxy Watch 9. if I were taking it away on a trip, I'd need to charge it every day, though it does charge quickly when you do juice it up.</p><h2 id="verdict">Verdict</h2><p>For me, the Samsung Galaxy Watch 9 looks great, is fast, offers a wealth of health and fitness features and pretty accurate tracking across the activities I tested, but would I switch out other trusty watches in favor of it for exercise alone? No, I wouldn't. </p><p>That said, I will be spending some more time wearing it, and I plan to update you here with more long-term feedback. </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/wellness/smartwatches/google-exclusive-how-the-pixel-watch-3-got-a-life-saving-feature-the-apple-watch-cant-match"><strong>Exclusive: Garmin Cirqa PM says ‘it just felt like we had all of the pieces in place’ to launch a screen-free fitness tracker</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/fitness/an-iphone-moment-for-your-eyes-why-xpanceo-is-betting-big-on-smart-contact-lenses-as-the-future-of-ar"><strong>An ‘iPhone moment’ for your eyes — why Xpanceo is betting big on smart contact lenses as the future of AR</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/fitness-trackers/exclusive-google-design-director-says-fitbit-air-reception-proves-they-made-the-right-decision-going-screen-free"><strong>Exclusive: Google design director says Fitbit Air reception proves they 'made the right decision' going screen-free</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>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</link>
                                                                            <description>
                            <![CDATA[ We've been training with the Galaxy Watch 9, and there are some features we like and dislike so far. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">NT6f8Q8DoFuk7EciGQX2r4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/9VYZkwkFKGrzUBK9zzEc3k-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 21 Aug 2026 08:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Fitness]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ sam.hopes@futurenet.com (Sam Hopes) ]]></author>                    <dc:creator><![CDATA[ Sam Hopes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jZ88qJqvjWaCXXv3qvUQPA-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Sam Hopes is a level 3 qualified trainer, a level 2 Reiki practitioner and a fitness editor at Tom&#039;s Guide. She is also currently undertaking her Yoga For Athletes training course. Sam has written for various fitness brands and websites over the years and has experience across brands at Future, such as &lt;a href=&quot;https://www.livescience.com/author/sam-hopes&quot;&gt;Live Science&lt;/a&gt;,&lt;a href=&quot;https://www.fitandwell.com/author/sam-hopes&quot;&gt; Fit&amp;amp;Well&lt;/a&gt;,&lt;a href=&quot;https://www.coachweb.com/author/sam-hopes&quot;&gt; Coach&lt;/a&gt;, and T3. &lt;/p&gt;&lt;p&gt;Having worked with fitness studios like F45 and Virgin Active and trained both group and 1:1, Sam now primarily teaches outdoor bootcamps, bodyweight, and kettlebells. She also coaches mobility and flexibility classes several times a week and believes that true strength comes from a holistic approach to training your body. &lt;/p&gt;&lt;p&gt;Sam has completed two mixed doubles Hyrox competitions in London and the Netherlands and finished her first doubles attempt in 1:11.&lt;/p&gt;&lt;p&gt;In her spare time, she enjoys CrossFit, hot yoga, Pilates and running and can be found perfecting her handstand walks and handstand push-ups in the gym whenever she has the chance to be upside down. At work, she can be found testing the latest in fitness technology and wearables, anything yoga and CrossFit-related and has a keen interest in nutrition, mindfulness, sleep and recovery.&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/9VYZkwkFKGrzUBK9zzEc3k-1920-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Samsung Galaxy Watch 9 in white]]></media:description>                                                            <media:text><![CDATA[Close-up of the Samsung Galaxy Watch 9 in white]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Samsung Galaxy Watch 9 in white]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/9VYZkwkFKGrzUBK9zzEc3k-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Samsung Galaxy Watch 9 was unveiled at the <a href="https://www.tomsguide.com/news/live/samsung-galaxy-unpacked-2026-live">Galaxy Unpacked</a> event alongside the <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Galaxy Watch Ultra 2</a>.</p><p>To read the full lowdown on what you can do with the latest Galaxy Watch model, my wearables expert colleague <a href="https://www.tomsguide.com/author/dan-bracaglia">Dan Bracaglia</a> discusses the <a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9">5 things you need to know about the Galaxy Watch 9</a> in more detail. However, as a trainer and fitness editor, I'm more concerned about whether it's the type of watch I want strapped to my wrist during workouts. </p><p>Recently, I attended BXR to get first-hand experience with the watch on behalf of Samsung; we hit the treadmills, did some strength training and even stretched it out in a 20-minute yoga class. But for me, that wasn't enough. Thankfully, I got to spend more time with the model, training at home, in the gym and in my yoga classes, to really see what it's about. </p><p>Here are three things I like so far, and three that I'm really not a fan of if you're looking to purchase one of the <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">best smartwatches</a> in 2026.</p><div class="product"><a data-dimension112="ade90f98-9cd1-11f1-a314-f7a6b93fb3ee" data-action="Deal Block" data-label="Galaxy Watch 9" data-dimension48="Galaxy Watch 9" data-dimension25="£379.99" href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-40mm-graphite-bluetooth-sku-sm-l340nzkaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1148px;"><p class="vanilla-image-block" style="padding-top:116.72%;"><img id="tEF32W52wJvZ9enzPgBxfB" name="Galaxy Watch 9 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tEF32W52wJvZ9enzPgBxfB-1920-80.jpg" mos="" align="middle" fullscreen="" width="1148" height="1340" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Galaxy Watch 9 offers better battery life and a wealth of health and fitness tracking capabilities that aren't all locked behind a paywall. <a class="view-deal button" href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-40mm-graphite-bluetooth-sku-sm-l340nzkaxaa/" target="_blank" rel="nofollow" data-dimension112="ade90f98-9cd1-11f1-a314-f7a6b93fb3ee" data-action="Deal Block" data-label="Galaxy Watch 9" data-dimension48="Galaxy Watch 9" data-dimension25="£379.99">View Deal</a></p></div><h3 class="article-body__section" id="section-like-1-aesthetics"><span>Like 1: Aesthetics</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:5322px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="ryz4WsgNuzbFG2wC9R8VKk" name="GalaxyWatch9-03" alt="Close-up of the Samsung Galaxy Watch 9 in white" src="https://cdn.mos.cms.futurecdn.net/ryz4WsgNuzbFG2wC9R8VKk-1920-80.jpg" mos="" align="middle" fullscreen="" width="5322" height="2994" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Retailing at $379 for 40mm (no LTE, which is $50 extra) or $409 for 44mm (no LTE) compared to $349 for the Galaxy Watch 8, the 9 is no doubt a good-looking smartwatch-fitness tracker with a premium price tag. </p><p>I like how easy it is to set up and pair with the <a href="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">Samsung Galaxy Z Flip 8</a>, and the sleek sports strap and screen design are right up my alley; I don't like having garish fitness trackers or fussy smartwatches on my wrist, especially when lifting weights. 40mm is available in Cream or Graphite; 44mm comes in Graphite or Silver.</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/DbK_qq0gAGV/" target="_blank">A post shared by Tom's Guide Fitness (@tomsguidefitness)</a></p><p>A photo posted by </p></blockquote></div><p>We'll get on to size (one of my dislikes) below, but in terms of design, you get pretty much the same aesthetics, screen brightness and size options as the 8. However, the 9 boasts a faster processor and up to 20% better battery life. You can also customize your sports bands with various color options, too.</p><p>I highly recommend leaving the always-on option enabled so you can glance during workouts. I didn't do this at first and it caused me some very high cortisol levels and extra faff.</p><p>But let's focus on the real MVP: new health and fitness tracking tools. </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/DcN39S0IeBU/" target="_blank">A post shared by Tom's Guide Fitness (@tomsguidefitness)</a></p><p>A photo posted by </p></blockquote></div><h3 class="article-body__section" id="section-like-2-swipeable-health-features-upgraded"><span>Like 2: Swipeable health features upgraded</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:4996px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="qkNNwr3UPRR6b8yK94DdDk" name="GalaxyWatch9-01" alt="Close-up of the Samsung Galaxy Watch 9 on a user's wrist against a blue background" src="https://cdn.mos.cms.futurecdn.net/qkNNwr3UPRR6b8yK94DdDk-1920-80.jpg" mos="" align="middle" fullscreen="" width="4996" height="2810" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Samsung Health offers a wealth of fitness and health tracking and insights, without locking it all behind a paywall. There are plenty of sports and activities to choose from, and an array of sensors means you can pick up pretty detailed data.</p><p>Some of the latest upgrades include a <strong>Vitals dashboard </strong>with metrics for heart rate, HRV, sp02, body temperature, breathing, and <strong>Heart Health Score.</strong> Alongside this, you get fitness features such as <strong>Cardio Load</strong> and <strong>Fitness Index</strong> (a score out of 100 based on activity levels, VO2 max, recovery time and more).</p><p>The idea is to be preventative, which means more of a holistic focus on wellbeing and useful insights. The Vitals dashboard features one easy-to-view panel with information on heart rate, blood pressure and ECG. It's handy to swipe left and right to catch a quick glance while on the go. You can also swipe to use quick features such as <strong>Running Coach, Body Composition and Sleep. </strong></p><p>By swiping twice to my left, I could quickly access the <strong>Fitness</strong> section, where I could select from a list of activities or add my own via my Samsung Galaxy phone or on the watch itself. You can set up your watch to suit your preferences, but note that you'll need to sleep with it on to access some of the longer-term trends and vitals, particularly sleep, of course.</p><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="o3hRCLxa7rk5VKMhfRf2Wa" name="samsung galaxy watch vs coros 2" alt="Samsung Galaxy Watch 9 on user wrist during treadmill workout" src="https://cdn.mos.cms.futurecdn.net/o3hRCLxa7rk5VKMhfRf2Wa-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: Future)</span></figcaption></figure><p>I’ve worn the<a href="https://www.tomsguide.com/wellness/smartwatches/coros-pace-4-review"> Coros Pace 4 </a>alongside the Samsung Galaxy Watch 9 on several occasions. Not because it's a totally fair comparison, but if I'm exploring what I like and don't like about a watch during exercise, I'm doing it with my favorite one on my wrist, too. </p><p>The Coros Pace 4 has proved reliable for workouts for me and my colleague <a href="https://www.tomsguide.com/author/nick-harris-fry">Nick Harris-Fry</a>, who runs regularly wearing it alongside other wearables because of dual-band GPS tracking and top sports features.</p><p>Throughout testing, the Galaxy Watch 9 has been fairly consistent with my trusty Coros Pace 4, though the Watch 9 tends to track more time spent in heart rate zones 1, 2, and 3 during my running efforts than the Pace 4. The Watch 9 also tends to overestimate calorie burn, but I don't pay too much attention to <a href="https://www.tomsguide.com/wellness/workouts/we-asked-toms-guide-readers-which-fitness-tracking-metrics-do-you-trust-the-least-heres-the-surprising-answer">calorie burn on fitness trackers</a> anyway, as so many variables impact how many active calories you can burn.</p><p>That aside, distances and paces have been around the same, and the Galaxy Watch 9 is intuitive at picking up workouts through auto-detection. And it's useful to remember that the Pace 4 is a sports watch, after all, not a smart one, so those who are most likely to purchase this smartwatch-come-fitness tracker will be looking at a lot more than just workouts.</p><h3 class="article-body__section" id="section-like-3-auto-activity-detection"><span>Like 3: Auto activity detection</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1440px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Um6SwSAjctWztR46p2WpVa" name="samsung galaxy v coros" alt="Samsung Galaxy Watch 9 on user wrist during treadmill workout" src="https://cdn.mos.cms.futurecdn.net/Um6SwSAjctWztR46p2WpVa-1920-80.jpg" mos="" align="middle" fullscreen="" width="1440" height="810" attribution="" endorsement="" 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 Watch 9 can automatically track exercises, including walking, running, cycling, swimming, rowing, and elliptical, using its BioActive Sensor and accelerometer. That means you don't need to rely on manually starting some activities, which I found really handy.</p><p>The watch automatically picked up when I walked and paused when it detected I was stationary. I found this to be pretty accurate for time and distance, and it's good to know that this data feeds into my overall activity levels, trends and insights. I'd like this feature to roll out across more activities, but it's great that the basics are there.</p><p>I could view duration, pace, distance and time of day at a glance, and I found the watch particularly good for tracking running data. That said, if you take your running seriously, you'd be looking more at the <a href="https://www.tomsguide.com/wellness/smartwatches/i-tested-19-running-watches-in-2025-these-are-the-2-that-id-actually-buy">best running watch</a> anyway. </p><h3 class="article-body__section" id="section-dislike-1-hard-to-use-on-the-go"><span>Dislike 1: Hard to use on the go</span></h3><p>I recently became emotionally dependent on my Coros Pace 4 sports watch, which is easy to wear, tight-fitting, rugged, very easy to use on the go and tracks everything I need during exercise. It also has excellent battery life without overwhelming me. </p><p>While this is not a head-to-head comparison, using both watches has given me a strong sense of what works and doesn't work for me personally during exercise.</p><p>I've worn both watches for yoga, Pilates, strength training and running, and I find the Galaxy Watch 9 "faffy" to use. The screen is extremely sensitive (but yes, it is fast), and I find it hard to navigate the tiles and swipe left-to-right quickly while running and walking.</p><p>I'm a button girlie, and while the swipeable screen is handy, I will always prefer navigating settings primarily with buttons. There are two on the watch on the right side, but I couldn't use them as much as I wanted to.</p><p>I'm also not a fan of overcomplicated screens and having to swipe this way and that to see a handful of the metrics I find most important. I recommend spending some time setting up your Galaxy Watch 9 by configuring the layout and features you need most, plus choosing a clean watch face via the Galaxy Wearable app, if you're a bit like me with tech overwhelm.</p><p>You'll also need to go into the Samsung Health app to enable various health and fitness tracking features, which aren't automatically set up; be warned, there are many, and it takes a little time. </p><h3 class="article-body__section" id="section-dislike-2-sizing"><span>Dislike 2: Sizing</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="eFPf6iF8xmwkUeBk8Z7uTa" name="samsung galaxy watch vs coros 3" alt="Samsung Galaxy Watch 9 on user wrist during treadmill workout" src="https://cdn.mos.cms.futurecdn.net/eFPf6iF8xmwkUeBk8Z7uTa-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: Future)</span></figcaption></figure><p>As a female with small wrists, I have this issue with sports and smartwatches all the time. It's one of the areas where my colleague Jane McGuire says<a href="https://www.tomsguide.com/wellness/fitness-trackers/ive-been-writing-about-fitness-trackers-for-a-decade-10-years-later-they-are-still-falling-short-for-women"> fitness trackers still fall short for women.  </a></p><p>I don't need bulk on my wrists when I lift weights or run; it is distracting and creates more weight and fuss when I'm trying to position weights along my forearms for exercises like front rack squats or cleans.  </p><p>For me, the Galaxy Watch 9 feels heavy, even with the aluminum casing, which is supposed to help make the watch lightweight. I was given a M/L wrist strap, so I highly recommend picking a S/M strap if you have small wrists like mine, as the watch slid around even on the tightest strap setting.</p><p>For those who get sweaty during workouts, I'd also consider the fabric band instead of the sports band that came with my watch.</p><p>While I do like how the watch looks and I enjoy the understated design, I'm not a fan of the sizing overall, even for the smaller 40mm model. I still think brands need to think more about their female customers when designing smartwatches and sports watches in general.</p><p>For that reason, I wouldn't want to wear this watch to bed. But that said, I generally don't like having anything on my wrist at night and rely on my <a href="https://www.tomsguide.com/wellness/smart-rings/ive-worn-the-oura-ring-5-for-six-weeks-here-are-3-things-i-love-and-2-things-i-wish-i-could-change">Oura Ring 5</a> to track sleep instead. If this is a problem for you, note that some features rely on you sleeping in your watch.</p><h3 class="article-body__section" id="section-dislike-3-battery-life"><span>Dislike 3: Battery life</span></h3><p>Both the 40mm and 44mm Samsung Galaxy Watch 9 models feature modest battery capacity increases. For the smaller model, that's a jump from 325 mAh for the Galaxy Watch 8 to 390 mAh for the Galaxy Watch 9. For the bigger model, the capacity has increased from 435 mAh on the Galaxy Watch 8 to 445 mAh for the Galaxy Watch 9.</p><p>This, coupled with up to 15% more efficient processing,<em> should </em>mean that the Galaxy Watch 9 lasts longer than the average of roughly 30 hours per charge (for the 8) with the always-on enabled.</p><p>I'd say I'm very active, and mine has lasted roughly 24 hours on a charge. Compare that with watches like the <a href="https://www.tomsguide.com/wellness/smartwatches/i-just-tried-the-new-google-pixel-watch-5-and-its-new-health-and-safety-features-blow-the-apple-watch-out-of-the-water">Pixel Watch 5,</a> which should last around two days, and the <a href="https://www.tomsguide.com/wellness/smartwatches/coros-pace-4-review">Coros Pace 4</a>, which I usually wear and can last me about a week, and the battery life could be better. </p><p>I'm a little disappointed, as battery life is one of the features most celebrated with the Galaxy Watch 9. if I were taking it away on a trip, I'd need to charge it every day, though it does charge quickly when you do juice it up.</p><h2 id="verdict">Verdict</h2><p>For me, the Samsung Galaxy Watch 9 looks great, is fast, offers a wealth of health and fitness features and pretty accurate tracking across the activities I tested, but would I switch out other trusty watches in favor of it for exercise alone? No, I wouldn't. </p><p>That said, I will be spending some more time wearing it, and I plan to update you here with more long-term feedback. </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/wellness/smartwatches/google-exclusive-how-the-pixel-watch-3-got-a-life-saving-feature-the-apple-watch-cant-match"><strong>Exclusive: Garmin Cirqa PM says ‘it just felt like we had all of the pieces in place’ to launch a screen-free fitness tracker</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/fitness/an-iphone-moment-for-your-eyes-why-xpanceo-is-betting-big-on-smart-contact-lenses-as-the-future-of-ar"><strong>An ‘iPhone moment’ for your eyes — why Xpanceo is betting big on smart contact lenses as the future of AR</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/fitness-trackers/exclusive-google-design-director-says-fitbit-air-reception-proves-they-made-the-right-decision-going-screen-free"><strong>Exclusive: Google design director says Fitbit Air reception proves they 'made the right decision' going screen-free</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The 5 accessories that transformed my iPhone 17 Pro Max for under $50 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Buying a new <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a> is only part of the equation. The shiny new device can do a lot once it's finally out of the box and in your hands, but it doesn't change the fact that your experience can still be improved with a few add-ons.</p><p>There are countless accessories out there that you can buy to enhance the entire iPhone experience — whether you're picking up an <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-review">iPhone 17,</a> the larger 17 Pro Max or waiting for the foldable<a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone"> iPhone Ultra</a>. The prospect of spending even more money after dropping at least $1,200 on a brand new phone may not sounds appealing, but trust me, you will be much happier than without — and you don't need to spend a fortune on them either.</p><p>Here are 5 accessories that helped improve my iPhone 17 Pro Max that all cost less than $50.</p><h2 id="easy-application-screen-protector">Easy-application screen protector</h2><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="GLWZ2fbTEvnheGqKQMmxME" name="PXL_20250117_180136252" alt="LK screen protector easy application tool" src="https://cdn.mos.cms.futurecdn.net/GLWZ2fbTEvnheGqKQMmxME-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>I used to hate applying screen protectors to my phone, because the whole process was so finicky and I'd inevitably get something wrong. I'd always end up with dust or bubbles under the screen, or screw up the alignment so much that I needed a fresh protector. </p><p>And these were the days when screens weren't nearly as durable as they are today. But even with the stronger display glass of the modern day smartphone, screens are still vulnerable to scratches and more serious kinds of damage. The good news is that screen protectors <a href="https://www.amazon.com/TOCOL-iPhone-Pro-Max-Installation/dp/B0FDKJDFGZ/" target="_blank" rel="nofollow">have adapted</a>, and the process of applying them is <a href="https://www.tomsguide.com/phones/i-found-the-perfect-stress-free-way-to-put-a-screen-protector-on-my-phone-heres-how">easier than ever and almost completely pain-free.</a></p><div class="product"><a data-dimension112="83d74b54-97f2-11f1-9976-55a8267720d9" data-action="Deal Block" data-label="Easy Instalaltion Screen Proptector for iPhone 17 Pro Max" data-dimension48="Easy Instalaltion Screen Proptector for iPhone 17 Pro Max" data-dimension25="$9" href="https://www.amazon.com/TOCOL-iPhone-Pro-Max-Installation/dp/B0FDKJDFGZ/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:99.60%;"><img id="AoqwoTPKQAwb77VR8u8aZH" name="Easy Instalaltion Screen Proptector for iPhone 17 Pro Max" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AoqwoTPKQAwb77VR8u8aZH-1920-80.png" mos="" align="middle" fullscreen="" width="1500" height="1494" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/TOCOL-iPhone-Pro-Max-Installation/dp/B0FDKJDFGZ/" target="_blank" rel="nofollow" data-dimension112="83d74b54-97f2-11f1-9976-55a8267720d9" data-action="Deal Block" data-label="Easy Instalaltion Screen Proptector for iPhone 17 Pro Max" data-dimension48="Easy Instalaltion Screen Proptector for iPhone 17 Pro Max" data-dimension25="$9">Easy Instalaltion Screen Proptector for iPhone 17 Pro Max: was $11 now $9</a></strong><br>Applying screen protectors is easier than ever thanks to this handy applicator. Simply place one of the screen protectors in the plastic tool, put it on top of your (hopefully clean) phone screen, and pull the tab. Then sit back and watch as the protector sticks to your phone screen without letting stray particles get in the way.</p><p>Just don't forget to push the bubbles out.<a class="view-deal button" href="https://www.amazon.com/TOCOL-iPhone-Pro-Max-Installation/dp/B0FDKJDFGZ/" target="_blank" rel="nofollow" data-dimension112="83d74b54-97f2-11f1-9976-55a8267720d9" data-action="Deal Block" data-label="Easy Instalaltion Screen Proptector for iPhone 17 Pro Max" data-dimension48="Easy Instalaltion Screen Proptector for iPhone 17 Pro Max" data-dimension25="$9">View Deal</a></p></div><p>Most screen protectors now come with some kind of application tool, but my personal favorites employ a pull-tab. Not only does this ensure perfect alignment with your phone, the fact that the sticky underside of the protector is only exposed to the air for a split-second minimizes the risk of foreign particles getting between it and the screen.</p><p>Just remember to clean the screen correctly first. Nothing can account for the fact you left smudges and dust all over your screen before applying the protective layer</p><p>While you're at it, make sure to pick up a case for your phone. The iPhone 17 Pro Max is notorious for taking taking damage, as <a href="https://www.tomsguide.com/phones/iphones/i-knew-better-than-to-carry-around-a-naked-phone-then-my-iphone-17-pro-max-met-the-asphalt">I found out first hand not too long ago</a>.</p><h2 id="magsafe-popsocket">MagSafe PopSocket</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2664px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="pZWsPv54MBdN98C9ivSD8e" name="PXL_20260306_163802776" alt="popsocket with magsafe on an iPhone 17 Pro" src="https://cdn.mos.cms.futurecdn.net/pZWsPv54MBdN98C9ivSD8e-1920-80.jpg" mos="" align="middle" fullscreen="" width="2664" height="1498" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/phones/iphones/this-is-my-favorite-magsafe-accessory-and-its-perfect-for-iphone-17e">PopSocket is easily my favorite phone accessory</a>, especially since the modern designs are compatible with <a href="https://www.tomsguide.com/phones/iphones/what-is-apple-magsafe-and-which-iphones-support-it">Apple's MagSafe</a>. </p><p>PopSocket grips make it so much easier to keep hold of your phone and access all corners of the screen one-handed — which is essential for a phone as big as the 17 Pro Max. I've always felt that they ensure a much sturdier grip of my phone too. This stops the phone taking as many unnecessary tumbles and potentially makes it harder for thieves to snatch it out of my hands.</p><p>A PopSocket also functions as a handy stand in certain situations, while the magnetic connection ensures the mount has a strong grip on your phone — all without compromising your ability to take it off later.</p><div class="product"><a data-dimension112="8c84eb16-97f3-11f1-be8c-d31acc6d45ab" data-action="Deal Block" data-label="MagSafe Phone Grip" data-dimension48="MagSafe Phone Grip" data-dimension25="$16" href="https://www.amazon.com/PopSockets-Compatible-Included-Wireless-Charging/dp/B0CDF5M6TW" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:688px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="NjXzhkMNH23JwyDrD8ef6e" name="popsocket magsafe" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NjXzhkMNH23JwyDrD8ef6e-1920-80.png" mos="" align="middle" fullscreen="" width="688" height="688" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/PopSockets-Compatible-Included-Wireless-Charging/dp/B0CDF5M6TW" target="_blank" rel="nofollow" data-dimension112="8c84eb16-97f3-11f1-be8c-d31acc6d45ab" data-action="Deal Block" data-label="MagSafe Phone Grip" data-dimension48="MagSafe Phone Grip" data-dimension25="$16">MagSafe Phone Grip: was $29 now $16</a></strong><br>Keep hold of your phone with a MagSafe-friendly PopSocket. These pop-out grips offer a more secure grip on your phone, while also acting as a miniature stand and fashion statement. The best part is the magnetic connection is quite strong, but still remains easy to remove and replace.<a class="view-deal button" href="https://www.amazon.com/PopSockets-Compatible-Included-Wireless-Charging/dp/B0CDF5M6TW" target="_blank" rel="nofollow" data-dimension112="8c84eb16-97f3-11f1-be8c-d31acc6d45ab" data-action="Deal Block" data-label="MagSafe Phone Grip" data-dimension48="MagSafe Phone Grip" data-dimension25="$16">View Deal</a></p></div><h2 id="ugreen-10-000-mah-magnetic-power-bank">UGREEN 10,000 mAh Magnetic Power Bank</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4080px;"><p class="vanilla-image-block" style="padding-top:75.29%;"><img id="3G7ruHw39TL6rSiqKsX6Pf" name="PXL_20260814_160131752~2" alt="ugreen 10kmah magnetic battery pack and iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/3G7ruHw39TL6rSiqKsX6Pf-1920-80.jpg" mos="" align="middle" fullscreen="" width="4080" height="3072" attribution="" endorsement="" 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's MagSafe connection has opened the door for a whole new range of iPhone accessories, all of which take advantage of the magnetic ring hidden in the back of every modern iPhone. </p><p>It also means that portable battery packs now include wireless charging. The magnets ensure the battery securely snaps onto the back of your iPhone, and ensures the charging session continues regardless of how much your phone might move.</p><p>There are a lot of possible options to choose from, but my personal favorite is the Ugreen Magnetic Power Bank, which offers 10,000 mAh of power and 20W charging speeds. It's not quite enough to recharge your iPhone 17 Pro Max twice, but it'll get you pretty close — and quickly. All without any wires getting in your way.</p><div class="product"><a data-dimension112="dabe68a4-97f6-11f1-8441-39b6df74f3cd" data-action="Deal Block" data-label="10,000 mA Magnetic Power Bank" data-dimension48="10,000 mA Magnetic Power Bank" href="https://www.amazon.com/UGREEN-10000mAh-Magnetic-Power-Black/dp/B0CH33F5P2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1125px;"><p class="vanilla-image-block" style="padding-top:133.33%;"><img id="Uoy4xMjXY9KFK4Pau7jGHJ" name="10,000 mA Magnetic Power Bank" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Uoy4xMjXY9KFK4Pau7jGHJ-1920-80.png" mos="" align="middle" fullscreen="" width="1125" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/UGREEN-10000mAh-Magnetic-Power-Black/dp/B0CH33F5P2" target="_blank" rel="nofollow" data-dimension112="dabe68a4-97f6-11f1-8441-39b6df74f3cd" data-action="Deal Block" data-label="10,000 mA Magnetic Power Bank" data-dimension48="10,000 mA Magnetic Power Bank" data-dimension25="">10,000 mA Magnetic Power Bank:</a></strong><br>Wirelessly charge on the go, safe in the knowledge that the MagSafe-compatible magnets in the back of UGreen's  portable charger will stay securely attached to the back of your iPhone. This battery has 10,000 mAh of power available, which is almost twice that of the iPhone 17 Pro Max, as well as 20W wireless charging speeds.<a class="view-deal button" href="https://www.amazon.com/UGREEN-10000mAh-Magnetic-Power-Black/dp/B0CH33F5P2" target="_blank" rel="nofollow" data-dimension112="dabe68a4-97f6-11f1-8441-39b6df74f3cd" data-action="Deal Block" data-label="10,000 mA Magnetic Power Bank" data-dimension48="10,000 mA Magnetic Power Bank" data-dimension25="">View Deal</a></p></div><h2 id="anker-nano-ii-gan-65w-charger">Anker Nano II GaN 65W charger</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1514px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="AZX8e8Pi6XBYwCKYVChQFf" name="A2663111_TD05_V1_2c5d9efe-9427-4f7a-92c4-6ba24f7ba52b" alt="anker nano ii 65w charger" src="https://cdn.mos.cms.futurecdn.net/AZX8e8Pi6XBYwCKYVChQFf-1920-80.jpg" mos="" align="middle" fullscreen="" width="1514" height="852" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Anker)</span></figcaption></figure><p>Apple doesn't sell phones with charging bricks anymore, which means you need to go out and buy one for yourself. But the good news is that there are affordable options that are far better than anything Apple would freely give away, like this compact 67W charger from Anker.</p><p>The Anker Nano II compact charger measures just 1.65 x 1.65 x 1.42 inches and weighs 5.28 ounces. Which is pretty darn small, and is aided by the fact the connection pins fold away for easy storage. In fact I'm pretty envious of this particular design, because electric plugs here in the U.K. have to be way bigger than those across the Atlantic.</p><p>Despite the small size, the charger packs a lot of power, thanks to the Gallium Nitride (GaN) semiconductor inside. GaN chargers can handle higher voltages and produce less heat — allowing chargers to be smaller and lighter than they used to be. </p><p>Plus, not only is the 65W charging limit enough to charge your iPhone 17 Pro Max at the fastest possible speeds, it's also enough to power other devices — including iPads and MacBooks.</p><div class="product"><a data-dimension112="dabe69da-97f6-11f1-8315-9dd0f4078593" data-action="Deal Block" data-label="Nano II 65W GaN compact charger" data-dimension48="Nano II 65W GaN compact charger" data-dimension25="$29" href="https://www.amazon.com/Charger-Anker-Adapter-Foldable-Compact/dp/B08T5QN2TR" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:984px;"><p class="vanilla-image-block" style="padding-top:152.44%;"><img id="Hz2JGEErfRHLmNxj7HJiGa" name="Nano II 65W GaN compact charger" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Hz2JGEErfRHLmNxj7HJiGa-1920-80.png" mos="" align="middle" fullscreen="" width="984" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Charger-Anker-Adapter-Foldable-Compact/dp/B08T5QN2TR" target="_blank" rel="nofollow" data-dimension112="dabe69da-97f6-11f1-8315-9dd0f4078593" data-action="Deal Block" data-label="Nano II 65W GaN compact charger" data-dimension48="Nano II 65W GaN compact charger" data-dimension25="$29">Nano II 65W GaN compact charger: $29</a></strong><br>This charger may be smaller, but it handles enough power to charge almost all of your devices. Whether you're looking to fast charge an iPhone 17 pro Max or simply keep your MacBook Pro powered on for extended periods, this 65W charger has what it takes. All while being so small you might lose it in your bag.<a class="view-deal button" href="https://www.amazon.com/Charger-Anker-Adapter-Foldable-Compact/dp/B08T5QN2TR" target="_blank" rel="nofollow" data-dimension112="dabe69da-97f6-11f1-8315-9dd0f4078593" data-action="Deal Block" data-label="Nano II 65W GaN compact charger" data-dimension48="Nano II 65W GaN compact charger" data-dimension25="$29">View Deal</a></p></div><h2 id="belkin-2-in-1-qi2-foldable-stand">Belkin 2-in-1 Qi2 Foldable Stand</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4115px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="zyGzFhQZqkf9tdPziA7Peb" name="Belkin MagSafe charger" alt="Belkin MagSafe charger" src="https://cdn.mos.cms.futurecdn.net/zyGzFhQZqkf9tdPziA7Peb-1920-80.jpg" mos="" align="middle" fullscreen="" width="4115" height="2315" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you need a stand that does more than simply prop up your phone, then I can <a href="https://www.tomsguide.com/phones/ive-been-using-this-magsafe-style-charger-for-six-months-and-im-not-going-back">personally recommend Belkin's foldable 2-in-1 Qi2 wireless charging stand</a>. This stand is compatible with MagSafe and offers up to 15W charging speeds for your iPhone. The magnetic connection also means you can secure your phone in any position you like, including the horizontal view that activates<a href="https://www.tomsguide.com/news/ios-17-standby"> StandBy Mode.</a></p><p>This particular Belkin stand only charges at 15W, which is lower than the 25W speeds the iPhone 17 Pro Max can handle. However it also comes with a charging pad for compatible AirPods, which enables you to charge both devices at the same time.</p><p>Plus, since this is Qi2, rather than MagSafe, it's compatible with even more devices — including <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-review">Pixel 10</a> and Samsung<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review"> Galaxy S26</a> (with a case).</p><div class="product"><a data-dimension112="4ee2f6f4-97f8-11f1-85dd-87d709f276d1" data-action="Deal Block" data-label="2-in-1 foldable Qi2 wireless charging stand" data-dimension48="2-in-1 foldable Qi2 wireless charging stand" data-dimension25="$28" href="https://www.amazon.com/Belkin-MagSafe-Compatible-Charger-Magnetic-Foldable/dp/B0D9WXYJF8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1436px;"><p class="vanilla-image-block" style="padding-top:94.57%;"><img id="XLR5o6uUYcsKLZoGNtTfgF" name="2-in-1 foldable Qi2 wireless charging stand" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XLR5o6uUYcsKLZoGNtTfgF-1920-80.png" mos="" align="middle" fullscreen="" width="1436" height="1358" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Belkin-MagSafe-Compatible-Charger-Magnetic-Foldable/dp/B0D9WXYJF8" target="_blank" rel="nofollow" data-dimension112="4ee2f6f4-97f8-11f1-85dd-87d709f276d1" data-action="Deal Block" data-label="2-in-1 foldable Qi2 wireless charging stand" data-dimension48="2-in-1 foldable Qi2 wireless charging stand" data-dimension25="$28">2-in-1 foldable Qi2 wireless charging stand: was $71 now $28</a></strong><br>A great way to keep your iPhone charged up, while ensuring it's still visible and usable. This foldable charging stand sports a strong magnetic connection, 15W charging speeds, a built-in pad for AirPods and includes a 37W charging brick right out of the box.<a class="view-deal button" href="https://www.amazon.com/Belkin-MagSafe-Compatible-Charger-Magnetic-Foldable/dp/B0D9WXYJF8" target="_blank" rel="nofollow" data-dimension112="4ee2f6f4-97f8-11f1-85dd-87d709f276d1" data-action="Deal Block" data-label="2-in-1 foldable Qi2 wireless charging stand" data-dimension48="2-in-1 foldable Qi2 wireless charging stand" data-dimension25="$28">View Deal</a></p></div><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/i-wanted-to-be-excited-about-the-pixel-11-but-google-has-made-that-impossible-with-the-most-uninspired-launch-ive-ever-seen">I've been using Pixel phones for the past 5 years, but the lack of Pixel 11 upgrades is indefensible</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-or-iphone-fold-sudden-questions-emerge-over-foldable-iphone-name">iPhone Ultra or iPhone Fold? Sudden questions emerge over foldable iPhone</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-brings-5-star-ratings-to-photos-here-is-how-to-use-them">iOS 27 brings 5-star ratings to Photos — here is how to use them</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/the-5-accessories-that-transformed-my-iphone-17-pro-max-for-under-usd50</link>
                                                                            <description>
                            <![CDATA[ Phone accessories can do a lot of great things, and they don't need to cost a fortune. here are five iPhone 17 Pro Max accessories that improved the way I use my phone. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7SbyHctaHaDJrArZJS4FPU</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/6HnHMXNAHSBiejiSuSxcSa-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 16 Aug 2026 12:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-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/6HnHMXNAHSBiejiSuSxcSa-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 17 Pro Max in a London Underground station]]></media:description>                                                            <media:text><![CDATA[iPhone 17 Pro Max in a London Underground station]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 17 Pro Max in a London Underground station]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/6HnHMXNAHSBiejiSuSxcSa-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Buying a new <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a> is only part of the equation. The shiny new device can do a lot once it's finally out of the box and in your hands, but it doesn't change the fact that your experience can still be improved with a few add-ons.</p><p>There are countless accessories out there that you can buy to enhance the entire iPhone experience — whether you're picking up an <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-review">iPhone 17,</a> the larger 17 Pro Max or waiting for the foldable<a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone"> iPhone Ultra</a>. The prospect of spending even more money after dropping at least $1,200 on a brand new phone may not sounds appealing, but trust me, you will be much happier than without — and you don't need to spend a fortune on them either.</p><p>Here are 5 accessories that helped improve my iPhone 17 Pro Max that all cost less than $50.</p><h2 id="easy-application-screen-protector">Easy-application screen protector</h2><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="GLWZ2fbTEvnheGqKQMmxME" name="PXL_20250117_180136252" alt="LK screen protector easy application tool" src="https://cdn.mos.cms.futurecdn.net/GLWZ2fbTEvnheGqKQMmxME-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>I used to hate applying screen protectors to my phone, because the whole process was so finicky and I'd inevitably get something wrong. I'd always end up with dust or bubbles under the screen, or screw up the alignment so much that I needed a fresh protector. </p><p>And these were the days when screens weren't nearly as durable as they are today. But even with the stronger display glass of the modern day smartphone, screens are still vulnerable to scratches and more serious kinds of damage. The good news is that screen protectors <a href="https://www.amazon.com/TOCOL-iPhone-Pro-Max-Installation/dp/B0FDKJDFGZ/" target="_blank" rel="nofollow">have adapted</a>, and the process of applying them is <a href="https://www.tomsguide.com/phones/i-found-the-perfect-stress-free-way-to-put-a-screen-protector-on-my-phone-heres-how">easier than ever and almost completely pain-free.</a></p><div class="product"><a data-dimension112="83d74b54-97f2-11f1-9976-55a8267720d9" data-action="Deal Block" data-label="Easy Instalaltion Screen Proptector for iPhone 17 Pro Max" data-dimension48="Easy Instalaltion Screen Proptector for iPhone 17 Pro Max" data-dimension25="$9" href="https://www.amazon.com/TOCOL-iPhone-Pro-Max-Installation/dp/B0FDKJDFGZ/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:99.60%;"><img id="AoqwoTPKQAwb77VR8u8aZH" name="Easy Instalaltion Screen Proptector for iPhone 17 Pro Max" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AoqwoTPKQAwb77VR8u8aZH-1920-80.png" mos="" align="middle" fullscreen="" width="1500" height="1494" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/TOCOL-iPhone-Pro-Max-Installation/dp/B0FDKJDFGZ/" target="_blank" rel="nofollow" data-dimension112="83d74b54-97f2-11f1-9976-55a8267720d9" data-action="Deal Block" data-label="Easy Instalaltion Screen Proptector for iPhone 17 Pro Max" data-dimension48="Easy Instalaltion Screen Proptector for iPhone 17 Pro Max" data-dimension25="$9">Easy Instalaltion Screen Proptector for iPhone 17 Pro Max: was $11 now $9</a></strong><br>Applying screen protectors is easier than ever thanks to this handy applicator. Simply place one of the screen protectors in the plastic tool, put it on top of your (hopefully clean) phone screen, and pull the tab. Then sit back and watch as the protector sticks to your phone screen without letting stray particles get in the way.</p><p>Just don't forget to push the bubbles out.<a class="view-deal button" href="https://www.amazon.com/TOCOL-iPhone-Pro-Max-Installation/dp/B0FDKJDFGZ/" target="_blank" rel="nofollow" data-dimension112="83d74b54-97f2-11f1-9976-55a8267720d9" data-action="Deal Block" data-label="Easy Instalaltion Screen Proptector for iPhone 17 Pro Max" data-dimension48="Easy Instalaltion Screen Proptector for iPhone 17 Pro Max" data-dimension25="$9">View Deal</a></p></div><p>Most screen protectors now come with some kind of application tool, but my personal favorites employ a pull-tab. Not only does this ensure perfect alignment with your phone, the fact that the sticky underside of the protector is only exposed to the air for a split-second minimizes the risk of foreign particles getting between it and the screen.</p><p>Just remember to clean the screen correctly first. Nothing can account for the fact you left smudges and dust all over your screen before applying the protective layer</p><p>While you're at it, make sure to pick up a case for your phone. The iPhone 17 Pro Max is notorious for taking taking damage, as <a href="https://www.tomsguide.com/phones/iphones/i-knew-better-than-to-carry-around-a-naked-phone-then-my-iphone-17-pro-max-met-the-asphalt">I found out first hand not too long ago</a>.</p><h2 id="magsafe-popsocket">MagSafe PopSocket</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2664px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="pZWsPv54MBdN98C9ivSD8e" name="PXL_20260306_163802776" alt="popsocket with magsafe on an iPhone 17 Pro" src="https://cdn.mos.cms.futurecdn.net/pZWsPv54MBdN98C9ivSD8e-1920-80.jpg" mos="" align="middle" fullscreen="" width="2664" height="1498" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/phones/iphones/this-is-my-favorite-magsafe-accessory-and-its-perfect-for-iphone-17e">PopSocket is easily my favorite phone accessory</a>, especially since the modern designs are compatible with <a href="https://www.tomsguide.com/phones/iphones/what-is-apple-magsafe-and-which-iphones-support-it">Apple's MagSafe</a>. </p><p>PopSocket grips make it so much easier to keep hold of your phone and access all corners of the screen one-handed — which is essential for a phone as big as the 17 Pro Max. I've always felt that they ensure a much sturdier grip of my phone too. This stops the phone taking as many unnecessary tumbles and potentially makes it harder for thieves to snatch it out of my hands.</p><p>A PopSocket also functions as a handy stand in certain situations, while the magnetic connection ensures the mount has a strong grip on your phone — all without compromising your ability to take it off later.</p><div class="product"><a data-dimension112="8c84eb16-97f3-11f1-be8c-d31acc6d45ab" data-action="Deal Block" data-label="MagSafe Phone Grip" data-dimension48="MagSafe Phone Grip" data-dimension25="$16" href="https://www.amazon.com/PopSockets-Compatible-Included-Wireless-Charging/dp/B0CDF5M6TW" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:688px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="NjXzhkMNH23JwyDrD8ef6e" name="popsocket magsafe" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NjXzhkMNH23JwyDrD8ef6e-1920-80.png" mos="" align="middle" fullscreen="" width="688" height="688" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/PopSockets-Compatible-Included-Wireless-Charging/dp/B0CDF5M6TW" target="_blank" rel="nofollow" data-dimension112="8c84eb16-97f3-11f1-be8c-d31acc6d45ab" data-action="Deal Block" data-label="MagSafe Phone Grip" data-dimension48="MagSafe Phone Grip" data-dimension25="$16">MagSafe Phone Grip: was $29 now $16</a></strong><br>Keep hold of your phone with a MagSafe-friendly PopSocket. These pop-out grips offer a more secure grip on your phone, while also acting as a miniature stand and fashion statement. The best part is the magnetic connection is quite strong, but still remains easy to remove and replace.<a class="view-deal button" href="https://www.amazon.com/PopSockets-Compatible-Included-Wireless-Charging/dp/B0CDF5M6TW" target="_blank" rel="nofollow" data-dimension112="8c84eb16-97f3-11f1-be8c-d31acc6d45ab" data-action="Deal Block" data-label="MagSafe Phone Grip" data-dimension48="MagSafe Phone Grip" data-dimension25="$16">View Deal</a></p></div><h2 id="ugreen-10-000-mah-magnetic-power-bank">UGREEN 10,000 mAh Magnetic Power Bank</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4080px;"><p class="vanilla-image-block" style="padding-top:75.29%;"><img id="3G7ruHw39TL6rSiqKsX6Pf" name="PXL_20260814_160131752~2" alt="ugreen 10kmah magnetic battery pack and iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/3G7ruHw39TL6rSiqKsX6Pf-1920-80.jpg" mos="" align="middle" fullscreen="" width="4080" height="3072" attribution="" endorsement="" 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's MagSafe connection has opened the door for a whole new range of iPhone accessories, all of which take advantage of the magnetic ring hidden in the back of every modern iPhone. </p><p>It also means that portable battery packs now include wireless charging. The magnets ensure the battery securely snaps onto the back of your iPhone, and ensures the charging session continues regardless of how much your phone might move.</p><p>There are a lot of possible options to choose from, but my personal favorite is the Ugreen Magnetic Power Bank, which offers 10,000 mAh of power and 20W charging speeds. It's not quite enough to recharge your iPhone 17 Pro Max twice, but it'll get you pretty close — and quickly. All without any wires getting in your way.</p><div class="product"><a data-dimension112="dabe68a4-97f6-11f1-8441-39b6df74f3cd" data-action="Deal Block" data-label="10,000 mA Magnetic Power Bank" data-dimension48="10,000 mA Magnetic Power Bank" href="https://www.amazon.com/UGREEN-10000mAh-Magnetic-Power-Black/dp/B0CH33F5P2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1125px;"><p class="vanilla-image-block" style="padding-top:133.33%;"><img id="Uoy4xMjXY9KFK4Pau7jGHJ" name="10,000 mA Magnetic Power Bank" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Uoy4xMjXY9KFK4Pau7jGHJ-1920-80.png" mos="" align="middle" fullscreen="" width="1125" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/UGREEN-10000mAh-Magnetic-Power-Black/dp/B0CH33F5P2" target="_blank" rel="nofollow" data-dimension112="dabe68a4-97f6-11f1-8441-39b6df74f3cd" data-action="Deal Block" data-label="10,000 mA Magnetic Power Bank" data-dimension48="10,000 mA Magnetic Power Bank" data-dimension25="">10,000 mA Magnetic Power Bank:</a></strong><br>Wirelessly charge on the go, safe in the knowledge that the MagSafe-compatible magnets in the back of UGreen's  portable charger will stay securely attached to the back of your iPhone. This battery has 10,000 mAh of power available, which is almost twice that of the iPhone 17 Pro Max, as well as 20W wireless charging speeds.<a class="view-deal button" href="https://www.amazon.com/UGREEN-10000mAh-Magnetic-Power-Black/dp/B0CH33F5P2" target="_blank" rel="nofollow" data-dimension112="dabe68a4-97f6-11f1-8441-39b6df74f3cd" data-action="Deal Block" data-label="10,000 mA Magnetic Power Bank" data-dimension48="10,000 mA Magnetic Power Bank" data-dimension25="">View Deal</a></p></div><h2 id="anker-nano-ii-gan-65w-charger">Anker Nano II GaN 65W charger</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1514px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="AZX8e8Pi6XBYwCKYVChQFf" name="A2663111_TD05_V1_2c5d9efe-9427-4f7a-92c4-6ba24f7ba52b" alt="anker nano ii 65w charger" src="https://cdn.mos.cms.futurecdn.net/AZX8e8Pi6XBYwCKYVChQFf-1920-80.jpg" mos="" align="middle" fullscreen="" width="1514" height="852" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Anker)</span></figcaption></figure><p>Apple doesn't sell phones with charging bricks anymore, which means you need to go out and buy one for yourself. But the good news is that there are affordable options that are far better than anything Apple would freely give away, like this compact 67W charger from Anker.</p><p>The Anker Nano II compact charger measures just 1.65 x 1.65 x 1.42 inches and weighs 5.28 ounces. Which is pretty darn small, and is aided by the fact the connection pins fold away for easy storage. In fact I'm pretty envious of this particular design, because electric plugs here in the U.K. have to be way bigger than those across the Atlantic.</p><p>Despite the small size, the charger packs a lot of power, thanks to the Gallium Nitride (GaN) semiconductor inside. GaN chargers can handle higher voltages and produce less heat — allowing chargers to be smaller and lighter than they used to be. </p><p>Plus, not only is the 65W charging limit enough to charge your iPhone 17 Pro Max at the fastest possible speeds, it's also enough to power other devices — including iPads and MacBooks.</p><div class="product"><a data-dimension112="dabe69da-97f6-11f1-8315-9dd0f4078593" data-action="Deal Block" data-label="Nano II 65W GaN compact charger" data-dimension48="Nano II 65W GaN compact charger" data-dimension25="$29" href="https://www.amazon.com/Charger-Anker-Adapter-Foldable-Compact/dp/B08T5QN2TR" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:984px;"><p class="vanilla-image-block" style="padding-top:152.44%;"><img id="Hz2JGEErfRHLmNxj7HJiGa" name="Nano II 65W GaN compact charger" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Hz2JGEErfRHLmNxj7HJiGa-1920-80.png" mos="" align="middle" fullscreen="" width="984" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Charger-Anker-Adapter-Foldable-Compact/dp/B08T5QN2TR" target="_blank" rel="nofollow" data-dimension112="dabe69da-97f6-11f1-8315-9dd0f4078593" data-action="Deal Block" data-label="Nano II 65W GaN compact charger" data-dimension48="Nano II 65W GaN compact charger" data-dimension25="$29">Nano II 65W GaN compact charger: $29</a></strong><br>This charger may be smaller, but it handles enough power to charge almost all of your devices. Whether you're looking to fast charge an iPhone 17 pro Max or simply keep your MacBook Pro powered on for extended periods, this 65W charger has what it takes. All while being so small you might lose it in your bag.<a class="view-deal button" href="https://www.amazon.com/Charger-Anker-Adapter-Foldable-Compact/dp/B08T5QN2TR" target="_blank" rel="nofollow" data-dimension112="dabe69da-97f6-11f1-8315-9dd0f4078593" data-action="Deal Block" data-label="Nano II 65W GaN compact charger" data-dimension48="Nano II 65W GaN compact charger" data-dimension25="$29">View Deal</a></p></div><h2 id="belkin-2-in-1-qi2-foldable-stand">Belkin 2-in-1 Qi2 Foldable Stand</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4115px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="zyGzFhQZqkf9tdPziA7Peb" name="Belkin MagSafe charger" alt="Belkin MagSafe charger" src="https://cdn.mos.cms.futurecdn.net/zyGzFhQZqkf9tdPziA7Peb-1920-80.jpg" mos="" align="middle" fullscreen="" width="4115" height="2315" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you need a stand that does more than simply prop up your phone, then I can <a href="https://www.tomsguide.com/phones/ive-been-using-this-magsafe-style-charger-for-six-months-and-im-not-going-back">personally recommend Belkin's foldable 2-in-1 Qi2 wireless charging stand</a>. This stand is compatible with MagSafe and offers up to 15W charging speeds for your iPhone. The magnetic connection also means you can secure your phone in any position you like, including the horizontal view that activates<a href="https://www.tomsguide.com/news/ios-17-standby"> StandBy Mode.</a></p><p>This particular Belkin stand only charges at 15W, which is lower than the 25W speeds the iPhone 17 Pro Max can handle. However it also comes with a charging pad for compatible AirPods, which enables you to charge both devices at the same time.</p><p>Plus, since this is Qi2, rather than MagSafe, it's compatible with even more devices — including <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-review">Pixel 10</a> and Samsung<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review"> Galaxy S26</a> (with a case).</p><div class="product"><a data-dimension112="4ee2f6f4-97f8-11f1-85dd-87d709f276d1" data-action="Deal Block" data-label="2-in-1 foldable Qi2 wireless charging stand" data-dimension48="2-in-1 foldable Qi2 wireless charging stand" data-dimension25="$28" href="https://www.amazon.com/Belkin-MagSafe-Compatible-Charger-Magnetic-Foldable/dp/B0D9WXYJF8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1436px;"><p class="vanilla-image-block" style="padding-top:94.57%;"><img id="XLR5o6uUYcsKLZoGNtTfgF" name="2-in-1 foldable Qi2 wireless charging stand" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XLR5o6uUYcsKLZoGNtTfgF-1920-80.png" mos="" align="middle" fullscreen="" width="1436" height="1358" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Belkin-MagSafe-Compatible-Charger-Magnetic-Foldable/dp/B0D9WXYJF8" target="_blank" rel="nofollow" data-dimension112="4ee2f6f4-97f8-11f1-85dd-87d709f276d1" data-action="Deal Block" data-label="2-in-1 foldable Qi2 wireless charging stand" data-dimension48="2-in-1 foldable Qi2 wireless charging stand" data-dimension25="$28">2-in-1 foldable Qi2 wireless charging stand: was $71 now $28</a></strong><br>A great way to keep your iPhone charged up, while ensuring it's still visible and usable. This foldable charging stand sports a strong magnetic connection, 15W charging speeds, a built-in pad for AirPods and includes a 37W charging brick right out of the box.<a class="view-deal button" href="https://www.amazon.com/Belkin-MagSafe-Compatible-Charger-Magnetic-Foldable/dp/B0D9WXYJF8" target="_blank" rel="nofollow" data-dimension112="4ee2f6f4-97f8-11f1-85dd-87d709f276d1" data-action="Deal Block" data-label="2-in-1 foldable Qi2 wireless charging stand" data-dimension48="2-in-1 foldable Qi2 wireless charging stand" data-dimension25="$28">View Deal</a></p></div><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/i-wanted-to-be-excited-about-the-pixel-11-but-google-has-made-that-impossible-with-the-most-uninspired-launch-ive-ever-seen">I've been using Pixel phones for the past 5 years, but the lack of Pixel 11 upgrades is indefensible</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-or-iphone-fold-sudden-questions-emerge-over-foldable-iphone-name">iPhone Ultra or iPhone Fold? Sudden questions emerge over foldable iPhone</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-brings-5-star-ratings-to-photos-here-is-how-to-use-them">iOS 27 brings 5-star ratings to Photos — here is how to use them</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I biked 11 miles with the Garmin Instinct 3 vs Samsung Galaxy Watch Ultra 2 — and the winner is clear ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Which rugged smartwatch is the more reliable fitness tracker for cyclists, the new Samsung Galaxy Watch Ultra 2 or the Garmin Instinct 3? I decided to find out. </p><p>Having just tested the <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Galaxy Watch Ultra 2</a> vs <a href="https://www.tomsguide.com/Garmin-Instinct-3-review">Instinct 3</a> while <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-went-e-mountain-biking-in-cougar-country-with-the-new-samsung-galaxy-watch-ultra-2-vs-garmin-instinct-3-and-the-winner-is-clear">e-mountain biking in the Northern Cascades</a> — Garmin won decisively — I decided it was time for round 2. This time, I tested the two watches in a city setting along one of my favorite routes through central Seattle, Washington.</p><h3 class="article-body__section" id="section-i-biked-11-miles-with-the-garmin-instinct-3-vs-samsung-galaxy-watch-ultra-2"><span>I biked 11 miles with the Garmin Instinct 3 vs Samsung Galaxy Watch Ultra 2</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:5067px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZccTmgvN3f5DM4R5Xi6PWW" name="GalaxyUltra2-Instinct3-01" alt="Close-up of the Samsung Galaxy Watch Ultra 2 next to the Garmin Instinct 3 against a bright blue background" src="https://cdn.mos.cms.futurecdn.net/ZccTmgvN3f5DM4R5Xi6PWW-1920-80.jpg" mos="" align="middle" fullscreen="" width="5067" height="2850" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>With the Samsung on my left wrist and the Garmin on my right, my roughly one-hour ride took me through densely populated neighborhoods, alongside neat rows of postcard-worthy houseboats, beneath towering canopies of evergreens, and past buzzing corporate campuses. </p><p>Read on for the results. </p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Garmin Instinct 3</p></th><th  ><p>Samsung Galaxy Watch Ultra 2</p></th><th  ><p>Strava</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Distance</strong></p></td><td  ><p>10.78 miles</p></td><td  ><p>10.88 miles </p></td><td  ><p>10.93 miles</p></td></tr><tr><td class="firstcol " ><p><strong>Climb</strong></p></td><td  ><p>761 feet</p></td><td  ><p>970 feet</p></td><td  ><p>675 feet</p></td></tr><tr><td class="firstcol " ><p><strong>Average moving speed</strong></p></td><td  ><p>11.7 mph</p></td><td  ><p>11.9 mph</p></td><td  ><p>11.8 mph</p></td></tr><tr><td class="firstcol " ><p><strong>Top speed</strong></p></td><td  ><p>27.7 mph</p></td><td  ><p>26 mph</p></td><td  ><p>27 mph</p></td></tr><tr><td class="firstcol " ><p><strong>Average heart rate</strong></p></td><td  ><p>159 bpm</p></td><td  ><p>159 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Max heart rate</strong></p></td><td  ><p>175 bpm</p></td><td  ><p>175 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Calories burned</strong></p></td><td  ><p>674 total calories</p></td><td  ><p>588 total calories</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Battery usage</strong></p></td><td  ><p>5%</p></td><td  ><p>5%</p></td><td  ><p>n/a</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-all-three-tracking-methods-noted-similar-distance-and-speed"><span>All three tracking methods noted similar distance and speed</span></h3><p>In addition to logging my bike ride with the two smartwatches, I also recorded it using the Strava app on my handlebar-mounted iPhone 16 Plus. Using Strava as our control, all three tracking methods recorded roughly the same total distance, give or take a tenth of a mile or two... but the Samsung was closer.</p><p>The Galaxy Watch Ultra 2, Instinct 3, and Strava also recorded roughly the same average moving and max speed, which is reassuring to see. In this case, assuming Strava is again on the money, the Garmin was a little more accurate than the Samsung. </p><h3 class="article-body__section" id="section-samsung-climb-data-is-again-inflated"><span>Samsung climb data is (again) inflated</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:5187px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="WuDuLxY7D8yPDKN9dJM6RP" name="S-Ultra2-G-Instinct3-06" alt="Close-up of the Samsung Galaxy Watch Ultra 2 and Garmin Instinct 3 in the mountains during an e-biking excursion" src="https://cdn.mos.cms.futurecdn.net/WuDuLxY7D8yPDKN9dJM6RP-1920-80.jpg" mos="" align="middle" fullscreen="" width="5187" height="2918" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Rebecca Michalak )</span></figcaption></figure><p>This is the third time I've tested the Samsung Galaxy Watch Ultra 2 against other devices, and it resulted in noticeably inflated climb data compared to its peers. For example, I discovered the same when I took the <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">Galaxy Watch Ultra 2 hiking</a> in the North Cascades, and again when I went <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-went-e-mountain-biking-in-cougar-country-with-the-new-samsung-galaxy-watch-ultra-2-vs-garmin-instinct-3-and-the-winner-is-clear">e-mountain biking</a>. </p><p>I've reached out to Samsung for comment on these results and will keep you posted on the brand's response. Meanwhile, Garmin also inflated my uphill efforts, just by a more forgivable amount.</p><p>It's worth noting that this is a bike route I'm deeply familiar with and have <a href="https://www.tomsguide.com/wellness/smartwatches/i-biked-11-miles-with-the-coros-nomad-vs-amazfit-t-rex-3-pro-and-the-results-surprised-me">logged many times</a> with a wide range of trackers. As a result, I've come to expect the total elevation gain for the ride to be somewhere between 675 and 725 feet. </p><h3 class="article-body__section" id="section-heart-rate-data-also-lines-up-nicely"><span>Heart rate data also lines up nicely</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:4913px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="BhK5xvMsdXnqJjbLSbK9YN" name="S-Ultra2-G-Instinct3-01" alt="Close-up of the Samsung Galaxy Watch Ultra 2 and Garmin Instinct 3 in the mountains during an e-biking excursion" src="https://cdn.mos.cms.futurecdn.net/BhK5xvMsdXnqJjbLSbK9YN-1920-80.jpg" mos="" align="middle" fullscreen="" width="4913" height="2764" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Thankfully, elevation gain is the only metric where the data doesn't agree/upset my stomach. Moreover, it warms my heart to see that my average and max heart rates are a perfect match between the Samsung Galaxy Watch Ultra 2 and Garmin Instinct 3 for this ride.</p><p>While the Galaxy Watch Ultra 2 uses Samsung's latest health sensor tech, the Instinct 3 uses Garmin's next-to-latest sensor array.</p><h3 class="article-body__section" id="section-both-watches-performed-well-but-i-d-still-opt-for-the-garmin"><span>Both watches performed well, but I'd still opt for the Garmin</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:1977px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YYtK3yJmCnYFoVcupV4aUN" name="GarminInstinct3-snow-05" alt="Garmin Instinct 3 on a user's wrist shown up-close in between a ski glove and jacket" src="https://cdn.mos.cms.futurecdn.net/YYtK3yJmCnYFoVcupV4aUN-1920-80.jpg" mos="" align="middle" fullscreen="" width="1977" height="1112" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>From heart rate to battery usage to speed and distance, both the Garmin Instinct 3 and Samsung Galaxy Watch Ultra 2 performed admirably in this 11-mile bike ride tracking comparison. Despite one outlier — Samsung's inflated ascent data — I'm pleasantly impressed by the performance of both.</p><p>Of course, the Garmin Instinct 3 has been my go-to smartwatch for any and all outdoor adventures, from <a href="https://www.tomsguide.com/wellness/smartwatches/i-hiked-up-new-yorks-highest-waterfall-with-the-apple-watch-10-vs-garmin-instinct-3-5-things-i-learned">hitting the trails</a> to <a href="https://www.tomsguide.com/wellness/smartwatches/i-took-the-apple-watch-ultra-3-vs-garmin-instinct-3-snowboarding-and-there-was-one-clear-winner">the slopes</a> to the water. And even though I'm impressed by the Galaxy Watch Ultra 2, I'll likely stick with the Instinct 3 for the foreseeable future for logging these types of activities. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ev1ZaX"></div>                            </div>                            <script src="https://kwizly.com/embed/ev1ZaX.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-biked-11-miles-with-the-garmin-venu-4-vs-suunto-vertical-2-and-theres-a-clear-winner">I biked 11 miles with the Garmin Venu 4 vs Suunto Vertical 2 — and there's a clear winner</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-manually-counted-4-000-steps-to-test-the-apple-watch-ultra-3-vs-samsung-galaxy-watch-ultra-2-and-samsung-wins-the-accuracy-battle-with-better-elevation-data-too">I walked 4,000 steps with the Apple Watch Ultra 3 vs Samsung Galaxy Watch Ultra 2 — and the winning margin was razor-thin</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/exclusive-garmin-cirqa-pm-says-it-just-felt-like-we-had-all-of-the-pieces-in-place-to-launch-a-screen-free-fitness-tracker">Exclusive: Garmin Cirqa PM says ‘it just felt like we had all of the pieces in place’ to launch a screen-free fitness tracker</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/smartwatches/i-biked-11-miles-with-the-garmin-instinct-3-vs-samsung-galaxy-watch-ultra-2-and-the-winner-is-clear</link>
                                                                            <description>
                            <![CDATA[ Which rugged smartwatch is the more reliable fitness tracker for cyclists, the new Samsung Galaxy Watch Ultra 2 or the Garmin Instinct 3? I decided to find out. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">yXRaP8PjCLBiDpC48jDS5X</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/z4fwvXKWVZz3GTwNXzQkGV-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 11 Aug 2026 06:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&gt;&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/z4fwvXKWVZz3GTwNXzQkGV-1920-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Samsung Galaxy Watch Ultra 2 next to the Garmin Instinct 3 against a bright blue background]]></media:description>                                                            <media:text><![CDATA[Close-up of the Samsung Galaxy Watch Ultra 2 next to the Garmin Instinct 3 against a bright blue background]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Samsung Galaxy Watch Ultra 2 next to the Garmin Instinct 3 against a bright blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/z4fwvXKWVZz3GTwNXzQkGV-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Which rugged smartwatch is the more reliable fitness tracker for cyclists, the new Samsung Galaxy Watch Ultra 2 or the Garmin Instinct 3? I decided to find out. </p><p>Having just tested the <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Galaxy Watch Ultra 2</a> vs <a href="https://www.tomsguide.com/Garmin-Instinct-3-review">Instinct 3</a> while <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-went-e-mountain-biking-in-cougar-country-with-the-new-samsung-galaxy-watch-ultra-2-vs-garmin-instinct-3-and-the-winner-is-clear">e-mountain biking in the Northern Cascades</a> — Garmin won decisively — I decided it was time for round 2. This time, I tested the two watches in a city setting along one of my favorite routes through central Seattle, Washington.</p><h3 class="article-body__section" id="section-i-biked-11-miles-with-the-garmin-instinct-3-vs-samsung-galaxy-watch-ultra-2"><span>I biked 11 miles with the Garmin Instinct 3 vs Samsung Galaxy Watch Ultra 2</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:5067px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZccTmgvN3f5DM4R5Xi6PWW" name="GalaxyUltra2-Instinct3-01" alt="Close-up of the Samsung Galaxy Watch Ultra 2 next to the Garmin Instinct 3 against a bright blue background" src="https://cdn.mos.cms.futurecdn.net/ZccTmgvN3f5DM4R5Xi6PWW-1920-80.jpg" mos="" align="middle" fullscreen="" width="5067" height="2850" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>With the Samsung on my left wrist and the Garmin on my right, my roughly one-hour ride took me through densely populated neighborhoods, alongside neat rows of postcard-worthy houseboats, beneath towering canopies of evergreens, and past buzzing corporate campuses. </p><p>Read on for the results. </p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Garmin Instinct 3</p></th><th  ><p>Samsung Galaxy Watch Ultra 2</p></th><th  ><p>Strava</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Distance</strong></p></td><td  ><p>10.78 miles</p></td><td  ><p>10.88 miles </p></td><td  ><p>10.93 miles</p></td></tr><tr><td class="firstcol " ><p><strong>Climb</strong></p></td><td  ><p>761 feet</p></td><td  ><p>970 feet</p></td><td  ><p>675 feet</p></td></tr><tr><td class="firstcol " ><p><strong>Average moving speed</strong></p></td><td  ><p>11.7 mph</p></td><td  ><p>11.9 mph</p></td><td  ><p>11.8 mph</p></td></tr><tr><td class="firstcol " ><p><strong>Top speed</strong></p></td><td  ><p>27.7 mph</p></td><td  ><p>26 mph</p></td><td  ><p>27 mph</p></td></tr><tr><td class="firstcol " ><p><strong>Average heart rate</strong></p></td><td  ><p>159 bpm</p></td><td  ><p>159 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Max heart rate</strong></p></td><td  ><p>175 bpm</p></td><td  ><p>175 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Calories burned</strong></p></td><td  ><p>674 total calories</p></td><td  ><p>588 total calories</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Battery usage</strong></p></td><td  ><p>5%</p></td><td  ><p>5%</p></td><td  ><p>n/a</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-all-three-tracking-methods-noted-similar-distance-and-speed"><span>All three tracking methods noted similar distance and speed</span></h3><p>In addition to logging my bike ride with the two smartwatches, I also recorded it using the Strava app on my handlebar-mounted iPhone 16 Plus. Using Strava as our control, all three tracking methods recorded roughly the same total distance, give or take a tenth of a mile or two... but the Samsung was closer.</p><p>The Galaxy Watch Ultra 2, Instinct 3, and Strava also recorded roughly the same average moving and max speed, which is reassuring to see. In this case, assuming Strava is again on the money, the Garmin was a little more accurate than the Samsung. </p><h3 class="article-body__section" id="section-samsung-climb-data-is-again-inflated"><span>Samsung climb data is (again) inflated</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:5187px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="WuDuLxY7D8yPDKN9dJM6RP" name="S-Ultra2-G-Instinct3-06" alt="Close-up of the Samsung Galaxy Watch Ultra 2 and Garmin Instinct 3 in the mountains during an e-biking excursion" src="https://cdn.mos.cms.futurecdn.net/WuDuLxY7D8yPDKN9dJM6RP-1920-80.jpg" mos="" align="middle" fullscreen="" width="5187" height="2918" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Rebecca Michalak )</span></figcaption></figure><p>This is the third time I've tested the Samsung Galaxy Watch Ultra 2 against other devices, and it resulted in noticeably inflated climb data compared to its peers. For example, I discovered the same when I took the <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">Galaxy Watch Ultra 2 hiking</a> in the North Cascades, and again when I went <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-went-e-mountain-biking-in-cougar-country-with-the-new-samsung-galaxy-watch-ultra-2-vs-garmin-instinct-3-and-the-winner-is-clear">e-mountain biking</a>. </p><p>I've reached out to Samsung for comment on these results and will keep you posted on the brand's response. Meanwhile, Garmin also inflated my uphill efforts, just by a more forgivable amount.</p><p>It's worth noting that this is a bike route I'm deeply familiar with and have <a href="https://www.tomsguide.com/wellness/smartwatches/i-biked-11-miles-with-the-coros-nomad-vs-amazfit-t-rex-3-pro-and-the-results-surprised-me">logged many times</a> with a wide range of trackers. As a result, I've come to expect the total elevation gain for the ride to be somewhere between 675 and 725 feet. </p><h3 class="article-body__section" id="section-heart-rate-data-also-lines-up-nicely"><span>Heart rate data also lines up nicely</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:4913px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="BhK5xvMsdXnqJjbLSbK9YN" name="S-Ultra2-G-Instinct3-01" alt="Close-up of the Samsung Galaxy Watch Ultra 2 and Garmin Instinct 3 in the mountains during an e-biking excursion" src="https://cdn.mos.cms.futurecdn.net/BhK5xvMsdXnqJjbLSbK9YN-1920-80.jpg" mos="" align="middle" fullscreen="" width="4913" height="2764" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Thankfully, elevation gain is the only metric where the data doesn't agree/upset my stomach. Moreover, it warms my heart to see that my average and max heart rates are a perfect match between the Samsung Galaxy Watch Ultra 2 and Garmin Instinct 3 for this ride.</p><p>While the Galaxy Watch Ultra 2 uses Samsung's latest health sensor tech, the Instinct 3 uses Garmin's next-to-latest sensor array.</p><h3 class="article-body__section" id="section-both-watches-performed-well-but-i-d-still-opt-for-the-garmin"><span>Both watches performed well, but I'd still opt for the Garmin</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:1977px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YYtK3yJmCnYFoVcupV4aUN" name="GarminInstinct3-snow-05" alt="Garmin Instinct 3 on a user's wrist shown up-close in between a ski glove and jacket" src="https://cdn.mos.cms.futurecdn.net/YYtK3yJmCnYFoVcupV4aUN-1920-80.jpg" mos="" align="middle" fullscreen="" width="1977" height="1112" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>From heart rate to battery usage to speed and distance, both the Garmin Instinct 3 and Samsung Galaxy Watch Ultra 2 performed admirably in this 11-mile bike ride tracking comparison. Despite one outlier — Samsung's inflated ascent data — I'm pleasantly impressed by the performance of both.</p><p>Of course, the Garmin Instinct 3 has been my go-to smartwatch for any and all outdoor adventures, from <a href="https://www.tomsguide.com/wellness/smartwatches/i-hiked-up-new-yorks-highest-waterfall-with-the-apple-watch-10-vs-garmin-instinct-3-5-things-i-learned">hitting the trails</a> to <a href="https://www.tomsguide.com/wellness/smartwatches/i-took-the-apple-watch-ultra-3-vs-garmin-instinct-3-snowboarding-and-there-was-one-clear-winner">the slopes</a> to the water. And even though I'm impressed by the Galaxy Watch Ultra 2, I'll likely stick with the Instinct 3 for the foreseeable future for logging these types of activities. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ev1ZaX"></div>                            </div>                            <script src="https://kwizly.com/embed/ev1ZaX.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-biked-11-miles-with-the-garmin-venu-4-vs-suunto-vertical-2-and-theres-a-clear-winner">I biked 11 miles with the Garmin Venu 4 vs Suunto Vertical 2 — and there's a clear winner</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-manually-counted-4-000-steps-to-test-the-apple-watch-ultra-3-vs-samsung-galaxy-watch-ultra-2-and-samsung-wins-the-accuracy-battle-with-better-elevation-data-too">I walked 4,000 steps with the Apple Watch Ultra 3 vs Samsung Galaxy Watch Ultra 2 — and the winning margin was razor-thin</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/exclusive-garmin-cirqa-pm-says-it-just-felt-like-we-had-all-of-the-pieces-in-place-to-launch-a-screen-free-fitness-tracker">Exclusive: Garmin Cirqa PM says ‘it just felt like we had all of the pieces in place’ to launch a screen-free fitness tracker</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I pushed the latest foldables from Samsung, Motorola and Honor into a no‑mercy battle royale and there was one clear winner ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The last couple of months have seen the arrival of some seriously high-profile book-style foldable devices, with brands like Samsung, Motorola and Honor looking to set the standard before the imminent release of Apple’s first foldable, which some expect will be called <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra</a>.</p><p>I’ve got 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>, the <a href="https://www.tomsguide.com/phones/android-phones/honor-magic-v6-hands-on-review">Honor Magic V6</a> and the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-fold-review">Motorola Razr Fold</a> lined up for testing — three of the most premium foldables of the year, each aiming for the same spotlight. They all promise big screens, big versatility and big leaps forward, but once you start living with them, the differences come into focus fast.</p><p>I’m putting them through the same tests: design, cameras, battery life, multitasking and everyday use. By the end, one of these foldables will stand out as the clear winner — not because of hype, but because it genuinely earns the spot.</p><div data-model-name="Samsung Galaxy Z Fold 8,Motorola Razr Fold,Honor Magic V6" data-widget-type="multimodelreview" data-product-types="deals"></div><h2 id="galaxy-z-fold-8-vs-razr-fold-vs-magic-v6-design">Galaxy Z Fold 8 vs Razr Fold vs Magic V6: 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cUeuDRhuwnySJ3H8boQrV7" name="foldables face-off 1" alt="Three foldables, Samsung Galaxy Z Fold 8, Honor Magic V6 and Motorola Razr Fold on a desk." src="https://cdn.mos.cms.futurecdn.net/cUeuDRhuwnySJ3H8boQrV7-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>In terms of design, Samsung’s Galaxy Z Fold 8 feels like it’s finally cracked the code on what a book‑style foldable should be, though its short‑and‑wide design won’t be for everyone. Closed, it measures 153.5 x 68.1 x 12.1mm, which makes it noticeably shorter than most slab phones but still basically as wide as a Galaxy S26 Ultra. That width gives the cover screen a more natural feel for typing and scrolling, even if the squat shape takes a day or two to get used to. </p><p>At 201g, the Galaxy Z Fold 8 is the lightest in its class, and when you pair that with sharp, squared‑off corners, it makes the device feel significantly more modern than the other two foldables in this face‑off. As for its hinge, it opens with a clean, confident motion and unfolds almost perfectly flat. On top of that, Samsung’s titanium plate and gapless micro‑perforated display stack have drastically minimised the crease — you can still feel it if you go looking for it, but visually it’s so faint that you forget it’s there within minutes. Combined with a new anti‑reflective coating, the Z Fold 8’s main display looks more like a single sheet of glass than a foldable screen. For me, it’s the first time a foldable has felt this seamless.</p><p>Motorola’s Razr Fold takes a very different path, leaning into toughness rather than elegance. It’s noticeably heavier at 243 grams, and you feel that extra weight the moment you pick it up, but it’s the kind of heft that makes the phone seem more durable. It boasts a titanium inner plate, stainless steel hinge and Gorilla Glass Ceramic 3, all contributing to a chassis that feels reinforced in a way most foldables don’t. Even when opened, the Razr Fold stays impressively thin at 4.55mm, though its crease is far more noticeable than on the Galaxy Z Fold 8. </p><p>The Razr Fold's hinge doesn’t have the snappy, almost playful motion of the Galaxy Z Fold 8 — it’s firmer, more deliberate, built to hold its position rather than glide. And while the Razr Fold technically shares the same IP48/IP49 protection class as Samsung, its overall construction feels more rugged and less fragile. It’s not the most stylish or pocket‑friendly design, but it’s the one that gives you the most confidence that it’ll survive being used like a normal phone rather than a delicate gadget.</p><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="KhD9iSXBnCviywUe788WV7" name="foldables face-off 3" alt="Three foldables, Samsung Galaxy Z Fold 8, Honor Magic V6 and Motorola Razr Fold on a desk." src="https://cdn.mos.cms.futurecdn.net/KhD9iSXBnCviywUe788WV7-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>Meanwhile, Honor’s Magic V6 sits somewhere in the middle. It’s clean, understated, and very thin — 8.75mm closed, 4mm open — and while the huge round camera array keeps it from looking as sleek as Samsung’s device, it still feels more balanced than the Razr Fold. Its “Super Steel” hinge is nicely engineered, and its use of anti‑reflective silicon nitride layers gives both displays a soft, matte look that’s easy on the eyes. The crease is 44% shallower than its predecessor, the Magic V5, though it's still fairly noticeable, both in look and feel. It's also between its competitors in terms of heft, weighing in at 219 grams. </p><p>In terms of visual appeal, the white Magic V6 I'm testing is clean but a little clinical — especially compared to the red vegan leather version shown in our hands‑on review. In other words, it’s sleek, but also a little boring. It also boasts an IP68/IP69 dust and water resistance rating, putting it ahead of its competitors in that regard.</p><p>One more thing — there’s one important feature that both the Magic V6 and the Razr Fold boast over Galaxy Z Fold 8: they both offer stylus support. Better still, each device supports stylus input on both their inner and outer displays. I wasn’t able to test this myself, but that functionality is sure to be a major selling point for anyone still frustrated that Samsung removed the feature from its Fold lineup.</p><p>Still, the Galaxy Z Fold 8 is the only one that nails every essential practical design metric at once: thinness, weight, hinge feel, crease reduction and pocketability. It’s the foldable that feels the most polished and the most effortless to live with day‑to‑day — not because it’s flashy, but because it finally behaves like a normal phone when you want it to, and a big screen when you need it.</p><p><strong>WINNER:</strong> Samsung Galaxy Z Fold 8</p><p><strong>Runner-up: </strong>Honor Magic V6</p><h2 id="galaxy-z-fold-8-vs-razr-fold-vs-magic-v6-cameras">Galaxy Z Fold 8 vs Razr Fold vs Magic V6: 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:4096px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="L4UsuF25LxQuvgzXrAe2YL" name="foldables face-off 4" alt="Three foldables from left to right, Motorola Razr Fold, Honor Magic V6 and Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/L4UsuF25LxQuvgzXrAe2YL-1920-80.jpg" mos="" align="middle" fullscreen="" width="4096" height="2304" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Given that all three foldables are premium devices, it’s not surprising that they can all take good photos. That said, one consistently delivered great snaps in my testing. Samsung plays it safe, Motorola pushes ahead in ways I didn’t expect, and Honor lands somewhere in the middle — but which one takes the photography crown?</p><div ><table><tbody><tr><td class="firstcol " ><p><strong></strong></p></td><td  ><p><strong>Samsung Galaxy Z Fold 8</strong></p></td><td  ><p><strong>Motorola Razr Fold</strong></p></td><td  ><p><strong>Honor Magic V6</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Main Camera</strong></p></td><td  ><p>50MP (f/1.8)</p></td><td  ><p>50MP (f/1.6)</p></td><td  ><p>50MP (f/1.6)</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/2.0)</p></td><td  ><p>50MP (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Telephoto Cameras</strong></p></td><td  ><p>N/A</p></td><td  ><p>50MP (f/2.4)(periscope telephoto)</p></td><td  ><p>64MP (f/2.5) (periscope telephoto)</p></td></tr><tr><td class="firstcol " ><p><strong>Zoom Range</strong></p></td><td  ><p>Up to 10x Digital Zoom</p></td><td  ><p>Up to 100x Super Zoom pro, 3x Optical Zoom</p></td><td  ><p>Up to 100x Digital Zoom, 3x Optical Zoom</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie Cameras</strong></p></td><td  ><p>Cover: 10MP (f/2.2) Inner: 10 MP (f/2.2)</p></td><td  ><p>Cover: 20MP (f/2.4) Inner: 32MP (f/2.4)</p></td><td  ><p>Cover: 20MP (f/2.2)<br>Inner: 20MP (f/2.2)</p></td></tr></tbody></table></div><p>Samsung’s Galaxy Z Fold 8 delivers a camera experience that feels familiar but polished. The two 50MP rear cameras produce rich colors and excellent dynamic range, and the upgraded ultrawide is noticeably sharper than last year’s model. Low‑light photos also come out brighter and sharper, with better control over noise and blown‑out highlights. The only real drawback is zoom — without a telephoto lens, detail drops off quickly once you push past 4x, making the Galaxy Z Fold 8 Ultra a better option for those who value that more.</p><p>The Motorola Razr Fold is the one that genuinely surprised me. Its triple‑50MP setup produces crisp, vibrant photos with far more texture than I expected, and the 3x optical telephoto instantly gives it an edge over the other two. Motorola’s Super Zoom Pro also works better than I anticipated, keeping long‑range shots surprisingly clean. Low‑light performance is strong as well, with balanced exposures that avoid Samsung’s occasional brightness push.</p><p>Honor’s Magic V6 sits somewhere between the other two. The hardware is strong — a 50MP main, 50MP ultrawide and a 64MP periscope telephoto with 3x optical zoom — and Honor’s AiMAGE Color Engine generally produces natural, accurate colours. The telephoto lens gives the V6 decent reach, but the tuning doesn’t feel quite as confident as Samsung’s or as punchy as Motorola’s. I also noticed a bit of artificial “sweetening” in portrait shots, with skin smoothing that’s more aggressive than I’d prefer. It’s a capable camera system, just not the standout feature of the phone.</p><p>Across all three, the Razr Fold still comes out on top. Honor’s 64MP periscope telephoto gives the Magic V6 real reach, and Samsung remains strong in dynamic range and low‑light, but Motorola’s results are consistently sharper, cleaner and more confident across every scenario. It’s the foldable I’d reach for if cameras matter most.</p><p><strong>WINNER: </strong>Motorola Razr Fold</p><p><strong>Runner-up: </strong>Honor Magic V6</p><h2 id="galaxy-z-fold-8-vs-razr-fold-vs-magic-v6-battery-life">Galaxy Z Fold 8 vs Razr Fold vs Magic V6: 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YDHqDVy3SYnAbK3EpsDEUS" name="Motorola Razr Fold" alt="In-hand image of the Motorola Razr Fold in unfolded mode" src="https://cdn.mos.cms.futurecdn.net/YDHqDVy3SYnAbK3EpsDEUS-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>Battery life is one of the biggest practical differences among these three foldables. All of them can comfortably last a day, but how much they have left at bedtime varies. Samsung finally feels reliable, Motorola pushes endurance further than anyone else, and Honor’s huge battery delivers surprisingly strong results in my own testing.</p><p>Samsung’s Galaxy Z Fold 8 is the most balanced of the bunch. The move to a 4,800 mAh silicon‑carbon battery pays off: in Tom’s Guide’s 5G web‑surfing test, it lasted 12 hours and 19 minutes, a solid jump from the Fold 7’s 10:44. In day‑to‑day use, I could get through a full day of email, photos and music and still end up around the 50% mark. Charging is faster too — 70% in 30 minutes — and unlike the others, you can hit those speeds with any standard fast-charging adapter you’ll find on Amazon, not a proprietary brick.</p><p>The Motorola Razr Fold is the endurance monster. Motorola fits a 6,000 mAh battery inside a body that doesn’t feel any heavier, and the results are wild. Tom’s Guide measured 14 hours and 44 minutes, the best battery life of any book‑style foldable they’ve tested. Charging is equally impressive: 42% in 15 minutes and 75% in 30 minutes with 80W wired charging — but you’ll need either Motorola’s 80W TurboPower charger, which isn’t included in the box in Australia and which I don’t have access to, or a super fast charging adapter (100w or above, according to online users) to reach those headline numbers.</p><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="iqYxn9huHzbqNdt2b8AzDY" name="Honor Magic V6" alt="In-hand image of Honor Magic V6 in unfolded form" src="https://cdn.mos.cms.futurecdn.net/iqYxn9huHzbqNdt2b8AzDY-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>Honor’s Magic V6 goes even bigger in capacity with a 6,660 mAh silicon‑carbon battery, the largest of any foldable right now. Tom’s Guide hasn’t run its full battery test yet, but in my own PCMark Work 3.0 battery test, the V6 lasted just under 14 hours, putting it right in line with Motorola’s excellent endurance. It also supports 80W wired and 66W wireless charging, though you’ll need Honor‑approved chargers to reach those peak speeds. It’s a genuinely long‑lasting device, and the huge battery pays off.</p><p>Across all three, the Razr Fold still feels like the endurance king thanks to its combination of runtime and charging speed. Samsung delivers dependable all‑day life with faster top‑ups on standard chargers, and Honor’s massive battery gives it impressive stamina, but the Razr Fold is the foldable I’d trust most when I’m away from a charger.</p><p><strong>WINNER: </strong>Motorola Razr Fold</p><p><strong>Runner-up: </strong>Honor Magic V6</p><h2 id="galaxy-z-fold-8-vs-razr-fold-vs-magic-v6-multitasking">Galaxy Z Fold 8 vs Razr Fold vs Magic V6: Multitasking</h2><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="uPTKMQxuUtji6eqJK93vBf" name="Galaxy Z Fold 8 multitasking" alt="Unfolded Samsung Galaxy Z Fold 8 on desk demonstrating multitasking capability" src="https://cdn.mos.cms.futurecdn.net/uPTKMQxuUtji6eqJK93vBf-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>When it comes to multitasking, what really separates these three foldables isn’t the size of their screens — it’s the software experience. Samsung is the only one that feels like it’s been iterating on multitasking for years, and the Z Fold 8 is a testament to that. The moment you open two apps side‑by‑side, everything snaps into place with a kind of smoothness that the Razr Fold and Magic V6 don’t quite match.</p><p>On the Galaxy Z Fold 8, multitasking feels natural. The wider 4:3 inner display gives apps room to breathe, but it’s Samsung’s software polish that makes the difference. Dragging an app into split‑screen is instant, resizing windows is smooth, and the new AI‑powered suggestions — like the Calendar icon that appears when someone messages you about plans — make it feel like the phone is really helping you get work done. It’s the only foldable here where running multiple apps at once feels like a core part of the experience rather than a feature buried in menus. Admittedly, the added height of the Z Fold 8 Ultra makes it better suited to running three or more apps at once, but for two apps side‑by‑side, the Z Fold 8 is brilliant.</p><p>Motorola’s Razr Fold is fast, and the Snapdragon 8 Elite keeps everything responsive, but the multitasking tools aren’t as refined. Split‑screen works and is perfectly usable, but the narrower layout and simpler window controls make it feel more like a phone doing its best rather than a device designed around productivity. It’s great for quick side‑by‑side tasks, but it doesn’t encourage deeper multitasking the way Samsung does.</p><p>Honor’s Magic V6 gives you plenty of screen real estate, and its floating windows and split‑screen options are capable, but the software doesn’t feel as cohesive. Some apps don’t adapt as cleanly, and the workflow lacks the small quality‑of‑life touches that make Samsung’s approach feel effortless. It’s powerful, but not as intuitive.</p><p>Across all three, Samsung is the multitasking standout. Motorola is fast but less flexible, and Honor has the space but not the same polish. If you want a foldable that genuinely feels built for productivity, the Galaxy Z Fold 8 is the one that performed best for me.</p><p><strong>WINNER:</strong> Samsung Galaxy Z Fold 8</p><p><strong>Runner-up:</strong> Motorola Razr Fold</p><h2 id="galaxy-z-fold-8-vs-razr-fold-vs-magic-v6-everyday-use">Galaxy Z Fold 8 vs Razr Fold vs Magic V6: Everyday use</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DFXjpwrQUPfAW54nMm3Zv9" name="Samsung Galaxy Z Fold 8" alt="In-hand image of Samsung Galaxy Z Fold 8 in folded mode" src="https://cdn.mos.cms.futurecdn.net/DFXjpwrQUPfAW54nMm3Zv9-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>Of the three foldables tested here, the Galaxy Z Fold 8 felt the most natural for me to use on a day-to-day basis. It boasts a level of refinement that can only come from several generations of folding devices. The outer display is finally wide enough that you can stay there for most tasks without feeling cramped, and the anti‑reflective coating makes both screens easier to view outdoors. At this stage, you could say that Samsung’s approach to foldables feels predictable, but that’s not a bad thing — it just means that the learning curve that comes with using a foldable is a thing of the past. Apps typically behave how you expect them to, gestures feel natural, and the whole device has a rock-solid level of polish that makes it feel like a normal phone that happens to unfold into something bigger. And though I resisted its new dimensions at first, the Z Fold 8’s passport-like shape and slim design place the device in a perfect sweet spot for both pocketability and unfolded use.</p><p>The Razr Fold is the next best in everyday use. It’s light, easy to carry, and Motorola’s outer display is genuinely helpful for quick interactions. The software stays out of your way, and the phone feels relaxed in a way Samsung’s more structured approach doesn’t. It’s not quite as polished — every now and then an app won’t scale perfectly, or a layout will feel a bit tight — but most of the time it’s a pleasure to use.</p><p>Honor’s Magic V6 is a different story. The hardware is great, but the software often feels like it’s borrowing ideas from iOS, which can make everyday use feel a little unfamiliar if you’ve spent years inside Android’s usual rhythms. Some gestures behave differently than you expect, certain menus have that Apple‑style rounded translucency, and a few system animations lean more toward looking pretty than helping you get somewhere faster. None of this is inherently flawed — it’s just a different approach — but it can feel slightly awkward until you adjust.</p><p><strong>OVERALL WINNER:</strong> Samsung Galaxy Z Fold 8</p><p><strong>Runner-up:</strong> Motorola Razr Fold</p><p>Of the three, the Galaxy Z Fold 8 feels the most natural in everyday use. The Razr Fold is a strong second thanks to its great camera system and friendly, durable design, while the Magic V6 is powerful but feels better suited to fans of Apple’s software. If you want a foldable that behaves like a great phone first and a big screen second, Samsung is the one that gets it right.</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/android-phones/i-pushed-the-latest-foldables-from-samsung-motorola-and-honor-into-a-no-mercy-battle-royale-and-there-can-be-only-one-winner</link>
                                                                            <description>
                            <![CDATA[ Between Samsung’s Galaxy Z Fold 8, Motorola’s Razr Fold and Honor’s Magic V6, which book-style foldable will come out on top? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7C9wTiNvet6mFrF8p9r9xL</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Zoe5EBZnpJePiBGGdBjTB7-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 11 Aug 2026 02:06:50 +0000</pubDate>                                                                                                                                <updated>Thu, 13 Aug 2026 23:29:03 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Phones]]></category>
                                                    <category><![CDATA[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/Zoe5EBZnpJePiBGGdBjTB7-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Three foldables, Samsung Galaxy Z Fold 8, Honor Magic V6 and Motorola Razr Fold on a desk.]]></media:description>                                                            <media:text><![CDATA[Three foldables, Samsung Galaxy Z Fold 8, Honor Magic V6 and Motorola Razr Fold on a desk.]]></media:text>
                                <media:title type="plain"><![CDATA[Three foldables, Samsung Galaxy Z Fold 8, Honor Magic V6 and Motorola Razr Fold on a desk.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Zoe5EBZnpJePiBGGdBjTB7-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The last couple of months have seen the arrival of some seriously high-profile book-style foldable devices, with brands like Samsung, Motorola and Honor looking to set the standard before the imminent release of Apple’s first foldable, which some expect will be called <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra</a>.</p><p>I’ve got 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>, the <a href="https://www.tomsguide.com/phones/android-phones/honor-magic-v6-hands-on-review">Honor Magic V6</a> and the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-fold-review">Motorola Razr Fold</a> lined up for testing — three of the most premium foldables of the year, each aiming for the same spotlight. They all promise big screens, big versatility and big leaps forward, but once you start living with them, the differences come into focus fast.</p><p>I’m putting them through the same tests: design, cameras, battery life, multitasking and everyday use. By the end, one of these foldables will stand out as the clear winner — not because of hype, but because it genuinely earns the spot.</p><div data-model-name="Samsung Galaxy Z Fold 8,Motorola Razr Fold,Honor Magic V6" data-widget-type="multimodelreview" data-product-types="deals"></div><h2 id="galaxy-z-fold-8-vs-razr-fold-vs-magic-v6-design">Galaxy Z Fold 8 vs Razr Fold vs Magic V6: 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cUeuDRhuwnySJ3H8boQrV7" name="foldables face-off 1" alt="Three foldables, Samsung Galaxy Z Fold 8, Honor Magic V6 and Motorola Razr Fold on a desk." src="https://cdn.mos.cms.futurecdn.net/cUeuDRhuwnySJ3H8boQrV7-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>In terms of design, Samsung’s Galaxy Z Fold 8 feels like it’s finally cracked the code on what a book‑style foldable should be, though its short‑and‑wide design won’t be for everyone. Closed, it measures 153.5 x 68.1 x 12.1mm, which makes it noticeably shorter than most slab phones but still basically as wide as a Galaxy S26 Ultra. That width gives the cover screen a more natural feel for typing and scrolling, even if the squat shape takes a day or two to get used to. </p><p>At 201g, the Galaxy Z Fold 8 is the lightest in its class, and when you pair that with sharp, squared‑off corners, it makes the device feel significantly more modern than the other two foldables in this face‑off. As for its hinge, it opens with a clean, confident motion and unfolds almost perfectly flat. On top of that, Samsung’s titanium plate and gapless micro‑perforated display stack have drastically minimised the crease — you can still feel it if you go looking for it, but visually it’s so faint that you forget it’s there within minutes. Combined with a new anti‑reflective coating, the Z Fold 8’s main display looks more like a single sheet of glass than a foldable screen. For me, it’s the first time a foldable has felt this seamless.</p><p>Motorola’s Razr Fold takes a very different path, leaning into toughness rather than elegance. It’s noticeably heavier at 243 grams, and you feel that extra weight the moment you pick it up, but it’s the kind of heft that makes the phone seem more durable. It boasts a titanium inner plate, stainless steel hinge and Gorilla Glass Ceramic 3, all contributing to a chassis that feels reinforced in a way most foldables don’t. Even when opened, the Razr Fold stays impressively thin at 4.55mm, though its crease is far more noticeable than on the Galaxy Z Fold 8. </p><p>The Razr Fold's hinge doesn’t have the snappy, almost playful motion of the Galaxy Z Fold 8 — it’s firmer, more deliberate, built to hold its position rather than glide. And while the Razr Fold technically shares the same IP48/IP49 protection class as Samsung, its overall construction feels more rugged and less fragile. It’s not the most stylish or pocket‑friendly design, but it’s the one that gives you the most confidence that it’ll survive being used like a normal phone rather than a delicate gadget.</p><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="KhD9iSXBnCviywUe788WV7" name="foldables face-off 3" alt="Three foldables, Samsung Galaxy Z Fold 8, Honor Magic V6 and Motorola Razr Fold on a desk." src="https://cdn.mos.cms.futurecdn.net/KhD9iSXBnCviywUe788WV7-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>Meanwhile, Honor’s Magic V6 sits somewhere in the middle. It’s clean, understated, and very thin — 8.75mm closed, 4mm open — and while the huge round camera array keeps it from looking as sleek as Samsung’s device, it still feels more balanced than the Razr Fold. Its “Super Steel” hinge is nicely engineered, and its use of anti‑reflective silicon nitride layers gives both displays a soft, matte look that’s easy on the eyes. The crease is 44% shallower than its predecessor, the Magic V5, though it's still fairly noticeable, both in look and feel. It's also between its competitors in terms of heft, weighing in at 219 grams. </p><p>In terms of visual appeal, the white Magic V6 I'm testing is clean but a little clinical — especially compared to the red vegan leather version shown in our hands‑on review. In other words, it’s sleek, but also a little boring. It also boasts an IP68/IP69 dust and water resistance rating, putting it ahead of its competitors in that regard.</p><p>One more thing — there’s one important feature that both the Magic V6 and the Razr Fold boast over Galaxy Z Fold 8: they both offer stylus support. Better still, each device supports stylus input on both their inner and outer displays. I wasn’t able to test this myself, but that functionality is sure to be a major selling point for anyone still frustrated that Samsung removed the feature from its Fold lineup.</p><p>Still, the Galaxy Z Fold 8 is the only one that nails every essential practical design metric at once: thinness, weight, hinge feel, crease reduction and pocketability. It’s the foldable that feels the most polished and the most effortless to live with day‑to‑day — not because it’s flashy, but because it finally behaves like a normal phone when you want it to, and a big screen when you need it.</p><p><strong>WINNER:</strong> Samsung Galaxy Z Fold 8</p><p><strong>Runner-up: </strong>Honor Magic V6</p><h2 id="galaxy-z-fold-8-vs-razr-fold-vs-magic-v6-cameras">Galaxy Z Fold 8 vs Razr Fold vs Magic V6: 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:4096px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="L4UsuF25LxQuvgzXrAe2YL" name="foldables face-off 4" alt="Three foldables from left to right, Motorola Razr Fold, Honor Magic V6 and Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/L4UsuF25LxQuvgzXrAe2YL-1920-80.jpg" mos="" align="middle" fullscreen="" width="4096" height="2304" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Given that all three foldables are premium devices, it’s not surprising that they can all take good photos. That said, one consistently delivered great snaps in my testing. Samsung plays it safe, Motorola pushes ahead in ways I didn’t expect, and Honor lands somewhere in the middle — but which one takes the photography crown?</p><div ><table><tbody><tr><td class="firstcol " ><p><strong></strong></p></td><td  ><p><strong>Samsung Galaxy Z Fold 8</strong></p></td><td  ><p><strong>Motorola Razr Fold</strong></p></td><td  ><p><strong>Honor Magic V6</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Main Camera</strong></p></td><td  ><p>50MP (f/1.8)</p></td><td  ><p>50MP (f/1.6)</p></td><td  ><p>50MP (f/1.6)</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/2.0)</p></td><td  ><p>50MP (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Telephoto Cameras</strong></p></td><td  ><p>N/A</p></td><td  ><p>50MP (f/2.4)(periscope telephoto)</p></td><td  ><p>64MP (f/2.5) (periscope telephoto)</p></td></tr><tr><td class="firstcol " ><p><strong>Zoom Range</strong></p></td><td  ><p>Up to 10x Digital Zoom</p></td><td  ><p>Up to 100x Super Zoom pro, 3x Optical Zoom</p></td><td  ><p>Up to 100x Digital Zoom, 3x Optical Zoom</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie Cameras</strong></p></td><td  ><p>Cover: 10MP (f/2.2) Inner: 10 MP (f/2.2)</p></td><td  ><p>Cover: 20MP (f/2.4) Inner: 32MP (f/2.4)</p></td><td  ><p>Cover: 20MP (f/2.2)<br>Inner: 20MP (f/2.2)</p></td></tr></tbody></table></div><p>Samsung’s Galaxy Z Fold 8 delivers a camera experience that feels familiar but polished. The two 50MP rear cameras produce rich colors and excellent dynamic range, and the upgraded ultrawide is noticeably sharper than last year’s model. Low‑light photos also come out brighter and sharper, with better control over noise and blown‑out highlights. The only real drawback is zoom — without a telephoto lens, detail drops off quickly once you push past 4x, making the Galaxy Z Fold 8 Ultra a better option for those who value that more.</p><p>The Motorola Razr Fold is the one that genuinely surprised me. Its triple‑50MP setup produces crisp, vibrant photos with far more texture than I expected, and the 3x optical telephoto instantly gives it an edge over the other two. Motorola’s Super Zoom Pro also works better than I anticipated, keeping long‑range shots surprisingly clean. Low‑light performance is strong as well, with balanced exposures that avoid Samsung’s occasional brightness push.</p><p>Honor’s Magic V6 sits somewhere between the other two. The hardware is strong — a 50MP main, 50MP ultrawide and a 64MP periscope telephoto with 3x optical zoom — and Honor’s AiMAGE Color Engine generally produces natural, accurate colours. The telephoto lens gives the V6 decent reach, but the tuning doesn’t feel quite as confident as Samsung’s or as punchy as Motorola’s. I also noticed a bit of artificial “sweetening” in portrait shots, with skin smoothing that’s more aggressive than I’d prefer. It’s a capable camera system, just not the standout feature of the phone.</p><p>Across all three, the Razr Fold still comes out on top. Honor’s 64MP periscope telephoto gives the Magic V6 real reach, and Samsung remains strong in dynamic range and low‑light, but Motorola’s results are consistently sharper, cleaner and more confident across every scenario. It’s the foldable I’d reach for if cameras matter most.</p><p><strong>WINNER: </strong>Motorola Razr Fold</p><p><strong>Runner-up: </strong>Honor Magic V6</p><h2 id="galaxy-z-fold-8-vs-razr-fold-vs-magic-v6-battery-life">Galaxy Z Fold 8 vs Razr Fold vs Magic V6: 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YDHqDVy3SYnAbK3EpsDEUS" name="Motorola Razr Fold" alt="In-hand image of the Motorola Razr Fold in unfolded mode" src="https://cdn.mos.cms.futurecdn.net/YDHqDVy3SYnAbK3EpsDEUS-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>Battery life is one of the biggest practical differences among these three foldables. All of them can comfortably last a day, but how much they have left at bedtime varies. Samsung finally feels reliable, Motorola pushes endurance further than anyone else, and Honor’s huge battery delivers surprisingly strong results in my own testing.</p><p>Samsung’s Galaxy Z Fold 8 is the most balanced of the bunch. The move to a 4,800 mAh silicon‑carbon battery pays off: in Tom’s Guide’s 5G web‑surfing test, it lasted 12 hours and 19 minutes, a solid jump from the Fold 7’s 10:44. In day‑to‑day use, I could get through a full day of email, photos and music and still end up around the 50% mark. Charging is faster too — 70% in 30 minutes — and unlike the others, you can hit those speeds with any standard fast-charging adapter you’ll find on Amazon, not a proprietary brick.</p><p>The Motorola Razr Fold is the endurance monster. Motorola fits a 6,000 mAh battery inside a body that doesn’t feel any heavier, and the results are wild. Tom’s Guide measured 14 hours and 44 minutes, the best battery life of any book‑style foldable they’ve tested. Charging is equally impressive: 42% in 15 minutes and 75% in 30 minutes with 80W wired charging — but you’ll need either Motorola’s 80W TurboPower charger, which isn’t included in the box in Australia and which I don’t have access to, or a super fast charging adapter (100w or above, according to online users) to reach those headline numbers.</p><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="iqYxn9huHzbqNdt2b8AzDY" name="Honor Magic V6" alt="In-hand image of Honor Magic V6 in unfolded form" src="https://cdn.mos.cms.futurecdn.net/iqYxn9huHzbqNdt2b8AzDY-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>Honor’s Magic V6 goes even bigger in capacity with a 6,660 mAh silicon‑carbon battery, the largest of any foldable right now. Tom’s Guide hasn’t run its full battery test yet, but in my own PCMark Work 3.0 battery test, the V6 lasted just under 14 hours, putting it right in line with Motorola’s excellent endurance. It also supports 80W wired and 66W wireless charging, though you’ll need Honor‑approved chargers to reach those peak speeds. It’s a genuinely long‑lasting device, and the huge battery pays off.</p><p>Across all three, the Razr Fold still feels like the endurance king thanks to its combination of runtime and charging speed. Samsung delivers dependable all‑day life with faster top‑ups on standard chargers, and Honor’s massive battery gives it impressive stamina, but the Razr Fold is the foldable I’d trust most when I’m away from a charger.</p><p><strong>WINNER: </strong>Motorola Razr Fold</p><p><strong>Runner-up: </strong>Honor Magic V6</p><h2 id="galaxy-z-fold-8-vs-razr-fold-vs-magic-v6-multitasking">Galaxy Z Fold 8 vs Razr Fold vs Magic V6: Multitasking</h2><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="uPTKMQxuUtji6eqJK93vBf" name="Galaxy Z Fold 8 multitasking" alt="Unfolded Samsung Galaxy Z Fold 8 on desk demonstrating multitasking capability" src="https://cdn.mos.cms.futurecdn.net/uPTKMQxuUtji6eqJK93vBf-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>When it comes to multitasking, what really separates these three foldables isn’t the size of their screens — it’s the software experience. Samsung is the only one that feels like it’s been iterating on multitasking for years, and the Z Fold 8 is a testament to that. The moment you open two apps side‑by‑side, everything snaps into place with a kind of smoothness that the Razr Fold and Magic V6 don’t quite match.</p><p>On the Galaxy Z Fold 8, multitasking feels natural. The wider 4:3 inner display gives apps room to breathe, but it’s Samsung’s software polish that makes the difference. Dragging an app into split‑screen is instant, resizing windows is smooth, and the new AI‑powered suggestions — like the Calendar icon that appears when someone messages you about plans — make it feel like the phone is really helping you get work done. It’s the only foldable here where running multiple apps at once feels like a core part of the experience rather than a feature buried in menus. Admittedly, the added height of the Z Fold 8 Ultra makes it better suited to running three or more apps at once, but for two apps side‑by‑side, the Z Fold 8 is brilliant.</p><p>Motorola’s Razr Fold is fast, and the Snapdragon 8 Elite keeps everything responsive, but the multitasking tools aren’t as refined. Split‑screen works and is perfectly usable, but the narrower layout and simpler window controls make it feel more like a phone doing its best rather than a device designed around productivity. It’s great for quick side‑by‑side tasks, but it doesn’t encourage deeper multitasking the way Samsung does.</p><p>Honor’s Magic V6 gives you plenty of screen real estate, and its floating windows and split‑screen options are capable, but the software doesn’t feel as cohesive. Some apps don’t adapt as cleanly, and the workflow lacks the small quality‑of‑life touches that make Samsung’s approach feel effortless. It’s powerful, but not as intuitive.</p><p>Across all three, Samsung is the multitasking standout. Motorola is fast but less flexible, and Honor has the space but not the same polish. If you want a foldable that genuinely feels built for productivity, the Galaxy Z Fold 8 is the one that performed best for me.</p><p><strong>WINNER:</strong> Samsung Galaxy Z Fold 8</p><p><strong>Runner-up:</strong> Motorola Razr Fold</p><h2 id="galaxy-z-fold-8-vs-razr-fold-vs-magic-v6-everyday-use">Galaxy Z Fold 8 vs Razr Fold vs Magic V6: Everyday use</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DFXjpwrQUPfAW54nMm3Zv9" name="Samsung Galaxy Z Fold 8" alt="In-hand image of Samsung Galaxy Z Fold 8 in folded mode" src="https://cdn.mos.cms.futurecdn.net/DFXjpwrQUPfAW54nMm3Zv9-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>Of the three foldables tested here, the Galaxy Z Fold 8 felt the most natural for me to use on a day-to-day basis. It boasts a level of refinement that can only come from several generations of folding devices. The outer display is finally wide enough that you can stay there for most tasks without feeling cramped, and the anti‑reflective coating makes both screens easier to view outdoors. At this stage, you could say that Samsung’s approach to foldables feels predictable, but that’s not a bad thing — it just means that the learning curve that comes with using a foldable is a thing of the past. Apps typically behave how you expect them to, gestures feel natural, and the whole device has a rock-solid level of polish that makes it feel like a normal phone that happens to unfold into something bigger. And though I resisted its new dimensions at first, the Z Fold 8’s passport-like shape and slim design place the device in a perfect sweet spot for both pocketability and unfolded use.</p><p>The Razr Fold is the next best in everyday use. It’s light, easy to carry, and Motorola’s outer display is genuinely helpful for quick interactions. The software stays out of your way, and the phone feels relaxed in a way Samsung’s more structured approach doesn’t. It’s not quite as polished — every now and then an app won’t scale perfectly, or a layout will feel a bit tight — but most of the time it’s a pleasure to use.</p><p>Honor’s Magic V6 is a different story. The hardware is great, but the software often feels like it’s borrowing ideas from iOS, which can make everyday use feel a little unfamiliar if you’ve spent years inside Android’s usual rhythms. Some gestures behave differently than you expect, certain menus have that Apple‑style rounded translucency, and a few system animations lean more toward looking pretty than helping you get somewhere faster. None of this is inherently flawed — it’s just a different approach — but it can feel slightly awkward until you adjust.</p><p><strong>OVERALL WINNER:</strong> Samsung Galaxy Z Fold 8</p><p><strong>Runner-up:</strong> Motorola Razr Fold</p><p>Of the three, the Galaxy Z Fold 8 feels the most natural in everyday use. The Razr Fold is a strong second thanks to its great camera system and friendly, durable design, while the Magic V6 is powerful but feels better suited to fans of Apple’s software. If you want a foldable that behaves like a great phone first and a big screen second, Samsung is the one that gets it right.</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 ran 10K with the Galaxy Watch Ultra 2 and my trusty Apple Watch Ultra 2 — here's 3 things Samsung did better (and 1 it didn't) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I've been wearing an Apple Watch to track my runs ever since <a href="https://www.tomsguide.com/opinion/im-ditching-fitbit-for-the-apple-watch-after-10-years-heres-why">I ditched Fitbit a few years ago</a>, and I've settled into a good rhythm with one of the <a href="https://www.tomsguide.com/best-picks/best-apple-watch">best Apple Watches</a>, the <a href="https://www.tomsguide.com/reviews/apple-watch-ultra-2">Apple Watch Ultra 2</a>, since 2024.</p><p>However, before considering a potential upgrade to the rumored <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-all-the-design-health-and-battery-life-rumors-so-far">Apple Watch Ultra 4</a> (if it breaks cover), I wanted to see what Samsung's latest — the <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Samsung Galaxy Watch Ultra 2</a> — had to offer. So I borrowed the press sample <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">loaned to the Tom's Guide fitness team</a>, strapped it to my right wrist (I wore the Apple Watch on my left) and clocked up my usual 10K (6-mile) run.  </p><p>The watches are unerringly similar: both sport a rugged design, a shortcut button (Action Button on the Apple Watch, Quick Button on the Galaxy Watch) for starting an exercise quickly and dual-frequency GPS for accurate location tracking.</p><p>Of course, one run isn't enough to say whether one is better than the other, but there were a few things that immediately stood out about Samsung's effort. Before we get to them, here's the data each watch captured.     </p><div ><table><caption>Galaxy Watch Ultra 2 vs Apple Watch Ultra 2: The results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Watch Ultra 2</strong></p></td><td  ><p><strong>Apple Watch Ultra 2</strong></p></td></tr><tr><td class="firstcol " ><p>Duration</p></td><td  ><p>50:14</p></td><td  ><p>52:54</p></td></tr><tr><td class="firstcol " ><p>Distance</p></td><td  ><p>10.05 km </p></td><td  ><p>10.15 km</p></td></tr><tr><td class="firstcol " ><p>Active calories</p></td><td  ><p>722</p></td><td  ><p>682</p></td></tr><tr><td class="firstcol " ><p>Avg pace</p></td><td  ><p>04'59" per km</p></td><td  ><p>05'13" per km</p></td></tr><tr><td class="firstcol " ><p>Avg cadence</p></td><td  ><p>164 spm</p></td><td  ><p>155 spm </p></td></tr><tr><td class="firstcol " ><p>Avg heart rate</p></td><td  ><p>135 bpm</p></td><td  ><p>135 bpm</p></td></tr><tr><td class="firstcol " ><p>Elevation gain</p></td><td  ><p>106 meters</p></td><td  ><p>107 meters</p></td></tr></tbody></table></div><p>As you can see from the table above, there are some discrepancies in a few areas, which I can explain. I tend to mix running with <a href="https://www.tomsguide.com/wellness/workouts/a-scientist-says-you-only-need-these-2-calisthenics-exercises-to-build-a-strong-upper-body-and-you-can-stop-doing-the-rest">calisthenics training</a> and aim to complete 100 push-ups during each run. </p><p>On the Galaxy Watch Ultra 2, I had auto-pause enabled, which kicked in every time I dropped down to rattle off some push-ups. That explains the difference in duration, distance, pace and cadence (since the Apple Watch Ultra 2 just kept rolling), but I'm not sure why the active calorie count is so different between the two.</p><p>Leaving the stats behind and progressing on to good old-fashioned subjectivity, here are three things I really liked about the Galaxy Watch Ultra 2 and one where my trusty Apple Watch Ultra 2 still wins out.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePa78W"></div>                            </div>                            <script src="https://kwizly.com/embed/ePa78W.js" async></script><h3 class="article-body__section" id="section-3-things-samsung-did-better"><span>3 things Samsung did better</span></h3><h2 id="the-bright-screen">The bright 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="yrYEvY6H9hYuJkgnDAjfmU" name="Galaxy Watch Ultra 2 vs Apple Watch Ultra 2" alt="The Samsung Galaxy Watch Ultra 2 and Apple Watch Ultra 2 on a wrist outside" src="https://cdn.mos.cms.futurecdn.net/yrYEvY6H9hYuJkgnDAjfmU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Jeff Parsons / Tom's Guide)</span></figcaption></figure><p>Samsung has given the Galaxy Watch Ultra 2 a 1.52-inch Super AMOLED display with up to 5,000 nits of peak brightness. The company is known for making display tech, and over the course of the run I was constantly impressed with how legible the display was. It adjusted smoothly between sunlight and shade, and I never had to worry about glare on the screen.</p><p>Literally and figuratively, the Galaxy Watch Ultra 2 outshone the 3,000-nit LTPO OLED screen on my Apple Watch Ultra 2. When you couple this with the fact that Samsung's workout display shows fewer metrics in a larger font size, it means the Galaxy Watch Ultra 2 wins the glance-ability contest. </p><p>I also like how your current heart rate zone is displayed with a rainbow color scale at the bottom, which pops on the AMOLED screen. While you get more pixels on the Galaxy Watch Ultra 2 (502 × 410 vs 498 × 498 pixels on the Apple Watch Ultra 2), this didn't make as much of a difference to me as the brightness.</p><h2 id="the-strong-haptics">The strong haptics</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yAqHCmRaCJD4DJJukXw2uU" name="Galaxy Watch Ultra 2 vs Apple Watch Ultra 2" alt="The Samsung Galaxy Watch Ultra 2 and Apple Watch Ultra 2 on a wrist outside" src="https://cdn.mos.cms.futurecdn.net/yAqHCmRaCJD4DJJukXw2uU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Jeff Parsons / Tom's Guide)</span></figcaption></figure><p>Apple calls the haptic technology inside the Apple Watch (and iPhone) the "Taptic Engine". But based on my run with both watches, I'd rate the horsepower inside the Galaxy Watch Ultra 2 as higher. </p><p>I haven't done a teardown of each model, so I can't say for certain which vibration motor is larger or stronger, but I felt that buzz on my right wrist plenty more than the one on my left. I think it's important too, since I rely on the haptics to alert me to each kilometer I cover. It's not as much of a necessity on a small run, but if you're getting to half-marathon or marathon territory, it becomes indispensable.</p><p>Even without haptics, the Galaxy Watch Ultra 2 called out my splits and pacing from the built-in speaker. It was loud enough (albeit a little robotic) to hear comfortably without ever having to raise my wrist. I disabled this same feature (called Voice Feedback) on my Apple Watch Ultra 2 a long while ago, so I don't have a comparison from this run. But I'll make sure to re-enable it again on my next one to see if the Apple Watch Ultra 2 can hold up in this regard.</p><h2 id="the-comfortable-strap">The comfortable strap</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Qbizyk4omkp97CDYfxuduU" name="Galaxy Watch Ultra 2 vs Apple Watch Ultra 2" alt="The Samsung Galaxy Watch Ultra 2 and Apple Watch Ultra 2 on a wrist outside" src="https://cdn.mos.cms.futurecdn.net/Qbizyk4omkp97CDYfxuduU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Jeff Parsons / Tom's Guide)</span></figcaption></figure><p>It seems like a small thing to mention, especially since they're interchangeable, but the bundled Marine Band attached to the Galaxy Watch Ultra 2 has caught my attention. Samsung sells this separately for $90, and in my experience, it's an extremely comfortable strap that sat snugly on my wrist during the run. </p><p>It didn't slide around when I started to sweat thanks to the channel on the underside that encourages airflow. My Apple Watch Ultra 2's Trail Loop band, by comparison, was drenched in sweat by the end of the run.</p><p>While I never wore Samsung's original Marine Band, this latest version reduces the weight by 10g (0.35oz) by, among other things, switching the keeper from titanium to rubber. </p><p>Overall, the band is slimmer and as a result more flexible on the wrist. Even if you don't plan on upgrading to the Galaxy Watch Ultra 2 from the first generation, I'd encourage looking into this strap as a purchase. It uses Samsung’s Dynamic Lug band attachment system and fits the original Galaxy Watch Ultra just as well.</p><p>I have an affinity for chunky watches, so the Galaxy Watch Ultra's 47.4 x 47.4 x 12.1 mm dimensions don't bother me — but it's definitely a watch I'd rather wear for running than for sleeping.</p><h3 class="article-body__section" id="section-1-thing-it-didn-t-like"><span>1 thing it didn't like</span></h3><h2 id="apple-s-digital-crown-still-reigns">Apple's Digital Crown still reigns</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bhNGjh6Fm5CSQb5H97Muw4" name="TG_Apple-Watch-Ultra.jpg" alt="Apple Watch Ultra" src="https://cdn.mos.cms.futurecdn.net/bhNGjh6Fm5CSQb5H97Muw4-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>It's been hot this summer. Like, really hot. But I live in the U.K., where a lot of the time it's cold and/or rainy. This can often necessitate wearing gloves while out running, hiking, or cycling and if there's one thing I've learned, it's that physical controls always win out where gloves are concerned. </p><p>During a run, if I want to raise or lower the volume of my audio or scroll through my metrics, nothing beats the tactile feeling of Apple's Digital Crown. The tiny little grooves etched into the metal can be felt through running gloves, and you don't even need to look at the Apple Watch to use it. </p><p>Samsung has given the Galaxy Watch Ultra 2 a Touch Bezel feature you can activate in the settings, letting you run your finger around the edge of the display to scroll through the watch's functions. There are some vibration haptics that accompany this, but it's just nowhere near as easy or as satisfying as Apple's solution. </p><p>Even a physical rotating bezel as you'd find on a dive watch would have been better. I haven't used this feature in the heavy rain or snow, but I can't see it faring as well as the Digital Crown when you need to interact with your smartwatch with cold, numb fingers.</p><h3 class="article-body__section" id="section-final-thoughts"><span>Final thoughts</span></h3><div class="product"><a data-dimension112="cd237b10-90e6-11f1-9e82-936e5d36eaae" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: for $699 @ Amazon" data-dimension48="Galaxy Watch Ultra 2: for $699 @ Amazon" href="https://www.amazon.com/Samsung-Galaxy-Ultra2-Titanium-Smartwatch/dp/B0H6NRPGT7" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1265px;"><p class="vanilla-image-block" style="padding-top:86.72%;"><img id="2QaDFAJjvKSmp7DubftogQ" name="Galaxy Watch Ultra 2 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2QaDFAJjvKSmp7DubftogQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1265" height="1097" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Watch Ultra 2: </strong><a href="https://www.amazon.com/Samsung-Galaxy-Ultra2-Titanium-Smartwatch/dp/B0H6NRPGT7" target="_blank" rel="nofollow" data-dimension112="cd237b10-90e6-11f1-9e82-936e5d36eaae" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: for $699 @ Amazon" data-dimension48="Galaxy Watch Ultra 2: for $699 @ Amazon" data-dimension25=""><strong>for $699 @ Amazon</strong></a><br>Amazon is offering a free $100 Amazon gift card when you buy your Galaxy Watch Ultra 2 at Amazon. <a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Ultra2-Titanium-Smartwatch/dp/B0H6NRPGT7" target="_blank" rel="nofollow" data-dimension112="cd237b10-90e6-11f1-9e82-936e5d36eaae" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: for $699 @ Amazon" data-dimension48="Galaxy Watch Ultra 2: for $699 @ Amazon" data-dimension25="">View Deal</a></p></div><p>Coming away from a single run with the two watches, there's no question the Galaxy Watch Ultra 2 is the superior device. It's brighter and more performant with greater storage and a longer battery life. </p><p>It also undercut the Apple Watch Ultra 2 at launch with a price of $699 to Apple's $799 (the current price of the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-review">Apple Watch Ultra 3</a>), so it wins out if you're on a budget, too. Of course, you can currently find the Ultra 2 at a reduced price since it's been usurped by the Ultra 3, but for the sake of comparing apples to...err...apples? Samsung wins on price.</p><p>But it's not a <em>complete</em> victory. For instance, I like that the summary of your run stays up longer on the Apple Watch Ultra 2 than it does on the Galaxy Watch Ultra. Also, while the Galaxy Watch Ultra 2 is a good-looking timepiece, I'm not entirely sold on the square-circle hybrid case design.</p><p>My final takeaway is to see what the Apple Watch Ultra 4 holds if and when it launches in a couple of months. Then I'll decide whether to keep my affinity with Apple going for another year or jump ship over to Samsung's side for future workouts.</p><p>What's your wearable of choice for recording your activity? Let me know if you prefer Apple or Samsung (or split the difference and go with Garmin) in the comments below.</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/DbS6rNNljkj/" target="_blank">A post shared by Tom's Guide (@tomsguide)</a></p><p>A photo posted by </p></blockquote></div><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/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/wellness/fitness-trackers/join-our-wearable-tech-live-q-and-a-should-you-ditch-the-smartwatch-for-an-oura-whoop-garmin-cirqa-or-fitbit-air">Garmin Cirqa vs Fitbit Air vs Whoop vs Oura Ring: Our fitness experts are helping you pick the perfect fitness tracker</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-manually-counted-4-000-steps-to-test-the-apple-watch-ultra-3-vs-samsung-galaxy-watch-ultra-2-and-samsung-wins-the-accuracy-battle-with-better-elevation-data-too">I walked 4,000 steps with the Apple Watch Ultra 3 vs Samsung Galaxy Watch Ultra 2 — and the winning margin was razor-thin</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/smartwatches/i-ran-10k-with-the-galaxy-watch-ultra-2-and-my-trusty-apple-watch-ultra-2-heres-3-things-samsung-did-better-and-1-it-didnt</link>
                                                                            <description>
                            <![CDATA[ The Galaxy Watch Ultra 2 sat in on my 10K run alongside the Apple Watch Ultra 2, and it instantly impressed me in 3 ways. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LsSVrN6yo6RvgCs8REhbbN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7XrXkjagUGny2GBtjCCLuU-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 10 Aug 2026 05:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ jeff.parsons@futurenet.com (Jeff Parsons) ]]></author>                    <dc:creator><![CDATA[ Jeff Parsons ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/7z3UTGGrmSokMKxTWHmhjX-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jeff is U.K. Editor-in-Chief for Tom’s Guide looking after the day-to-day output of the site’s British contingent. &lt;/p&gt;&lt;p&gt;Rising early and heading straight for the coffee machine, Jeff loves nothing more than dialling into the zeitgeist of the day’s tech news. A journalist for over a decade, he&#039;s travelled around the world testing and reviewing any gadget he can get his hands on.&lt;/p&gt;&lt;p&gt;Before joining the team at Tom’s Guide, Jeff covered technology and science for two of the U.K.’s biggest national news sites: Metro.co.uk and the Daily Mirror. Memorable moments include getting lost in Vienna in an electric Audi, touring Lockheed Martin’s mile-long jet factory in Fort Worth and filming a Netflix documentary about Elon Musk in West London.&lt;/p&gt;&lt;p&gt;When not plugged into the current news agenda, editing or commissioning a series of articles or debating the merits of Apple vs Android, Jeff can usually be found out for a run trying to shave precious seconds off his PB. Or lifting weights in a vain attempt to offset the ageing process.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/7XrXkjagUGny2GBtjCCLuU-1920-80.jpg">
                                                            <media:credit><![CDATA[Jeff Parsons / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Samsung Galaxy Watch Ultra 2 and Apple Watch Ultra 2 on a wrist outside]]></media:description>                                                            <media:text><![CDATA[The Samsung Galaxy Watch Ultra 2 and Apple Watch Ultra 2 on a wrist outside]]></media:text>
                                <media:title type="plain"><![CDATA[The Samsung Galaxy Watch Ultra 2 and Apple Watch Ultra 2 on a wrist outside]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7XrXkjagUGny2GBtjCCLuU-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I've been wearing an Apple Watch to track my runs ever since <a href="https://www.tomsguide.com/opinion/im-ditching-fitbit-for-the-apple-watch-after-10-years-heres-why">I ditched Fitbit a few years ago</a>, and I've settled into a good rhythm with one of the <a href="https://www.tomsguide.com/best-picks/best-apple-watch">best Apple Watches</a>, the <a href="https://www.tomsguide.com/reviews/apple-watch-ultra-2">Apple Watch Ultra 2</a>, since 2024.</p><p>However, before considering a potential upgrade to the rumored <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-all-the-design-health-and-battery-life-rumors-so-far">Apple Watch Ultra 4</a> (if it breaks cover), I wanted to see what Samsung's latest — the <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Samsung Galaxy Watch Ultra 2</a> — had to offer. So I borrowed the press sample <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">loaned to the Tom's Guide fitness team</a>, strapped it to my right wrist (I wore the Apple Watch on my left) and clocked up my usual 10K (6-mile) run.  </p><p>The watches are unerringly similar: both sport a rugged design, a shortcut button (Action Button on the Apple Watch, Quick Button on the Galaxy Watch) for starting an exercise quickly and dual-frequency GPS for accurate location tracking.</p><p>Of course, one run isn't enough to say whether one is better than the other, but there were a few things that immediately stood out about Samsung's effort. Before we get to them, here's the data each watch captured.     </p><div ><table><caption>Galaxy Watch Ultra 2 vs Apple Watch Ultra 2: The results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Watch Ultra 2</strong></p></td><td  ><p><strong>Apple Watch Ultra 2</strong></p></td></tr><tr><td class="firstcol " ><p>Duration</p></td><td  ><p>50:14</p></td><td  ><p>52:54</p></td></tr><tr><td class="firstcol " ><p>Distance</p></td><td  ><p>10.05 km </p></td><td  ><p>10.15 km</p></td></tr><tr><td class="firstcol " ><p>Active calories</p></td><td  ><p>722</p></td><td  ><p>682</p></td></tr><tr><td class="firstcol " ><p>Avg pace</p></td><td  ><p>04'59" per km</p></td><td  ><p>05'13" per km</p></td></tr><tr><td class="firstcol " ><p>Avg cadence</p></td><td  ><p>164 spm</p></td><td  ><p>155 spm </p></td></tr><tr><td class="firstcol " ><p>Avg heart rate</p></td><td  ><p>135 bpm</p></td><td  ><p>135 bpm</p></td></tr><tr><td class="firstcol " ><p>Elevation gain</p></td><td  ><p>106 meters</p></td><td  ><p>107 meters</p></td></tr></tbody></table></div><p>As you can see from the table above, there are some discrepancies in a few areas, which I can explain. I tend to mix running with <a href="https://www.tomsguide.com/wellness/workouts/a-scientist-says-you-only-need-these-2-calisthenics-exercises-to-build-a-strong-upper-body-and-you-can-stop-doing-the-rest">calisthenics training</a> and aim to complete 100 push-ups during each run. </p><p>On the Galaxy Watch Ultra 2, I had auto-pause enabled, which kicked in every time I dropped down to rattle off some push-ups. That explains the difference in duration, distance, pace and cadence (since the Apple Watch Ultra 2 just kept rolling), but I'm not sure why the active calorie count is so different between the two.</p><p>Leaving the stats behind and progressing on to good old-fashioned subjectivity, here are three things I really liked about the Galaxy Watch Ultra 2 and one where my trusty Apple Watch Ultra 2 still wins out.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePa78W"></div>                            </div>                            <script src="https://kwizly.com/embed/ePa78W.js" async></script><h3 class="article-body__section" id="section-3-things-samsung-did-better"><span>3 things Samsung did better</span></h3><h2 id="the-bright-screen">The bright 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="yrYEvY6H9hYuJkgnDAjfmU" name="Galaxy Watch Ultra 2 vs Apple Watch Ultra 2" alt="The Samsung Galaxy Watch Ultra 2 and Apple Watch Ultra 2 on a wrist outside" src="https://cdn.mos.cms.futurecdn.net/yrYEvY6H9hYuJkgnDAjfmU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Jeff Parsons / Tom's Guide)</span></figcaption></figure><p>Samsung has given the Galaxy Watch Ultra 2 a 1.52-inch Super AMOLED display with up to 5,000 nits of peak brightness. The company is known for making display tech, and over the course of the run I was constantly impressed with how legible the display was. It adjusted smoothly between sunlight and shade, and I never had to worry about glare on the screen.</p><p>Literally and figuratively, the Galaxy Watch Ultra 2 outshone the 3,000-nit LTPO OLED screen on my Apple Watch Ultra 2. When you couple this with the fact that Samsung's workout display shows fewer metrics in a larger font size, it means the Galaxy Watch Ultra 2 wins the glance-ability contest. </p><p>I also like how your current heart rate zone is displayed with a rainbow color scale at the bottom, which pops on the AMOLED screen. While you get more pixels on the Galaxy Watch Ultra 2 (502 × 410 vs 498 × 498 pixels on the Apple Watch Ultra 2), this didn't make as much of a difference to me as the brightness.</p><h2 id="the-strong-haptics">The strong haptics</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yAqHCmRaCJD4DJJukXw2uU" name="Galaxy Watch Ultra 2 vs Apple Watch Ultra 2" alt="The Samsung Galaxy Watch Ultra 2 and Apple Watch Ultra 2 on a wrist outside" src="https://cdn.mos.cms.futurecdn.net/yAqHCmRaCJD4DJJukXw2uU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Jeff Parsons / Tom's Guide)</span></figcaption></figure><p>Apple calls the haptic technology inside the Apple Watch (and iPhone) the "Taptic Engine". But based on my run with both watches, I'd rate the horsepower inside the Galaxy Watch Ultra 2 as higher. </p><p>I haven't done a teardown of each model, so I can't say for certain which vibration motor is larger or stronger, but I felt that buzz on my right wrist plenty more than the one on my left. I think it's important too, since I rely on the haptics to alert me to each kilometer I cover. It's not as much of a necessity on a small run, but if you're getting to half-marathon or marathon territory, it becomes indispensable.</p><p>Even without haptics, the Galaxy Watch Ultra 2 called out my splits and pacing from the built-in speaker. It was loud enough (albeit a little robotic) to hear comfortably without ever having to raise my wrist. I disabled this same feature (called Voice Feedback) on my Apple Watch Ultra 2 a long while ago, so I don't have a comparison from this run. But I'll make sure to re-enable it again on my next one to see if the Apple Watch Ultra 2 can hold up in this regard.</p><h2 id="the-comfortable-strap">The comfortable strap</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Qbizyk4omkp97CDYfxuduU" name="Galaxy Watch Ultra 2 vs Apple Watch Ultra 2" alt="The Samsung Galaxy Watch Ultra 2 and Apple Watch Ultra 2 on a wrist outside" src="https://cdn.mos.cms.futurecdn.net/Qbizyk4omkp97CDYfxuduU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Jeff Parsons / Tom's Guide)</span></figcaption></figure><p>It seems like a small thing to mention, especially since they're interchangeable, but the bundled Marine Band attached to the Galaxy Watch Ultra 2 has caught my attention. Samsung sells this separately for $90, and in my experience, it's an extremely comfortable strap that sat snugly on my wrist during the run. </p><p>It didn't slide around when I started to sweat thanks to the channel on the underside that encourages airflow. My Apple Watch Ultra 2's Trail Loop band, by comparison, was drenched in sweat by the end of the run.</p><p>While I never wore Samsung's original Marine Band, this latest version reduces the weight by 10g (0.35oz) by, among other things, switching the keeper from titanium to rubber. </p><p>Overall, the band is slimmer and as a result more flexible on the wrist. Even if you don't plan on upgrading to the Galaxy Watch Ultra 2 from the first generation, I'd encourage looking into this strap as a purchase. It uses Samsung’s Dynamic Lug band attachment system and fits the original Galaxy Watch Ultra just as well.</p><p>I have an affinity for chunky watches, so the Galaxy Watch Ultra's 47.4 x 47.4 x 12.1 mm dimensions don't bother me — but it's definitely a watch I'd rather wear for running than for sleeping.</p><h3 class="article-body__section" id="section-1-thing-it-didn-t-like"><span>1 thing it didn't like</span></h3><h2 id="apple-s-digital-crown-still-reigns">Apple's Digital Crown still reigns</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bhNGjh6Fm5CSQb5H97Muw4" name="TG_Apple-Watch-Ultra.jpg" alt="Apple Watch Ultra" src="https://cdn.mos.cms.futurecdn.net/bhNGjh6Fm5CSQb5H97Muw4-1920-80.jpg" mos="" align="middle" fullscreen="" width="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>It's been hot this summer. Like, really hot. But I live in the U.K., where a lot of the time it's cold and/or rainy. This can often necessitate wearing gloves while out running, hiking, or cycling and if there's one thing I've learned, it's that physical controls always win out where gloves are concerned. </p><p>During a run, if I want to raise or lower the volume of my audio or scroll through my metrics, nothing beats the tactile feeling of Apple's Digital Crown. The tiny little grooves etched into the metal can be felt through running gloves, and you don't even need to look at the Apple Watch to use it. </p><p>Samsung has given the Galaxy Watch Ultra 2 a Touch Bezel feature you can activate in the settings, letting you run your finger around the edge of the display to scroll through the watch's functions. There are some vibration haptics that accompany this, but it's just nowhere near as easy or as satisfying as Apple's solution. </p><p>Even a physical rotating bezel as you'd find on a dive watch would have been better. I haven't used this feature in the heavy rain or snow, but I can't see it faring as well as the Digital Crown when you need to interact with your smartwatch with cold, numb fingers.</p><h3 class="article-body__section" id="section-final-thoughts"><span>Final thoughts</span></h3><div class="product"><a data-dimension112="cd237b10-90e6-11f1-9e82-936e5d36eaae" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: for $699 @ Amazon" data-dimension48="Galaxy Watch Ultra 2: for $699 @ Amazon" href="https://www.amazon.com/Samsung-Galaxy-Ultra2-Titanium-Smartwatch/dp/B0H6NRPGT7" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1265px;"><p class="vanilla-image-block" style="padding-top:86.72%;"><img id="2QaDFAJjvKSmp7DubftogQ" name="Galaxy Watch Ultra 2 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2QaDFAJjvKSmp7DubftogQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1265" height="1097" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Watch Ultra 2: </strong><a href="https://www.amazon.com/Samsung-Galaxy-Ultra2-Titanium-Smartwatch/dp/B0H6NRPGT7" target="_blank" rel="nofollow" data-dimension112="cd237b10-90e6-11f1-9e82-936e5d36eaae" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: for $699 @ Amazon" data-dimension48="Galaxy Watch Ultra 2: for $699 @ Amazon" data-dimension25=""><strong>for $699 @ Amazon</strong></a><br>Amazon is offering a free $100 Amazon gift card when you buy your Galaxy Watch Ultra 2 at Amazon. <a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Ultra2-Titanium-Smartwatch/dp/B0H6NRPGT7" target="_blank" rel="nofollow" data-dimension112="cd237b10-90e6-11f1-9e82-936e5d36eaae" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: for $699 @ Amazon" data-dimension48="Galaxy Watch Ultra 2: for $699 @ Amazon" data-dimension25="">View Deal</a></p></div><p>Coming away from a single run with the two watches, there's no question the Galaxy Watch Ultra 2 is the superior device. It's brighter and more performant with greater storage and a longer battery life. </p><p>It also undercut the Apple Watch Ultra 2 at launch with a price of $699 to Apple's $799 (the current price of the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-review">Apple Watch Ultra 3</a>), so it wins out if you're on a budget, too. Of course, you can currently find the Ultra 2 at a reduced price since it's been usurped by the Ultra 3, but for the sake of comparing apples to...err...apples? Samsung wins on price.</p><p>But it's not a <em>complete</em> victory. For instance, I like that the summary of your run stays up longer on the Apple Watch Ultra 2 than it does on the Galaxy Watch Ultra. Also, while the Galaxy Watch Ultra 2 is a good-looking timepiece, I'm not entirely sold on the square-circle hybrid case design.</p><p>My final takeaway is to see what the Apple Watch Ultra 4 holds if and when it launches in a couple of months. Then I'll decide whether to keep my affinity with Apple going for another year or jump ship over to Samsung's side for future workouts.</p><p>What's your wearable of choice for recording your activity? Let me know if you prefer Apple or Samsung (or split the difference and go with Garmin) in the comments below.</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/DbS6rNNljkj/" target="_blank">A post shared by Tom's Guide (@tomsguide)</a></p><p>A photo posted by </p></blockquote></div><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/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/wellness/fitness-trackers/join-our-wearable-tech-live-q-and-a-should-you-ditch-the-smartwatch-for-an-oura-whoop-garmin-cirqa-or-fitbit-air">Garmin Cirqa vs Fitbit Air vs Whoop vs Oura Ring: Our fitness experts are helping you pick the perfect fitness tracker</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-manually-counted-4-000-steps-to-test-the-apple-watch-ultra-3-vs-samsung-galaxy-watch-ultra-2-and-samsung-wins-the-accuracy-battle-with-better-elevation-data-too">I walked 4,000 steps with the Apple Watch Ultra 3 vs Samsung Galaxy Watch Ultra 2 — and the winning margin was razor-thin</a></li></ul>
                                                            </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-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="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-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="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[ Battle of the sub-$500 TVs — I watched 3 movies on the cheapest Samsung TV and second-cheapest Amazon TV, and this is the best bang for your buck ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Can you get a decent TV for under $500? Surprisingly, yes. I have both the brand-new Samsung U8000H and the new(ish) <a href="https://www.tomsguide.com/tvs/amazon-ember-4-series-review">Amazon Ember 4-Series</a> at Tom's Guide's testing lab at the moment, so what better time to put them in a head-to-head battle? </p><p>I watched three movies on 4K Blu-ray in Filmmaker mode: "The Super Mario Galaxy Movie (2026)", "The Batman (2022)", and "Top Gun: Maverick (2022)". For this test, I used an HDMI splitter, so both TVs had the same input material. I put the Samsung TV at max brightness and the Amazon TV at 50% brightness (as 100% was much too bright). </p><p>As you read, keep in mind that the Samsung U8000H is on the left while the Amazon Ember 4-Series is on the right. Which one came out on top? Read on to find out.</p>        <div class="featured_product_block featured_block_versus" data-id="17f6f85c-9019-11f1-87dd-3fe82ee20cca">            <a href="https://www.amazon.com/Samsung-50-Inch-Class-U8000H-Crystal/dp/B0GV1665R8" data-model-name="U8000H" 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/pcgaf7wx4mtDU6gPfSa4CM.jpg" alt="A Samsung Crystal UHD TV on a white background."></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">U8000H</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>The U8000H is Samsung's 2026 entry-level TV. The previous model, U8000F, is still available for around $200. With a 4K resolution and a color-boost mode, it's not your run-of-the-mill discount TV. </p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_versus" data-id="17f6f8de-9019-11f1-8acc-a5294bff67ec">            <a href="https://www.amazon.com/Fire-TV-4-Series-43-inch/dp/B0DFNPK1D3" data-model-name="Amazon Ember 4-series 4K LED TV (2025)" 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/R3R6Z7d4Bu9C8WnYdkzKD3.jpg" alt="the amazon ember 4-series tv on a white square background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                            <div class='featured__brand'>Amazon</div>                    <div class="featured__title">Ember 4-Series</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>The Ember 4-Series is Amazon's second-cheapest TV, beaten only by the 2-Series.</p></p>                </div>                            </div>        </div><h2 id="movie-1-the-super-mario-galaxy-movie">Movie #1: 'The Super Mario Galaxy Movie'</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5398px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="rWNLmLTbXHZGPANk8j55gW" name="tv comp shot 1" alt="a side by side comparison of the samsung u8000h (left) and the amazon ember 4-series (right)" src="https://cdn.mos.cms.futurecdn.net/rWNLmLTbXHZGPANk8j55gW-1920-80.jpg" mos="" align="middle" fullscreen="" width="5398" height="3036" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Erin Bashford)</span></figcaption></figure><p>The first thing I noticed was that the Amazon Ember 4-Series is incredibly pink-toned. The reds were blown out, as you can see in the GIF above. The desert scene looked more like a Barbie set than a level of <em>Super Mario Galaxy</em>. </p><p>That's not to say the Samsung U8000H was perfect. While the 4-Series was too pink, the U8000H was too yellow. The desert sand almost resembled Cheeto powder. (Gross!) Cheeto dust feels a bit closer to the film's intended colors, but neither TV did a great job.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5384px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="VQYtUMsnsxrLJFfXwF2zgW" name="tv comp shot 2" alt="a side by side comparison of the samsung u8000h (left) and the amazon ember 4-series (right)" src="https://cdn.mos.cms.futurecdn.net/VQYtUMsnsxrLJFfXwF2zgW-1920-80.jpg" mos="" align="middle" fullscreen="" width="5384" height="3029" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Erin Bashford)</span></figcaption></figure><p>Overall, neither the Ember 4-Series nor the U8000H blew me away, but the Samsung has better color accuracy. The Samsung's blue skies appeared bluer — as you can see in the GIFs above — and luminance was more even in the highlights. </p><p>Uniformity was actually a major issue on the Ember 4-Series — the highlights were much less controlled and bled out across the scene. Lights often bled into darks, as you can see in the GIF above. </p><h2 id="movie-2-top-gun-maverick">Movie #2: Top Gun: Maverick</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5339px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FtFsPntWehfyjiAkqPKcgW" name="tv comp shot 4" alt="a side by side comparison of the samsung u8000h (left) and the amazon ember 4-series (right)" src="https://cdn.mos.cms.futurecdn.net/FtFsPntWehfyjiAkqPKcgW-1920-80.jpg" mos="" align="middle" fullscreen="" width="5339" height="3003" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Erin Bashford)</span></figcaption></figure><p>The Amazon Ember 4-Series performed much better than the Samsung U8000H ... at least at first. The Samsung appeared washed out in the darker scenes at the start of "Top Gun: Maverick". Gray-toned scenes looked almost monochromatic. </p><p>Red-toned scenes were also a little yellow, as you can see in the GIF above. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5152px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XsekytYHQSCcWinYksmpWW" name="tv comp shot 3" alt="a side by side comparison of the samsung u8000h (left) and the amazon ember 4-series (right)" src="https://cdn.mos.cms.futurecdn.net/XsekytYHQSCcWinYksmpWW-1920-80.jpg" mos="" align="middle" fullscreen="" width="5152" height="2898" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Erin Bashford)</span></figcaption></figure><p>That being said, fast-flying scenes were smoother on the Samsung panel and the night sky appeared much darker on the U8000H, which you can see in the GIFs. Blacks popped more on the Samsung panel, and you can see the loss of detail in the highlights on the Amazon TV.</p><p>So, after a disappointing start, the Samsung model won this round, too. The white/black balance is far superior on the Samsung. Skin tones are also much too pink on the Ember 4-Series — Tom Cruise looked like he'd spent a week in Ibiza with no sunscreen.</p><h2 id="movie-3-the-batman">Movie #3: 'The Batman'</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3688px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="jC9s5i4xZUCjCPhY6ZLVjV" name="tv comp shot 5" alt="a side by side comparison of the samsung u8000h (left) and the amazon ember 4-series (right)" src="https://cdn.mos.cms.futurecdn.net/jC9s5i4xZUCjCPhY6ZLVjV-1920-80.jpg" mos="" align="middle" fullscreen="" width="3688" height="2074" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Erin Bashford)</span></figcaption></figure><p>"The Batman" is an incredibly dark movie, which can pose a real problem for budget models like the ones I'm testing here. I was worried both TVs would struggle with contrast and black levels... and I was correct. </p><p>The Amazon Ember 4-Series overcompensates for the dark color grading with pink-toned skin colors and highlights leaking into shadowed areas. The Samsung isn't as vibrant as I would like, but it handles blacks better.</p><p>As you can see in the GIF above, the lights are blown out on the Amazon, but a little too dark on the Samsung. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4778px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="ixjCPAiTCmhRNfVfokZF6W" name="tv comp shot 6" alt="a side by side comparison of the samsung u8000h and the amazon ember 4-series" src="https://cdn.mos.cms.futurecdn.net/ixjCPAiTCmhRNfVfokZF6W-1920-80.jpg" mos="" align="middle" fullscreen="" width="4778" height="2687" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Erin Bashford)</span></figcaption></figure><p>The Samsung U8000H handled the motion of motorbikes and falling rain better, but micro details like eyebrows and fine lines were presented more clearly on the Amazon. </p><p>In general, I found my eye drawn more to the Amazon during most nighttime scenes — likely because it's brighter, despite the lack of color accuracy. Neither models have full-array local dimming, but the Samsung U8000H's LED panel handled high-contrast scenes better.</p><h2 id="which-sub-500-tv-would-i-buy">Which sub-$500 TV would I buy? </h2><p>So remember, the Samsung U8000H starts from <a href="https://www.amazon.com/Samsung-50-Inch-Class-U8000H-Crystal/dp/B0GV1CPLLP?th=1" target="_blank" rel="nofollow">$247 for the 43-inch model </a>(the one I tested here). Comparatively, the 2025 Amazon Ember 4-Series is <a href="https://www.amazon.com/Fire-TV-4-Series-43-inch/dp/B0DFNPK1D3" target="_blank" rel="nofollow">$329 for the 43-inch model.</a></p><p>Given their respective prices and performance, I would buy the Samsung U8000H, and there would be very little competition. I much prefer the Samsung's controlled luminance and color accuracy. While the Amazon TV has some interesting Alexa features, it's not worth the added cost. </p><p>I think you should save your money and get the Samsung. With the money left over, you could even get the <a href="https://www.tomsguide.com/audio/soundbars/sony-ht-s100f-review">Sony HT-S100F</a> (my favorite <a href="https://www.tomsguide.com/best-picks/best-cheap-soundbars">cheap soundbar</a>) and still have some money for a discounted DVD or a few weeks of Netflix. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xkwb3X"></div>                            </div>                            <script src="https://kwizly.com/embed/Xkwb3X.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/tvs/we-asked-readers-which-tv-brand-they-trusted-most-and-one-company-rose-above-the-rest"><strong>We asked readers which TV brand they trusted most — and one company rose above the rest</strong></a></li><li><a href="https://www.tomsguide.com/tvs/oled-tvs/one-of-the-top-lg-oleds-of-the-year-just-got-a-huge-usd900-discount"><strong>One of the top LG OLEDs of the year just got a huge $900 discount</strong></a></li><li><a href="https://www.tomsguide.com/tvs/these-are-the-5-affordable-tvs-you-should-buy-for-your-student-heading-off-to-college-and-theyre-all-on-sale-now"><strong>These are the 5 affordable TVs you should buy for your student heading off to college — and they're all on sale now</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tvs/battle-of-the-sub-usd500-tvs-i-watched-3-movies-on-the-cheapest-samsung-tv-and-second-cheapest-amazon-tv-and-this-is-the-best-bang-for-your-buck</link>
                                                                            <description>
                            <![CDATA[ I compared the Samsung U8000H to the Amazon Ember 4-Series with three UHD Blu-ray movies. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">fJmA9aPms5oUFgh6bZLrAh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/KRsDgPqExR2jGjGcmiHxwe-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 09 Aug 2026 07:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[TVs]]></category>
                                                                                                <author><![CDATA[ erin.bashford@futurenet.com (Erin Bashford) ]]></author>                    <dc:creator><![CDATA[ Erin Bashford ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/rLvJvJVZx43hEzSsJy3BpL-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Erin Bashford is a senior reviews writer at Tom’s Guide. She has a Master’s in Broadcast and Digital Journalism from the University of East Anglia and 7 years of experience reviewing music and events for various publications. She has edited publications such as Outline Magazine’s Guide to Norwich, and she has written for a number of music magazines and websites such as Clash Magazine, Outline Magazine and Dork Magazine. She has a strong interest in audio gear and the music world. &lt;/p&gt;&lt;p&gt;As an ex-barista, Erin is passionate about coffee tech. She also loves finding the best cooking hacks and kitchen appliances, including her beloved Instant Pot. &lt;/p&gt;&lt;p&gt;In her spare time, you can find her reading, practising yoga, hiking, writing fantasy novels, or stressing over NYT Games.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/KRsDgPqExR2jGjGcmiHxwe-1920-80.jpg">
                                                            <media:credit><![CDATA[Erin Bashford]]></media:credit>
                                                                                                                                                                        <media:description><![CDATA[Left: Samsung U8000H | Right: Amazon Ember 4-Series]]></media:description>                                                            <media:text><![CDATA[the amazon ember 4-series TV and the samsung u8000h TV]]></media:text>
                                <media:title type="plain"><![CDATA[the amazon ember 4-series TV and the samsung u8000h TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/KRsDgPqExR2jGjGcmiHxwe-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Can you get a decent TV for under $500? Surprisingly, yes. I have both the brand-new Samsung U8000H and the new(ish) <a href="https://www.tomsguide.com/tvs/amazon-ember-4-series-review">Amazon Ember 4-Series</a> at Tom's Guide's testing lab at the moment, so what better time to put them in a head-to-head battle? </p><p>I watched three movies on 4K Blu-ray in Filmmaker mode: "The Super Mario Galaxy Movie (2026)", "The Batman (2022)", and "Top Gun: Maverick (2022)". For this test, I used an HDMI splitter, so both TVs had the same input material. I put the Samsung TV at max brightness and the Amazon TV at 50% brightness (as 100% was much too bright). </p><p>As you read, keep in mind that the Samsung U8000H is on the left while the Amazon Ember 4-Series is on the right. Which one came out on top? Read on to find out.</p>        <div class="featured_product_block featured_block_versus" data-id="17f6f85c-9019-11f1-87dd-3fe82ee20cca">            <a href="https://www.amazon.com/Samsung-50-Inch-Class-U8000H-Crystal/dp/B0GV1665R8" data-model-name="U8000H" 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/pcgaf7wx4mtDU6gPfSa4CM.jpg" alt="A Samsung Crystal UHD TV on a white background."></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">U8000H</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>The U8000H is Samsung's 2026 entry-level TV. The previous model, U8000F, is still available for around $200. With a 4K resolution and a color-boost mode, it's not your run-of-the-mill discount TV. </p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_versus" data-id="17f6f8de-9019-11f1-8acc-a5294bff67ec">            <a href="https://www.amazon.com/Fire-TV-4-Series-43-inch/dp/B0DFNPK1D3" data-model-name="Amazon Ember 4-series 4K LED TV (2025)" 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/R3R6Z7d4Bu9C8WnYdkzKD3.jpg" alt="the amazon ember 4-series tv on a white square background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                            <div class='featured__brand'>Amazon</div>                    <div class="featured__title">Ember 4-Series</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>The Ember 4-Series is Amazon's second-cheapest TV, beaten only by the 2-Series.</p></p>                </div>                            </div>        </div><h2 id="movie-1-the-super-mario-galaxy-movie">Movie #1: 'The Super Mario Galaxy Movie'</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5398px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="rWNLmLTbXHZGPANk8j55gW" name="tv comp shot 1" alt="a side by side comparison of the samsung u8000h (left) and the amazon ember 4-series (right)" src="https://cdn.mos.cms.futurecdn.net/rWNLmLTbXHZGPANk8j55gW-1920-80.jpg" mos="" align="middle" fullscreen="" width="5398" height="3036" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Erin Bashford)</span></figcaption></figure><p>The first thing I noticed was that the Amazon Ember 4-Series is incredibly pink-toned. The reds were blown out, as you can see in the GIF above. The desert scene looked more like a Barbie set than a level of <em>Super Mario Galaxy</em>. </p><p>That's not to say the Samsung U8000H was perfect. While the 4-Series was too pink, the U8000H was too yellow. The desert sand almost resembled Cheeto powder. (Gross!) Cheeto dust feels a bit closer to the film's intended colors, but neither TV did a great job.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5384px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="VQYtUMsnsxrLJFfXwF2zgW" name="tv comp shot 2" alt="a side by side comparison of the samsung u8000h (left) and the amazon ember 4-series (right)" src="https://cdn.mos.cms.futurecdn.net/VQYtUMsnsxrLJFfXwF2zgW-1920-80.jpg" mos="" align="middle" fullscreen="" width="5384" height="3029" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Erin Bashford)</span></figcaption></figure><p>Overall, neither the Ember 4-Series nor the U8000H blew me away, but the Samsung has better color accuracy. The Samsung's blue skies appeared bluer — as you can see in the GIFs above — and luminance was more even in the highlights. </p><p>Uniformity was actually a major issue on the Ember 4-Series — the highlights were much less controlled and bled out across the scene. Lights often bled into darks, as you can see in the GIF above. </p><h2 id="movie-2-top-gun-maverick">Movie #2: Top Gun: Maverick</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5339px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FtFsPntWehfyjiAkqPKcgW" name="tv comp shot 4" alt="a side by side comparison of the samsung u8000h (left) and the amazon ember 4-series (right)" src="https://cdn.mos.cms.futurecdn.net/FtFsPntWehfyjiAkqPKcgW-1920-80.jpg" mos="" align="middle" fullscreen="" width="5339" height="3003" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Erin Bashford)</span></figcaption></figure><p>The Amazon Ember 4-Series performed much better than the Samsung U8000H ... at least at first. The Samsung appeared washed out in the darker scenes at the start of "Top Gun: Maverick". Gray-toned scenes looked almost monochromatic. </p><p>Red-toned scenes were also a little yellow, as you can see in the GIF above. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5152px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XsekytYHQSCcWinYksmpWW" name="tv comp shot 3" alt="a side by side comparison of the samsung u8000h (left) and the amazon ember 4-series (right)" src="https://cdn.mos.cms.futurecdn.net/XsekytYHQSCcWinYksmpWW-1920-80.jpg" mos="" align="middle" fullscreen="" width="5152" height="2898" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Erin Bashford)</span></figcaption></figure><p>That being said, fast-flying scenes were smoother on the Samsung panel and the night sky appeared much darker on the U8000H, which you can see in the GIFs. Blacks popped more on the Samsung panel, and you can see the loss of detail in the highlights on the Amazon TV.</p><p>So, after a disappointing start, the Samsung model won this round, too. The white/black balance is far superior on the Samsung. Skin tones are also much too pink on the Ember 4-Series — Tom Cruise looked like he'd spent a week in Ibiza with no sunscreen.</p><h2 id="movie-3-the-batman">Movie #3: 'The Batman'</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3688px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="jC9s5i4xZUCjCPhY6ZLVjV" name="tv comp shot 5" alt="a side by side comparison of the samsung u8000h (left) and the amazon ember 4-series (right)" src="https://cdn.mos.cms.futurecdn.net/jC9s5i4xZUCjCPhY6ZLVjV-1920-80.jpg" mos="" align="middle" fullscreen="" width="3688" height="2074" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Erin Bashford)</span></figcaption></figure><p>"The Batman" is an incredibly dark movie, which can pose a real problem for budget models like the ones I'm testing here. I was worried both TVs would struggle with contrast and black levels... and I was correct. </p><p>The Amazon Ember 4-Series overcompensates for the dark color grading with pink-toned skin colors and highlights leaking into shadowed areas. The Samsung isn't as vibrant as I would like, but it handles blacks better.</p><p>As you can see in the GIF above, the lights are blown out on the Amazon, but a little too dark on the Samsung. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4778px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="ixjCPAiTCmhRNfVfokZF6W" name="tv comp shot 6" alt="a side by side comparison of the samsung u8000h and the amazon ember 4-series" src="https://cdn.mos.cms.futurecdn.net/ixjCPAiTCmhRNfVfokZF6W-1920-80.jpg" mos="" align="middle" fullscreen="" width="4778" height="2687" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Erin Bashford)</span></figcaption></figure><p>The Samsung U8000H handled the motion of motorbikes and falling rain better, but micro details like eyebrows and fine lines were presented more clearly on the Amazon. </p><p>In general, I found my eye drawn more to the Amazon during most nighttime scenes — likely because it's brighter, despite the lack of color accuracy. Neither models have full-array local dimming, but the Samsung U8000H's LED panel handled high-contrast scenes better.</p><h2 id="which-sub-500-tv-would-i-buy">Which sub-$500 TV would I buy? </h2><p>So remember, the Samsung U8000H starts from <a href="https://www.amazon.com/Samsung-50-Inch-Class-U8000H-Crystal/dp/B0GV1CPLLP?th=1" target="_blank" rel="nofollow">$247 for the 43-inch model </a>(the one I tested here). Comparatively, the 2025 Amazon Ember 4-Series is <a href="https://www.amazon.com/Fire-TV-4-Series-43-inch/dp/B0DFNPK1D3" target="_blank" rel="nofollow">$329 for the 43-inch model.</a></p><p>Given their respective prices and performance, I would buy the Samsung U8000H, and there would be very little competition. I much prefer the Samsung's controlled luminance and color accuracy. While the Amazon TV has some interesting Alexa features, it's not worth the added cost. </p><p>I think you should save your money and get the Samsung. With the money left over, you could even get the <a href="https://www.tomsguide.com/audio/soundbars/sony-ht-s100f-review">Sony HT-S100F</a> (my favorite <a href="https://www.tomsguide.com/best-picks/best-cheap-soundbars">cheap soundbar</a>) and still have some money for a discounted DVD or a few weeks of Netflix. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xkwb3X"></div>                            </div>                            <script src="https://kwizly.com/embed/Xkwb3X.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/tvs/we-asked-readers-which-tv-brand-they-trusted-most-and-one-company-rose-above-the-rest"><strong>We asked readers which TV brand they trusted most — and one company rose above the rest</strong></a></li><li><a href="https://www.tomsguide.com/tvs/oled-tvs/one-of-the-top-lg-oleds-of-the-year-just-got-a-huge-usd900-discount"><strong>One of the top LG OLEDs of the year just got a huge $900 discount</strong></a></li><li><a href="https://www.tomsguide.com/tvs/these-are-the-5-affordable-tvs-you-should-buy-for-your-student-heading-off-to-college-and-theyre-all-on-sale-now"><strong>These are the 5 affordable TVs you should buy for your student heading off to college — and they're all on sale now</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I went e-mountain biking in cougar country with the new Samsung Galaxy Watch Ultra 2 vs Garmin Instinct 3 — and the winner is clear ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If you’re headed into cougar country to go e-mountain biking and you're tempted to watch videos of real-world cougar encounters beforehand, I encourage you to reconsider. Otherwise, what should be a lovely day in nature might feel a bit more, well, intense.</p><p>Fortunately, I encountered no cougars while researching this story.</p><p>With that out of the way, I just got back from electric mountain biking in Northern Washington State’s Cascade range — aka, cougar country — while wearing the new <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Samsung Galaxy Watch Ultra 2</a> on my left wrist and my go-to outdoor adventure watch, the <a href="https://www.tomsguide.com/Garmin-Instinct-3-review">Garmin Instinct 3</a> on my right wrist. </p><p>After several excellent hours spent ripping it up on a vast network of trails, followed by a quick check of the results, it was clear as day which smartwatch I’d choose to wear next time I go e-mountain biking. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VgjCTnyraQCAWFqH8q2hrR" name="S-Ultra2-G-Instinct3-04" alt="Senior writer Dan Bracaglia adjusting his e-mountain bike on the side of a trail" src="https://cdn.mos.cms.futurecdn.net/VgjCTnyraQCAWFqH8q2hrR-1920-80.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Rebecca Michalak )</span></figcaption></figure><h3 class="article-body__section" id="section-i-went-e-mountain-biking-with-the-galaxy-watch-ultra-2-vs-garmin-instinct-3"><span>I went e-mountain biking with the Galaxy Watch Ultra 2 vs Garmin Instinct 3</span></h3><div ><table><caption>Samsung vs Garmin results</caption><thead><tr><th class="firstcol empty" ></th><th  ><p>Garmin Instinct 3</p></th><th  ><p>Samsung Galaxy Watch Ultra 2</p></th><th  ><p>Strava</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Distance</strong></p></td><td  ><p>11 miles </p></td><td  ><p>11.11 miles</p></td><td  ><p>10.8 miles</p></td></tr><tr><td class="firstcol " ><p><strong>Elevation gain</strong></p></td><td  ><p>1,885 feet</p></td><td  ><p>2,088 feet</p></td><td  ><p>1,744 feet</p></td></tr><tr><td class="firstcol " ><p><strong>Average speed </strong></p></td><td  ><p>4.1 mph</p></td><td  ><p>4.1 mph</p></td><td  ><p>7.7 mph</p></td></tr><tr><td class="firstcol " ><p><strong>Max speed</strong></p></td><td  ><p>24 mph</p></td><td  ><p>24.2 mph</p></td><td  ><p>26.6 mph</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-samsung-lacks-a-dedicated-e-bike-mode"><span>Samsung lacks a dedicated e-bike mode</span></h3><p>I had a hunch that the Garmin Instinct 3 would be more up to the task of accurately logging a mountain e-bike adventure than the Samsung Galaxy Watch Ultra 2. Even before my helmet reached my head, I noticed a shortcoming of the latter: it not only lacks a mountain e-bike tracking mode but also doesn’t even have an e-bike mode.</p><p>So, I settled for Samsung’s standard mountain bike tracking mode. Meanwhile, the outdoor-oriented Instinct 3, of course, had a dedicated mode for the day’s activity. </p><h3 class="article-body__section" id="section-garmin-s-elevation-data-appears-more-accurate"><span>Garmin’s elevation data appears more accurate</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zZgJNEcKCuvUsd3A7g8MWP" name="S-Ultra2-G-Instinct3-05" alt="Landscape shot of the Cascade Mountains with a lake in the center of the frame" src="https://cdn.mos.cms.futurecdn.net/zZgJNEcKCuvUsd3A7g8MWP-1920-80.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Assuming our control, the Strava app running on my iPhone 16 Plus is correct, then the Instinct 3 overcounted my climb by 141 feet, while the Galaxy Watch Ultra 2 inflated it by as much as 344 feet, a notable difference. This also isn’t the first time the Ultra 2 <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">reported an inflated climb</a> in my testing.</p><p>With elevation gain being one of the primary metrics I focus on post-ride, along with top speed and distance, the Garmin is an easy choice over the Samsung. It's also worth noting that the Galaxy Watch Ultra 2 failed to report my total ascent in the post-workout stats. Fortunately, I documented the stat before ending the session (something I've made a habit of doing for these exact moments). </p><h3 class="article-body__section" id="section-the-instinct-3-is-more-comfortable-than-the-galaxy-watch-ultra-2"><span>The Instinct 3 is more comfortable than the Galaxy Watch Ultra 2</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:5187px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="WuDuLxY7D8yPDKN9dJM6RP" name="S-Ultra2-G-Instinct3-06" alt="Close-up of the Samsung Galaxy Watch Ultra 2 and Garmin Instinct 3 in the mountains during an e-biking excursion" src="https://cdn.mos.cms.futurecdn.net/WuDuLxY7D8yPDKN9dJM6RP-1920-80.jpg" mos="" align="middle" fullscreen="" width="5187" height="2918" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Rebecca Michalak )</span></figcaption></figure><p>Finally, the Garmin Instinct 3 feels much comfier on my 6.5-inch wrist than the Samsung Galaxy Watch Ultra 2, especially while working up a sweat. The Samsung case isn’t only taller and wider than that of the 45mm Instinct 3; it’s also much heavier, weighing 86 g versus 54 g for the Garmin. </p><p>After a few hours of riding, I must admit, I was eager to remove the Galaxy Watch Ultra 2 from my wrist.</p><h3 class="article-body__section" id="section-but-the-galaxy-watch-ultra-2-was-easier-to-read-in-direct-sunlight"><span>But the Galaxy Watch Ultra 2 was easier to read in direct sunlight </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:5444px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zZWeMDqLQRNM4xqkPWxXkN" name="S-Ultra2-G-Instinct3-03" alt="Close-up of the Samsung Galaxy Watch Ultra 2 and Garmin Instinct 3 in the mountains during an e-biking excursion" src="https://cdn.mos.cms.futurecdn.net/zZWeMDqLQRNM4xqkPWxXkN-1920-80.jpg" mos="" align="middle" fullscreen="" width="5444" height="3062" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>There was one aspect of the Galaxy Watch Ultra 2 I preferred: Its ultrabright display. Even in direct sunlight with shades on, I was able to read the Samsung watch’s display at a glance. That wasn’t the case for the Garmin Instinct 3.</p><p>Of course, the Galaxy Watch Ultra 2 display maxes out at a seriously impressive 5,000 nits. Garmin doesn’t generally provide screen brightness metrics for its wearables, but I highly suspect that the Instinct 3 screen maxes out at around 1,000 nits. </p><p>Which of these smartwatches would <em>you</em> choose to track your next outdoor adventure? Let me know in the poll below. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ev1ZaX"></div>                            </div>                            <script src="https://kwizly.com/embed/ev1ZaX.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/can-the-usd99-fitbit-air-beat-the-usd799-apple-watch-ultra-3-at-fitness-tracking-i-manually-counted-4-500-steps-to-find-out">Can the $99 Fitbit Air beat the $799 Apple Watch Ultra 3 at fitness tracking? I manually counted 4,500 steps to find out</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-manually-counted-4-000-steps-to-test-the-apple-watch-ultra-3-vs-samsung-galaxy-watch-ultra-2-and-samsung-wins-the-accuracy-battle-with-better-elevation-data-too">I walked 4,000 steps with the Apple Watch Ultra 3 vs Samsung Galaxy Watch Ultra 2 — and the winning margin was razor-thin</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/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></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/fitness-trackers/i-went-e-mountain-biking-in-cougar-country-with-the-new-samsung-galaxy-watch-ultra-2-vs-garmin-instinct-3-and-the-winner-is-clear</link>
                                                                            <description>
                            <![CDATA[ I took the Garmin Instinct 3 and Samsung Galaxy Watch Ultra 2 e-mountain bike riding in Washington's Cascade range, and one vastly outperformed the other. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">teLTpzSPFkPB6Eh7FFSosF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7WbDbxwgVL8MjxTi78H4XN-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 09 Aug 2026 06:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&gt;&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/7WbDbxwgVL8MjxTi78H4XN-1920-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Samsung Galaxy Watch Ultra 2 and Garmin Instinct 3 in the mountains during an e-biking excursion ]]></media:description>                                                            <media:text><![CDATA[Close-up of the Samsung Galaxy Watch Ultra 2 and Garmin Instinct 3 in the mountains during an e-biking excursion ]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Samsung Galaxy Watch Ultra 2 and Garmin Instinct 3 in the mountains during an e-biking excursion ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7WbDbxwgVL8MjxTi78H4XN-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you’re headed into cougar country to go e-mountain biking and you're tempted to watch videos of real-world cougar encounters beforehand, I encourage you to reconsider. Otherwise, what should be a lovely day in nature might feel a bit more, well, intense.</p><p>Fortunately, I encountered no cougars while researching this story.</p><p>With that out of the way, I just got back from electric mountain biking in Northern Washington State’s Cascade range — aka, cougar country — while wearing the new <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Samsung Galaxy Watch Ultra 2</a> on my left wrist and my go-to outdoor adventure watch, the <a href="https://www.tomsguide.com/Garmin-Instinct-3-review">Garmin Instinct 3</a> on my right wrist. </p><p>After several excellent hours spent ripping it up on a vast network of trails, followed by a quick check of the results, it was clear as day which smartwatch I’d choose to wear next time I go e-mountain biking. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VgjCTnyraQCAWFqH8q2hrR" name="S-Ultra2-G-Instinct3-04" alt="Senior writer Dan Bracaglia adjusting his e-mountain bike on the side of a trail" src="https://cdn.mos.cms.futurecdn.net/VgjCTnyraQCAWFqH8q2hrR-1920-80.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Rebecca Michalak )</span></figcaption></figure><h3 class="article-body__section" id="section-i-went-e-mountain-biking-with-the-galaxy-watch-ultra-2-vs-garmin-instinct-3"><span>I went e-mountain biking with the Galaxy Watch Ultra 2 vs Garmin Instinct 3</span></h3><div ><table><caption>Samsung vs Garmin results</caption><thead><tr><th class="firstcol empty" ></th><th  ><p>Garmin Instinct 3</p></th><th  ><p>Samsung Galaxy Watch Ultra 2</p></th><th  ><p>Strava</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Distance</strong></p></td><td  ><p>11 miles </p></td><td  ><p>11.11 miles</p></td><td  ><p>10.8 miles</p></td></tr><tr><td class="firstcol " ><p><strong>Elevation gain</strong></p></td><td  ><p>1,885 feet</p></td><td  ><p>2,088 feet</p></td><td  ><p>1,744 feet</p></td></tr><tr><td class="firstcol " ><p><strong>Average speed </strong></p></td><td  ><p>4.1 mph</p></td><td  ><p>4.1 mph</p></td><td  ><p>7.7 mph</p></td></tr><tr><td class="firstcol " ><p><strong>Max speed</strong></p></td><td  ><p>24 mph</p></td><td  ><p>24.2 mph</p></td><td  ><p>26.6 mph</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-samsung-lacks-a-dedicated-e-bike-mode"><span>Samsung lacks a dedicated e-bike mode</span></h3><p>I had a hunch that the Garmin Instinct 3 would be more up to the task of accurately logging a mountain e-bike adventure than the Samsung Galaxy Watch Ultra 2. Even before my helmet reached my head, I noticed a shortcoming of the latter: it not only lacks a mountain e-bike tracking mode but also doesn’t even have an e-bike mode.</p><p>So, I settled for Samsung’s standard mountain bike tracking mode. Meanwhile, the outdoor-oriented Instinct 3, of course, had a dedicated mode for the day’s activity. </p><h3 class="article-body__section" id="section-garmin-s-elevation-data-appears-more-accurate"><span>Garmin’s elevation data appears more accurate</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zZgJNEcKCuvUsd3A7g8MWP" name="S-Ultra2-G-Instinct3-05" alt="Landscape shot of the Cascade Mountains with a lake in the center of the frame" src="https://cdn.mos.cms.futurecdn.net/zZgJNEcKCuvUsd3A7g8MWP-1920-80.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Assuming our control, the Strava app running on my iPhone 16 Plus is correct, then the Instinct 3 overcounted my climb by 141 feet, while the Galaxy Watch Ultra 2 inflated it by as much as 344 feet, a notable difference. This also isn’t the first time the Ultra 2 <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">reported an inflated climb</a> in my testing.</p><p>With elevation gain being one of the primary metrics I focus on post-ride, along with top speed and distance, the Garmin is an easy choice over the Samsung. It's also worth noting that the Galaxy Watch Ultra 2 failed to report my total ascent in the post-workout stats. Fortunately, I documented the stat before ending the session (something I've made a habit of doing for these exact moments). </p><h3 class="article-body__section" id="section-the-instinct-3-is-more-comfortable-than-the-galaxy-watch-ultra-2"><span>The Instinct 3 is more comfortable than the Galaxy Watch Ultra 2</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:5187px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="WuDuLxY7D8yPDKN9dJM6RP" name="S-Ultra2-G-Instinct3-06" alt="Close-up of the Samsung Galaxy Watch Ultra 2 and Garmin Instinct 3 in the mountains during an e-biking excursion" src="https://cdn.mos.cms.futurecdn.net/WuDuLxY7D8yPDKN9dJM6RP-1920-80.jpg" mos="" align="middle" fullscreen="" width="5187" height="2918" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Rebecca Michalak )</span></figcaption></figure><p>Finally, the Garmin Instinct 3 feels much comfier on my 6.5-inch wrist than the Samsung Galaxy Watch Ultra 2, especially while working up a sweat. The Samsung case isn’t only taller and wider than that of the 45mm Instinct 3; it’s also much heavier, weighing 86 g versus 54 g for the Garmin. </p><p>After a few hours of riding, I must admit, I was eager to remove the Galaxy Watch Ultra 2 from my wrist.</p><h3 class="article-body__section" id="section-but-the-galaxy-watch-ultra-2-was-easier-to-read-in-direct-sunlight"><span>But the Galaxy Watch Ultra 2 was easier to read in direct sunlight </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:5444px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zZWeMDqLQRNM4xqkPWxXkN" name="S-Ultra2-G-Instinct3-03" alt="Close-up of the Samsung Galaxy Watch Ultra 2 and Garmin Instinct 3 in the mountains during an e-biking excursion" src="https://cdn.mos.cms.futurecdn.net/zZWeMDqLQRNM4xqkPWxXkN-1920-80.jpg" mos="" align="middle" fullscreen="" width="5444" height="3062" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>There was one aspect of the Galaxy Watch Ultra 2 I preferred: Its ultrabright display. Even in direct sunlight with shades on, I was able to read the Samsung watch’s display at a glance. That wasn’t the case for the Garmin Instinct 3.</p><p>Of course, the Galaxy Watch Ultra 2 display maxes out at a seriously impressive 5,000 nits. Garmin doesn’t generally provide screen brightness metrics for its wearables, but I highly suspect that the Instinct 3 screen maxes out at around 1,000 nits. </p><p>Which of these smartwatches would <em>you</em> choose to track your next outdoor adventure? Let me know in the poll below. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ev1ZaX"></div>                            </div>                            <script src="https://kwizly.com/embed/ev1ZaX.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/can-the-usd99-fitbit-air-beat-the-usd799-apple-watch-ultra-3-at-fitness-tracking-i-manually-counted-4-500-steps-to-find-out">Can the $99 Fitbit Air beat the $799 Apple Watch Ultra 3 at fitness tracking? I manually counted 4,500 steps to find out</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-manually-counted-4-000-steps-to-test-the-apple-watch-ultra-3-vs-samsung-galaxy-watch-ultra-2-and-samsung-wins-the-accuracy-battle-with-better-elevation-data-too">I walked 4,000 steps with the Apple Watch Ultra 3 vs Samsung Galaxy Watch Ultra 2 — and the winning margin was razor-thin</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/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></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[ Tom's Guide TV Satisfaction Survey: Tell us what you love (and hate) about your TV ]]></title>
                                                                                                <dc:content><![CDATA[ <p>For the past few weeks we've been putting TV manufacturers' feet to the fire. We're holding them accountable by grading them in key categories like design, performance, features and pricing — and now we're asking our readers to get involved.</p><p>We recently asked readers <a href="https://www.tomsguide.com/tvs/we-asked-readers-which-tv-brand-they-trusted-most-and-one-company-rose-above-the-rest">which brand they trusted most and one company was the clear winner</a>. Now we're coming to you all directly with a short survey that will help us figure out what you love and hate about the six biggest TV makers: <a href="https://www.tomsguide.com/tvs/hisense-tv-report-card-2026-one-of-the-best-ways-to-maximize-your-dollar">Hisense</a>, <a href="https://www.tomsguide.com/tvs/lg-tvs-are-better-than-theyve-ever-been-heres-what-theyre-doing-right-what-theyre-doing-wrong-and-what-needs-to-change-in-2026">LG</a>, <a href="https://www.tomsguide.com/tvs/samsung-tv-report-card-2026-you-can-rely-on-samsung-to-deliver-exceptional-performance">Samsung</a>, <a href="https://www.tomsguide.com/tvs/theres-no-way-around-it-sony-tvs-are-priced-higher-than-most-of-the-competition-heres-what-sonys-doing-right-what-its-doing-wrong-and-what-needs-to-change-in-2026">Sony</a>, <a href="https://www.tomsguide.com/tvs/tcl-tv-report-card-2026-i-suspect-that-ive-recommended-tcl-tvs-more-than-any-other-brand">TCL</a> and <a href="https://www.tomsguide.com/tvs/vizio-tv-report-card-2026-vizio-is-still-finding-its-footing-post-walmart-acquisition">Vizio</a>.</p><p>Fill it out at your leisure and let me know in the comments what your biggest gripes are. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eG2mEX"></div>                            </div>                            <script src="https://kwizly.com/embed/eG2mEX.js" async></script><h2 id="here-s-how-i-d-answer">Here's how I'd answer</h2><p>Testing TVs for a living has left me with an embarrassing amount of screens in my home. In my home office I've got a 75-inch <a href="https://www.tomsguide.com/tvs/tcl-qm9k-mini-led-tv-review">TCL QM9K</a>. Downstairs in my living room is a <a href="https://www.tomsguide.com/tvs/oled-tvs/samsung-s95d-oled-review">Samsung S95D OLED</a>. In my music listening room I've got the <a href="https://www.tomsguide.com/tvs/hisense-u8n-mini-led-tv-review">Hisense U8N</a>. </p><p>In the above survey, I'd mark all three down.</p><p>How long have I owned those TVs? Not all that long. </p><p>The first TV I ever owned was a massive CRT model that I used to play N64 and PS1 games on growing up. My parents bought that TV for me and my brother in 1996 and I was still rocking it to play Halo 2 a decade later. </p><div><blockquote><p>These days, however, I'm trading out TVs every two to three years.</p></blockquote></div><p>These days, however, I'm trading out TVs every two to three years. That's probably a bit excessive, honestly, but as someone who covers this stuff, I want to make sure that I have access to all the latest and greatest technology to provide the best analysis to you guys. </p><p>Would I buy these TVs again? I absolutely would. They're all great value options. Not everyone probably feels the same as I feel, though. For some of you I'm sure the answer is going to be a resounding <em>no</em>. If that's you, drop a comment below letting me know why that is. </p><p>If the answer is <em>yes</em>, also drop a comment below letting me know why you like your TV so much. By doing so, you could be directly helping someone find their new favorite TV. </p><p>Stay tuned for the results of these surveys and check out our guide to the <a href="https://www.tomsguide.com/tvs/we-just-graded-every-tv-brand-on-price-performance-and-more-heres-how-their-report-cards-stack-up">best TV brands in 2026</a> if you haven't done so already. You'll be seeing the results used in more stories in the coming weeks as we continue to break down what's working — and what's not working — in the world of TVs.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/tvs/theres-a-better-cable-for-tvs-than-hdmi-but-heres-why-well-probably-never-use-it">There's a better cable for TVs than HDMI — but here's why we'll probably never use it</a></li><li><a href="https://www.tomsguide.com/tvs/best-buy-essentials-ultra-thin-amplified-hdtv-antenna-review">Best Buy Essentials Ultra-Thin Amplified HDTV Antenna review</a></li><li><a href="https://www.tomsguide.com/tvs/your-streaming-stick-isnt-broken-these-apps-are-just-slowing-it-down-to-a-crawl">Your streaming stick isn't broken — these apps are just slowing it down to a crawl</a></li></ul><h2 id=""></h2> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tvs/toms-guide-tv-satisfaction-survey-tell-us-what-you-love-and-hate-about-your-tv</link>
                                                                            <description>
                            <![CDATA[ Take our Tom's Guide TV Satisfaction Survey and tell us what you like about the TV you own and what you really don't like. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ZvFwSRtfH25kguR4zHU3hQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/i2ni7uXmQ3KCaPGwekosSB-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 08 Aug 2026 07:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[TVs]]></category>
                                                                                                <author><![CDATA[ Nick.Pino@futurenet.com (Nick Pino) ]]></author>                    <dc:creator><![CDATA[ Nick Pino ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/7xnnEdyK5eEbDVbS5pYB54-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nick Pino heads up the TV and AV verticals at Tom&#039;s Guide and covers everything from OLED TVs to the latest wireless headphones. He&#039;s a Level 1 Certified THX Home Theater Professional, and has attended classes on TV and audio calibration. On Tom&#039;s Guide, he looks after some of the site&#039;s important buying guides like the best TVs, best OLED TVs, best 4K TVs, so most of his day is spent watching and evaluating new screens from LG, Samsung, Sony, Hisense, TCL and Vizio. (And yes, he knows how lucky he is to say that.) He was formerly the Senior Editor, TV and AV at TechRadar (Tom&#039;s Guide&#039;s sister site) and has previously written for GamesRadar, Official Xbox Magazine, PC Gamer and other outlets over the last decade. He got his start on Best Buy&#039;s official video game magazine, @GAMER, for whom he attended his first E3 in 2013. He&#039;s served as a judge for CES&#039; prestigious Innovation Awards and has attended the tech conference in Las Vegas since 2014. He has a computer science degree from the University at Buffalo and still resides in the Buffalo area. (Go Bills!) Not sure which TV you should buy? Drop him an email or tweet him on Twitter and he can help you out.&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/i2ni7uXmQ3KCaPGwekosSB-1920-80.jpg">
                                                            <media:credit><![CDATA[Samsung, TCL, LG / Edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A selection of Samsung, TCL and LG TVs in a room.]]></media:description>                                                            <media:text><![CDATA[A selection of Samsung, TCL and LG TVs in a room.]]></media:text>
                                <media:title type="plain"><![CDATA[A selection of Samsung, TCL and LG TVs in a room.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/i2ni7uXmQ3KCaPGwekosSB-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>For the past few weeks we've been putting TV manufacturers' feet to the fire. We're holding them accountable by grading them in key categories like design, performance, features and pricing — and now we're asking our readers to get involved.</p><p>We recently asked readers <a href="https://www.tomsguide.com/tvs/we-asked-readers-which-tv-brand-they-trusted-most-and-one-company-rose-above-the-rest">which brand they trusted most and one company was the clear winner</a>. Now we're coming to you all directly with a short survey that will help us figure out what you love and hate about the six biggest TV makers: <a href="https://www.tomsguide.com/tvs/hisense-tv-report-card-2026-one-of-the-best-ways-to-maximize-your-dollar">Hisense</a>, <a href="https://www.tomsguide.com/tvs/lg-tvs-are-better-than-theyve-ever-been-heres-what-theyre-doing-right-what-theyre-doing-wrong-and-what-needs-to-change-in-2026">LG</a>, <a href="https://www.tomsguide.com/tvs/samsung-tv-report-card-2026-you-can-rely-on-samsung-to-deliver-exceptional-performance">Samsung</a>, <a href="https://www.tomsguide.com/tvs/theres-no-way-around-it-sony-tvs-are-priced-higher-than-most-of-the-competition-heres-what-sonys-doing-right-what-its-doing-wrong-and-what-needs-to-change-in-2026">Sony</a>, <a href="https://www.tomsguide.com/tvs/tcl-tv-report-card-2026-i-suspect-that-ive-recommended-tcl-tvs-more-than-any-other-brand">TCL</a> and <a href="https://www.tomsguide.com/tvs/vizio-tv-report-card-2026-vizio-is-still-finding-its-footing-post-walmart-acquisition">Vizio</a>.</p><p>Fill it out at your leisure and let me know in the comments what your biggest gripes are. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eG2mEX"></div>                            </div>                            <script src="https://kwizly.com/embed/eG2mEX.js" async></script><h2 id="here-s-how-i-d-answer">Here's how I'd answer</h2><p>Testing TVs for a living has left me with an embarrassing amount of screens in my home. In my home office I've got a 75-inch <a href="https://www.tomsguide.com/tvs/tcl-qm9k-mini-led-tv-review">TCL QM9K</a>. Downstairs in my living room is a <a href="https://www.tomsguide.com/tvs/oled-tvs/samsung-s95d-oled-review">Samsung S95D OLED</a>. In my music listening room I've got the <a href="https://www.tomsguide.com/tvs/hisense-u8n-mini-led-tv-review">Hisense U8N</a>. </p><p>In the above survey, I'd mark all three down.</p><p>How long have I owned those TVs? Not all that long. </p><p>The first TV I ever owned was a massive CRT model that I used to play N64 and PS1 games on growing up. My parents bought that TV for me and my brother in 1996 and I was still rocking it to play Halo 2 a decade later. </p><div><blockquote><p>These days, however, I'm trading out TVs every two to three years.</p></blockquote></div><p>These days, however, I'm trading out TVs every two to three years. That's probably a bit excessive, honestly, but as someone who covers this stuff, I want to make sure that I have access to all the latest and greatest technology to provide the best analysis to you guys. </p><p>Would I buy these TVs again? I absolutely would. They're all great value options. Not everyone probably feels the same as I feel, though. For some of you I'm sure the answer is going to be a resounding <em>no</em>. If that's you, drop a comment below letting me know why that is. </p><p>If the answer is <em>yes</em>, also drop a comment below letting me know why you like your TV so much. By doing so, you could be directly helping someone find their new favorite TV. </p><p>Stay tuned for the results of these surveys and check out our guide to the <a href="https://www.tomsguide.com/tvs/we-just-graded-every-tv-brand-on-price-performance-and-more-heres-how-their-report-cards-stack-up">best TV brands in 2026</a> if you haven't done so already. You'll be seeing the results used in more stories in the coming weeks as we continue to break down what's working — and what's not working — in the world of TVs.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/tvs/theres-a-better-cable-for-tvs-than-hdmi-but-heres-why-well-probably-never-use-it">There's a better cable for TVs than HDMI — but here's why we'll probably never use it</a></li><li><a href="https://www.tomsguide.com/tvs/best-buy-essentials-ultra-thin-amplified-hdtv-antenna-review">Best Buy Essentials Ultra-Thin Amplified HDTV Antenna review</a></li><li><a href="https://www.tomsguide.com/tvs/your-streaming-stick-isnt-broken-these-apps-are-just-slowing-it-down-to-a-crawl">Your streaming stick isn't broken — these apps are just slowing it down to a crawl</a></li></ul><h2 id=""></h2>
                                                            </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>
            </channel>
</rss>