<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="https://purl.org/dc/elements/1.1/"
     xmlns:dcterms="http://purl.org/dc/terms/"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:atom="http://www.w3.org/2005/Atom"
>
    <channel>
                    <atom:link href="https://www.tomsguide.com/feeds/tag/bose" rel="self" type="application/rss+xml" />
                            <title><![CDATA[ Latest from Tom's Guide in Bose ]]></title>
                <link>https://www.tomsguide.com/tag/bose</link>
        <description><![CDATA[ All the latest bose content from the Tom's Guide team ]]></description>
                                    <lastBuildDate>Tue, 30 Jun 2026 11:48:50 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ 13 Prime Day Bose deals are still available — including my favorite noise cancelling headphones for 50% off ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/13-prime-day-bose-deals-are-still-available-including-my-favorite-noise-cancelling-headphones-for-50-percent-off</link>
                                                                            <description>
                            <![CDATA[ This is your last chance to score Prime Day Bose deals, with huge discounts on speakers, headphones and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">azpQYzN7opYiyYX3RZBjVa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ZYjUh2mMccNQv4wXHetQS7-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 30 Jun 2026 11:48:50 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Audio]]></category>
                                                                                                <author><![CDATA[ millie.daviswilliams@futurenet.com (Millie Davis-Williams) ]]></author>                    <dc:creator><![CDATA[ Millie Davis-Williams ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/WU6pa7hKuxs5ScCoqcXYWA.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Millie is a Deals Editor at Tom&#039;s Guide specializing in tech deals content. Based in London, Millie has spent a lifetime stubbornly refusing to pay full price on any possible purchase. She has years of searching for the best discounts on the latest and greatest phones, TVs and gadgets under her belt, and knows how to sort the best deals from the rest. Helping readers save on the products they want is her mission, whether it’s an Apple Watch or a new tablet.&lt;/p&gt;&lt;p&gt;Since working at Tom’s Guide, Millie has covered retail events like Prime Day, Black Friday and Cyber Monday extensively, meaning she knows the products readers are looking for and the best times of year to hit “purchase.”&lt;/p&gt;&lt;p&gt;When she’s not looking for discounts, Millie covers news and writes how-to articles about everything from phones, streaming devices, and headphones to apps and video games.&lt;/p&gt;&lt;p&gt;In her spare time, Millie enjoys reading, gaming on her Nintendo Switch and creating digital art. She’s also a fan of watching Disney movies and collecting plush (the latter having totally taken over her bedroom.)&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ZYjUh2mMccNQv4wXHetQS7-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose QuietComfort Ultra vs Bose QuietComfort Headphones]]></media:description>                                                            <media:text><![CDATA[Bose QuietComfort Ultra vs Bose QuietComfort Headphones]]></media:text>
                                <media:title type="plain"><![CDATA[Bose QuietComfort Ultra vs Bose QuietComfort Headphones]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ZYjUh2mMccNQv4wXHetQS7-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Prime Day is over — but not all the deals are. Bose's sales have stuck around for a little bit longer, and it's a rare chance to make huge savings. <a href="https://www.amazon.com/stores/page/CF83CBD2-8339-43EA-A7F0-3E43FFA9177E?ingress=2&lp_context_asin=B0FLYG9C4N&visitId=f956d558-7072-4a5b-a738-cb600c975754&store_ref=bl_ast_dp_brandlogo_sto&ref_=ast_bln" target="_blank" rel="nofollow">Bose headphones, speakers and more are up to 50% off</a> right now. But hurry, because the discounts might disappear before long. </p><p>The deal I'm most excited about is the <a href="https://www.amazon.com/Bose-QuietComfort-Headphones-Bluetooth-Cancelling/dp/B0FLYG9C4N" target="_blank" rel="nofollow">Bose QuietComfort Headphones on sale for $179</a>, which is 50% off. If you're traveling this summer, the active noise canceling on these headphones is some of the best around and will save your ears from airplane chatter and every other kind of distraction!</p><p>Keep scrolling to see more of the best Bose deals. I also recommend checking out our <a href="https://www.tomsguide.com/coupons/amazon.com">Amazon promo codes</a>.</p><h2 class="article-body__section" id="section-quick-links"><span>Quick links</span></h2><ul><li><a href="https://www.amazon.com/stores/page/CF83CBD2-8339-43EA-A7F0-3E43FFA9177E?ingress=2&lp_context_asin=B0FLYG9C4N&visitId=f956d558-7072-4a5b-a738-cb600c975754&store_ref=bl_ast_dp_brandlogo_sto&ref_=ast_bln" target="_blank" rel="nofollow"><strong>shop all Bose deals at Amazon</strong></a></li><li><strong>Bose SoundLink Flex 2nd Gen: </strong><a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16" target="_blank" rel="nofollow"><strong>was $129 now $99</strong></a></li><li><strong>Bose QuietComfort Earbuds: </strong><a href="https://www.amazon.com/Bose-New-QuietComfort-Earbuds-Black/dp/B0FC6KNK6X" target="_blank" rel="nofollow"><strong>was $179 now $129</strong></a></li><li><strong>Bose QuietComfort Headphones:</strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" target="_blank" rel="nofollow"><strong> was $359 now $179</strong></a></li><li><strong>Bose TV Speaker: </strong><a href="https://www.amazon.com/Bose-Speaker-Soundbar-Bluetooth-connectivity/dp/B088KRPCQJ" target="_blank" rel="nofollow"><strong>was $279 now $199</strong></a></li><li><strong>Bose SoundLink Plus: </strong><a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0F7HVC62G" target="_blank" rel="nofollow"><strong>was $269 now $179</strong></a></li><li><strong>Bose QuietComfort Earbuds 2nd Gen: </strong><a href="https://www.amazon.com/Bose-New-QuietComfort-Ultra-Earbuds/dp/B0F7M3HPBD" target="_blank" rel="nofollow"><strong>was $299 now $249</strong></a></li><li><strong>Bose SoundLink Max: </strong><a href="https://www.amazon.com/Bose-SoundLink-Portable-Waterproof-Bluetooth/dp/B0CVL1K7DX" target="_blank" rel="nofollow"><strong>was $399 now $279</strong></a></li><li><strong>Bose QuietComfort Ultra Headphones 2nd Gen: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G" target="_blank" rel="nofollow"><strong>was $449 now $379</strong></a></li><li><strong>Bose Smart Soundbar: </strong><a href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" target="_blank" rel="nofollow"><strong>was $549 now $399</strong></a></li></ul><h2 class="article-body__section" id="section-best-bose-deals"><span>Best Bose deals</span></h2><div class="product"><a data-dimension112="d7c47267-ee53-41db-a182-8e39a543c8d3" data-action="Deal Block" data-label="Bose SoundLink Flex 2" data-dimension48="Bose SoundLink Flex 2" data-dimension25="$99" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:932px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="CaY2r9G6VHX74UcMmqyGy" name="bose soundlink flex gen 2 deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CaY2r9G6VHX74UcMmqyGy.jpg" mos="" align="middle" fullscreen="" width="932" height="932" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/bose-soundlink-flex-2-review" data-dimension112="d7c47267-ee53-41db-a182-8e39a543c8d3" data-action="Deal Block" data-label="Bose SoundLink Flex 2" data-dimension48="Bose SoundLink Flex 2" data-dimension25="$99">Bose SoundLink Flex 2</a> is a much-needed improvement on the expensive SoundLink Flex 1. The 2 brings excellent sound, an IP67 rating, and a completely customizable EQ. It sounds powerful, confident, and is small enough to fit into any backpack.<a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16" target="_blank" rel="nofollow" data-dimension112="d7c47267-ee53-41db-a182-8e39a543c8d3" data-action="Deal Block" data-label="Bose SoundLink Flex 2" data-dimension48="Bose SoundLink Flex 2" data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="bd9ee134-a29c-476a-8d47-a63fbe1826cb" data-action="Deal Block" data-label="Bose QuietComfort Earbuds" data-dimension48="Bose QuietComfort Earbuds" data-dimension25="$129" href="https://www.amazon.com/Bose-New-QuietComfort-Earbuds-Black/dp/B0FC6KNK6X" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:95.43%;"><img id="tEtgPEcP9tofgugi8QdrcP" name="Bose quietcomfort" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tEtgPEcP9tofgugi8QdrcP.jpg" mos="" align="middle" fullscreen="" width="679" height="648" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>We reviewed the <a href="https://www.tomsguide.com/audio/earbuds/bose-quietcomfort-earbuds-2024-review" data-dimension112="bd9ee134-a29c-476a-8d47-a63fbe1826cb" data-action="Deal Block" data-label="Bose QuietComfort Earbuds" data-dimension48="Bose QuietComfort Earbuds" data-dimension25="$129">Bose QuietComfort Earbuds</a> a few years ago and <em>loved</em> them. The active noise canceling is spectacular, as is the bass-forward sound. They even come in a variety of colors so you can be sure to find one that suits your vibe. These are perfect everyday earbuds — and now they match the AirPods 4's MSRP (which don't have ANC!). <a class="view-deal button" href="https://www.amazon.com/Bose-New-QuietComfort-Earbuds-Black/dp/B0FC6KNK6X" target="_blank" rel="nofollow" data-dimension112="bd9ee134-a29c-476a-8d47-a63fbe1826cb" data-action="Deal Block" data-label="Bose QuietComfort Earbuds" data-dimension48="Bose QuietComfort Earbuds" data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="750b085d-7b25-4be6-bf56-217b3403ec6d" data-action="Deal Block" data-label="Bose's noise canceling earbuds are an excellent option if you're looking to get some rest on public transport. They're comfortable and block out every ounce of noise in even loud environments. Save $130 right now. Just note that there's a newer option available — the Bose QuietComfort Ultra Earbuds Gen 2." data-dimension48="Bose's noise canceling earbuds are an excellent option if you're looking to get some rest on public transport. They're comfortable and block out every ounce of noise in even loud environments. Save $130 right now. Just note that there's a newer option available — the Bose QuietComfort Ultra Earbuds Gen 2." data-dimension25="$169" href="https://www.amazon.com/dp/B0CD2F4B1G/" 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:120.00%;"><img id="7azbTHqmWNtbExfKFGP93J" name="Bose QuietComfort Ultra earbuds BG image.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7azbTHqmWNtbExfKFGP93J.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Bose's noise canceling earbuds are an excellent option if you're looking to get some rest on public transport. They're comfortable and block out every ounce of noise in even loud environments. Save $130 right now. Just note that there's a newer option available — the Bose QuietComfort Ultra Earbuds Gen 2.<a class="view-deal button" href="https://www.amazon.com/dp/B0CD2F4B1G/" target="_blank" rel="nofollow" data-dimension112="750b085d-7b25-4be6-bf56-217b3403ec6d" data-action="Deal Block" data-label="Bose's noise canceling earbuds are an excellent option if you're looking to get some rest on public transport. They're comfortable and block out every ounce of noise in even loud environments. Save $130 right now. Just note that there's a newer option available — the Bose QuietComfort Ultra Earbuds Gen 2." data-dimension48="Bose's noise canceling earbuds are an excellent option if you're looking to get some rest on public transport. They're comfortable and block out every ounce of noise in even loud environments. Save $130 right now. Just note that there's a newer option available — the Bose QuietComfort Ultra Earbuds Gen 2." data-dimension25="$169">View Deal</a></p></div><div class="product"><a data-dimension112="47326a8d-4a2f-49d3-8ccc-372be9e89f6c" data-action="Deal Block" data-label="Bose QuietComfort headphones" data-dimension48="Bose QuietComfort headphones" data-dimension25="$179" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" 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="YmXJvbwXhi7xr7vPRU4WYg" name="Bose QuietComfort Headphones on white.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YmXJvbwXhi7xr7vPRU4WYg.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Right now you can get the <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-headphones" data-dimension112="47326a8d-4a2f-49d3-8ccc-372be9e89f6c" data-action="Deal Block" data-label="Bose QuietComfort headphones" data-dimension48="Bose QuietComfort headphones" data-dimension25="$179">Bose QuietComfort headphones</a> for a huge 50% off, which makes them even better value. The QC Headphones bring bassy sound, supreme active noise canceling, and silky ear cups to the party. <a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" target="_blank" rel="nofollow" data-dimension112="47326a8d-4a2f-49d3-8ccc-372be9e89f6c" data-action="Deal Block" data-label="Bose QuietComfort headphones" data-dimension48="Bose QuietComfort headphones" data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="4b9ae1fc-5a94-447c-89e4-21e1175e94ea" data-action="Deal Block" data-label="Tired of tinny TV sound but don't have a lot to spend? Look no further than the Bose TV speaker. This 2.0-channel soundbar has surprising detail and width and can instantly upgrade any TV sound. I just wouldn't recommend it for large TVs as it's a compact little soundbar." data-dimension48="Tired of tinny TV sound but don't have a lot to spend? Look no further than the Bose TV speaker. This 2.0-channel soundbar has surprising detail and width and can instantly upgrade any TV sound. I just wouldn't recommend it for large TVs as it's a compact little soundbar." data-dimension25="$199" href="https://www.amazon.com/Bose-Speaker-Soundbar-Bluetooth-connectivity/dp/B088KRPCQJ" 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="bPZFYfdgv6wtpxFQHPHgMF" name="bose-tv-speaker.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bPZFYfdgv6wtpxFQHPHgMF.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Tired of tinny TV sound but don't have a lot to spend? Look no further than the Bose TV speaker. This 2.0-channel soundbar has surprising detail and width and can instantly upgrade any TV sound. I just wouldn't recommend it for large TVs as it's a compact little soundbar. <a class="view-deal button" href="https://www.amazon.com/Bose-Speaker-Soundbar-Bluetooth-connectivity/dp/B088KRPCQJ" target="_blank" rel="nofollow" data-dimension112="4b9ae1fc-5a94-447c-89e4-21e1175e94ea" data-action="Deal Block" data-label="Tired of tinny TV sound but don't have a lot to spend? Look no further than the Bose TV speaker. This 2.0-channel soundbar has surprising detail and width and can instantly upgrade any TV sound. I just wouldn't recommend it for large TVs as it's a compact little soundbar." data-dimension48="Tired of tinny TV sound but don't have a lot to spend? Look no further than the Bose TV speaker. This 2.0-channel soundbar has surprising detail and width and can instantly upgrade any TV sound. I just wouldn't recommend it for large TVs as it's a compact little soundbar." data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="9af68680-d410-4ba5-b0ed-d0a79cfb659a" data-action="Deal Block" data-label="The SoundLink Plus is the perfect bridge between the tiny SoundLink Flex 2 and the huge SoundLink Max. Think of it as the "just right" of Bluetooth speakers. It has a great IP67 rating, meaning it can be used at pool and beach parties without dying, and has a 20-hour battery life." data-dimension48="The SoundLink Plus is the perfect bridge between the tiny SoundLink Flex 2 and the huge SoundLink Max. Think of it as the "just right" of Bluetooth speakers. It has a great IP67 rating, meaning it can be used at pool and beach parties without dying, and has a 20-hour battery life." data-dimension25="$179" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0F7HVC62G" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="umiB8PUGt7JvPecjBZKKRh" name="bose-soundlink-plus-portable-bluetooth-s-4aa9db51-6400-4e0d-aa13-850b33479b5d.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/umiB8PUGt7JvPecjBZKKRh.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The SoundLink Plus is the perfect bridge between the tiny SoundLink Flex 2 and the huge SoundLink Max. Think of it as the "just right" of Bluetooth speakers. It has a great IP67 rating, meaning it can be used at pool and beach parties without dying, and has a 20-hour battery life. <a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0F7HVC62G" target="_blank" rel="nofollow" data-dimension112="9af68680-d410-4ba5-b0ed-d0a79cfb659a" data-action="Deal Block" data-label="The SoundLink Plus is the perfect bridge between the tiny SoundLink Flex 2 and the huge SoundLink Max. Think of it as the "just right" of Bluetooth speakers. It has a great IP67 rating, meaning it can be used at pool and beach parties without dying, and has a 20-hour battery life." data-dimension48="The SoundLink Plus is the perfect bridge between the tiny SoundLink Flex 2 and the huge SoundLink Max. Think of it as the "just right" of Bluetooth speakers. It has a great IP67 rating, meaning it can be used at pool and beach parties without dying, and has a 20-hour battery life." data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="beae2c15-59c6-42ff-94c8-a2aa4ecd9445" data-action="Deal Block" data-label="Bose Ultra Open Earbuds review" data-dimension48="Bose Ultra Open Earbuds review" data-dimension25="$199" href="https://www.amazon.com/dp/B0FDKR4RVP" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:62.59%;"><img id="wjSgGFFpyDJzdztK3MZ64S" name="Bose ultra open" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wjSgGFFpyDJzdztK3MZ64S.jpg" mos="" align="middle" fullscreen="" width="679" height="425" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose Ultra Open perfected the open earbud formula. They have a comfortable, non-invasive fit, solid battery life, and they sound better than you might expect from open buds. They got 4 stars in our <a href="https://www.tomsguide.com/audio/earbuds/bose-ultra-open-earbuds" data-dimension112="beae2c15-59c6-42ff-94c8-a2aa4ecd9445" data-action="Deal Block" data-label="Bose Ultra Open Earbuds review" data-dimension48="Bose Ultra Open Earbuds review" data-dimension25="$199">Bose Ultra Open Earbuds review</a>, where we loved their simple controls and surprising lack of sound leakage. <a class="view-deal button" href="https://www.amazon.com/dp/B0FDKR4RVP" target="_blank" rel="nofollow" data-dimension112="beae2c15-59c6-42ff-94c8-a2aa4ecd9445" data-action="Deal Block" data-label="Bose Ultra Open Earbuds review" data-dimension48="Bose Ultra Open Earbuds review" data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="db946d7f-e303-4403-a713-8f8a92c0a3f8" data-action="Deal Block" data-label="QuietComfort Ultra Earbuds Gen 2" data-dimension48="QuietComfort Ultra Earbuds Gen 2" data-dimension25="$249" href="https://www.amazon.com/Bose-New-QuietComfort-Ultra-Earbuds/dp/B0F7M3HPBD" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:934px;"><p class="vanilla-image-block" style="padding-top:124.20%;"><img id="a9jV9Xm3AhpGwNWnqABVVP" name="Bose QuietComfort Ultra Earbuds gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/a9jV9Xm3AhpGwNWnqABVVP.png" mos="" align="middle" fullscreen="" width="934" height="1160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is where Bose starts to get really premium. The <a href="https://www.tomsguide.com/audio/earbuds/bose-quietcomfort-ultra-earbuds-2-review" data-dimension112="db946d7f-e303-4403-a713-8f8a92c0a3f8" data-action="Deal Block" data-label="QuietComfort Ultra Earbuds Gen 2" data-dimension48="QuietComfort Ultra Earbuds Gen 2" data-dimension25="$249">QuietComfort Ultra Earbuds Gen 2</a> are the best ANC earbuds you can get — and we've tested most of 'em. These earbuds sound excellent and will block out everyone around you. Save $50 right now.<a class="view-deal button" href="https://www.amazon.com/Bose-New-QuietComfort-Ultra-Earbuds/dp/B0F7M3HPBD" target="_blank" rel="nofollow" data-dimension112="db946d7f-e303-4403-a713-8f8a92c0a3f8" data-action="Deal Block" data-label="QuietComfort Ultra Earbuds Gen 2" data-dimension48="QuietComfort Ultra Earbuds Gen 2" data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="cacb2016-c68e-442a-8920-d02fca737e55" data-action="Deal Block" data-label="The Bose QuietComfort Ultra headphones get you epic active noise canceling, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else. Just note the newer Bose QuietComfort Ultra Headphones (Gen 2) are now available." data-dimension48="The Bose QuietComfort Ultra headphones get you epic active noise canceling, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else. Just note the newer Bose QuietComfort Ultra Headphones (Gen 2) are now available." data-dimension25="$269" href="https://www.amazon.com/dp/B0CCZ1L489/" 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:120.00%;"><img id="g64SDV3bmD2tcgopiiNgP6" name="Bose QuietComfort Ultra headphones Versus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g64SDV3bmD2tcgopiiNgP6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Ultra headphones get you epic active noise canceling, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else. Just note the newer Bose QuietComfort Ultra Headphones (Gen 2) are now available.<a class="view-deal button" href="https://www.amazon.com/dp/B0CCZ1L489/" target="_blank" rel="nofollow" data-dimension112="cacb2016-c68e-442a-8920-d02fca737e55" data-action="Deal Block" data-label="The Bose QuietComfort Ultra headphones get you epic active noise canceling, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else. Just note the newer Bose QuietComfort Ultra Headphones (Gen 2) are now available." data-dimension48="The Bose QuietComfort Ultra headphones get you epic active noise canceling, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else. Just note the newer Bose QuietComfort Ultra Headphones (Gen 2) are now available." data-dimension25="$269">View Deal</a></p></div><div class="product"><a data-dimension112="9a04256a-a34c-42a5-966d-74c42f9adf0d" data-action="Deal Block" data-label="Bose SoundLink Max" data-dimension48="Bose SoundLink Max" data-dimension25="$279" href="https://www.amazon.com/Bose-SoundLink-Portable-Waterproof-Bluetooth/dp/B0CVL1K7DX" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:958px;"><p class="vanilla-image-block" style="padding-top:83.72%;"><img id="xFfX4WEKpF3opzDYZMKnhB" name="Bose SoundLink Max.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xFfX4WEKpF3opzDYZMKnhB.jpg" mos="" align="middle" fullscreen="" width="958" height="802" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/bluetooth-speakers/bose-soundlink-max" data-dimension112="9a04256a-a34c-42a5-966d-74c42f9adf0d" data-action="Deal Block" data-label="Bose SoundLink Max" data-dimension48="Bose SoundLink Max" data-dimension25="$279">Bose SoundLink Max</a> is the most powerful of its portable speakers. This speaker is designed for soundtracking outdoor parties, house parties, and everything in between. You can save a huge $120 at the moment. You get 20 hours of playback and Bose's classic bassy sound. <a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Portable-Waterproof-Bluetooth/dp/B0CVL1K7DX" target="_blank" rel="nofollow" data-dimension112="9a04256a-a34c-42a5-966d-74c42f9adf0d" data-action="Deal Block" data-label="Bose SoundLink Max" data-dimension48="Bose SoundLink Max" data-dimension25="$279">View Deal</a></p></div><div class="product"><a data-dimension112="c2d48311-ff53-4001-a904-716107f96c56" data-action="Deal Block" data-label="Bose QuietComfort Ultra Headphones" data-dimension48="Bose QuietComfort Ultra Headphones" data-dimension25="$379" href="https://www.amazon.com/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G" 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="kB88HDDjXRQ3niWNqEpCt9" name="Bose QuietComfort Ultra Headphones Blue prod image" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kB88HDDjXRQ3niWNqEpCt9.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review" data-dimension112="c2d48311-ff53-4001-a904-716107f96c56" data-action="Deal Block" data-label="Bose QuietComfort Ultra Headphones" data-dimension48="Bose QuietComfort Ultra Headphones" data-dimension25="$379">Bose QuietComfort Ultra Headphones</a> are a little pricey at their $449 MSRP, so I'd recommend only grabbing them while they're on sale. Thankfully, they're just $379 right now, which makes them great value. You get best-in-class ANC and supreme comfort — I'd recommend these headphones to anyone who spends a lot of time traveling. <a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G" target="_blank" rel="nofollow" data-dimension112="c2d48311-ff53-4001-a904-716107f96c56" data-action="Deal Block" data-label="Bose QuietComfort Ultra Headphones" data-dimension48="Bose QuietComfort Ultra Headphones" data-dimension25="$379">View Deal</a></p></div><div class="product"><a data-dimension112="c8724ffe-b943-4663-9472-ad3162b137e4" data-action="Deal Block" data-label="Bose Smart Soundbar review" data-dimension48="Bose Smart Soundbar review" data-dimension25="$399" href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" 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:120.00%;"><img id="rJbLARrb3giTtDi2jTiuGE" name="Bose Smart Soundbar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rJbLARrb3giTtDi2jTiuGE.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>We checked out this soundbar in our <a href="https://www.tomsguide.com/audio/soundbars/bose-smart-soundbar-review" data-dimension112="c8724ffe-b943-4663-9472-ad3162b137e4" data-action="Deal Block" data-label="Bose Smart Soundbar review" data-dimension48="Bose Smart Soundbar review" data-dimension25="$399">Bose Smart Soundbar review</a> and loved the sound quality for both TV and music. Movie fans may want a soundbar with more bass to really get immersed, but you do get Dolby Atmos support. Save $150 right now.<a class="view-deal button" href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" target="_blank" rel="nofollow" data-dimension112="c8724ffe-b943-4663-9472-ad3162b137e4" data-action="Deal Block" data-label="Bose Smart Soundbar review" data-dimension48="Bose Smart Soundbar review" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="53477678-d892-44a1-88a6-2b42a0c0ad11" data-action="Deal Block" data-label="This is a huge $300 discount. The Bose Smart Ultra soundbar is at its lowest ever price right now. This premium soundbar has a 5.1.2 channel setup and works with Bose's subwoofer range (sold separately). One of the best parts of the Bose Smart range links up with music streaming apps for seamless listening!" data-dimension48="This is a huge $300 discount. The Bose Smart Ultra soundbar is at its lowest ever price right now. This premium soundbar has a 5.1.2 channel setup and works with Bose's subwoofer range (sold separately). One of the best parts of the Bose Smart range links up with music streaming apps for seamless listening!" data-dimension25="$699" href="https://www.amazon.com/Bose-Soundbar-Wireless-Bluetooth-Surround/dp/B0C548MYF3" 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="dLLYXWpy2mJsCzXj262Tq6" name="bose smart soundbar ultra" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dLLYXWpy2mJsCzXj262Tq6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is a huge $300 discount. The Bose Smart Ultra soundbar is at its lowest ever price right now. This premium soundbar has a 5.1.2 channel setup and works with Bose's subwoofer range (sold separately). One of the best parts of the Bose Smart range links up with music streaming apps for seamless listening!<a class="view-deal button" href="https://www.amazon.com/Bose-Soundbar-Wireless-Bluetooth-Surround/dp/B0C548MYF3" target="_blank" rel="nofollow" data-dimension112="53477678-d892-44a1-88a6-2b42a0c0ad11" data-action="Deal Block" data-label="This is a huge $300 discount. The Bose Smart Ultra soundbar is at its lowest ever price right now. This premium soundbar has a 5.1.2 channel setup and works with Bose's subwoofer range (sold separately). One of the best parts of the Bose Smart range links up with music streaming apps for seamless listening!" data-dimension48="This is a huge $300 discount. The Bose Smart Ultra soundbar is at its lowest ever price right now. This premium soundbar has a 5.1.2 channel setup and works with Bose's subwoofer range (sold separately). One of the best parts of the Bose Smart range links up with music streaming apps for seamless listening!" data-dimension25="$699">View Deal</a></p></div><h3 class="article-body__section" id="section-more-audio-deals"><span>More Audio deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=audio&view_mode=savings_squad&widget_title=Best+Prime+Day+Audio+Deals&widget_subtitle=Here%27s+the+top+sales+currently+available%2C+curated+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      width: 100%;      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 120px;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 16px 16px 8px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }                  .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 14px;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    .tg-df-grid-wrapper { position: relative; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.40);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #1f69ff; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #0056e0; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \x3C/div>                  \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E      \x3Cdiv class="tg-df-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-filters">          \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>          \x3C/div>        \x3C/div>        \x3C/div>      \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = mode === 'savings_squad' ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = params.get('view_mode');          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              this.searchInput.value = this.currentQuery;            }          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'date_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          if (matches.length > 0) {                 this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                 this.autocompleteDropdown.classList.add('active');             } else {                 this.autocompleteDropdown.classList.remove('active');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    this.deals = [];                    this.render();                  }                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = tag;                   }                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = 'date_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }        async fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (!this.activeDealTag && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.forEach((article) => {             if (!article.articlepage) return;             let pageData = [];             try { pageData = JSON.parse(article.articlepage[0]); } catch(e){ console.warn(e); }             const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');             savingsSquad.forEach((block) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : 'date_desc';          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)}${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_div}                         ${_div}                      ${_div}                    ` : ''}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>View Deal${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit) {            dealsHtml += `              \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer;">Load More${_button}              ${_div}            `;          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));               }          }, 50);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += 12;              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Bose 4th of July sale: 11 deals I'd grab from $99 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/bose-headphones-and-speakers-are-still-up-to-50-percent-off-after-prime-day-11-deals-to-grab-while-you-still-can</link>
                                                                            <description>
                            <![CDATA[ Even though Prime Day is over, Amazon is knocking up to 50% off Bose speakers and headphones. Check out my favorite picks from the ongoing sale. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">UZg9X3PYsELvWNwKfLovVB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/B5XvHVAkvArsDunVyieL2S-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 30 Jun 2026 10:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 30 Jun 2026 13:48:11 +0000</updated>
                                                                                                                                            <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Olivia Halevy ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/YAg7Fmh9dGKbg3hULBMWiU.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Olivia is a Deals Writer at Tom’s Guide. She loves all things lifestyle, shopping and sourcing the best deals from some of the top brands, retailers and websites around. From fashion and beauty to smart home and tech, she has an eye for finding practical, stylish, and reasonably-priced items that help make life simpler (and a little more aesthetically-pleasing).&amp;nbsp;Olivia has over five years of experience writing lifestyle, commerce, and branded content for &lt;a href=&quot;http://patch.com/&quot;&gt;Patch.com&lt;/a&gt;. She&#039;s covered major shopping holidays like Amazon Prime Day, Black Friday and Cyber Monday. In her free time, she enjoys trying out new exercise classes, binge-watching the latest viral TV shows, cooking, spending time with family and taking long walks with her dog, Gus.&amp;nbsp;&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/B5XvHVAkvArsDunVyieL2S-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon / edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose]]></media:description>                                                            <media:text><![CDATA[Bose]]></media:text>
                                <media:title type="plain"><![CDATA[Bose]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/B5XvHVAkvArsDunVyieL2S-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Prime Day 2026 is behind us, but <a href="https://www.tomsguide.com/sales-events/best-4th-of-july-sales-2026-walmart-home-depot-more">4th of July sales</a> are just getting started and Bose is offering huge discounts across the board. </p><p>For a limited time, <a href="https://www.amazon.com/stores/page/CF83CBD2-8339-43EA-A7F0-3E43FFA9177E?" target="_blank" rel="nofollow">Bose headphones and speakers are up to 50% off at Amazon</a>. If you're hoping to score some new audio devices for summer, you're going to want to jump on these lingering deals ASAP. For instance, you can grab <a href="https://www.amazon.com/Bose-SoundLink-Flex-Bluetooth-Speaker/dp/B0FGY8BBVP/" target="_blank" rel="nofollow">the Bose SoundLink Flex for just $99</a>. Need some new headphones? You can't go wrong with the <a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" target="_blank" rel="nofollow">Bose QuietComfort Headphones for $179</a>. They're currently a whopping $180 off.</p><p>We don't know how long these rare Bose deals will last, so we recommend adding to cart immediately. Keep scrolling to check out the rest of my favorite picks from the sale. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links </span></h3><ul><li><a href="https://www.amazon.com/stores/page/CF83CBD2-8339-43EA-A7F0-3E43FFA9177E" target="_blank" rel="nofollow"><strong>shop all Bose deals on Amazon</strong></a></li><li><strong>Bose SoundLink Flex (Gen 2): </strong><a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0D6WB7BV6" target="_blank" rel="nofollow"><strong>was $149 now $99</strong></a></li><li><strong>Bose QuietComfort Bluetooth Earbud: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Lifestyle-Cancellation/dp/B0D8BWD76H" target="_blank" rel="nofollow"><strong>was $179 now $129</strong></a></li><li><strong>Bose QuietComfort Earbuds 2: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow"><strong>was $279 now $149</strong></a></li><li><strong>Bose QuietComfort Headphones: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" target="_blank" rel="nofollow"><strong>was $359 now $179</strong></a></li><li><strong>Bose Ultra Open Earbuds: </strong><a href="https://www.amazon.com/dp/B0CPFV77W4/" target="_blank" rel="nofollow"><strong>was $299 now $199</strong></a></li><li><strong>Bose SoundLink Max: </strong><a href="https://www.amazon.com/dp/B0CVL1K7DX/" target="_blank" rel="nofollow"><strong>was $399 now $279</strong></a></li><li><strong>Bose QuietComfort Ultra Headphones Gen 2: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G" target="_blank" rel="nofollow"><strong>was $449 now $369</strong></a></li></ul><h3 class="article-body__section" id="section-best-bose-deals"><span>Best Bose Deals</span></h3><div class="product"><a data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$99" href="https://www.amazon.com/Bose-SoundLink-Flex-Bluetooth-Speaker/dp/B0FGY8BBVP/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1063px;"><p class="vanilla-image-block" style="padding-top:73.00%;"><img id="4oVcFP6PokTpSnss5yrCLB" name="Bose Soundlink Flex" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4oVcFP6PokTpSnss5yrCLB.jpg" mos="" align="middle" fullscreen="" width="1063" height="776" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The new Bose SoundLink (2nd gen) is a compact and powerful Bluetooth speaker with a durable design. This 1.2-pound speaker is water and dust proof and delivered great sound quality in our <a href="https://www.tomsguide.com/audio/bose-soundlink-flex-2-review" target="_blank" data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$99">SoundLink Flex gen 2 review</a>. With 12 hours of battery life and $59 off, you have yourself a great deal.<a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Flex-Bluetooth-Speaker/dp/B0FGY8BBVP/" target="_blank" rel="nofollow" data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="530ab1fc-7bcf-4b2b-9ce1-226b47a27fdd" data-action="Deal Block" data-label="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $129." data-dimension48="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $129." data-dimension25="$129" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Lifestyle-Cancellation/dp/B0D8BWD76H" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:95.43%;"><img id="tEtgPEcP9tofgugi8QdrcP" name="Bose quietcomfort" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tEtgPEcP9tofgugi8QdrcP.jpg" mos="" align="middle" fullscreen="" width="679" height="648" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $129.<a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Lifestyle-Cancellation/dp/B0D8BWD76H" target="_blank" rel="nofollow" data-dimension112="530ab1fc-7bcf-4b2b-9ce1-226b47a27fdd" data-action="Deal Block" data-label="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $129." data-dimension48="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $129." data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$149" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:996px;"><p class="vanilla-image-block" style="padding-top:115.06%;"><img id="z2eEQ66QuaM6umZmg8fKoL" name="1715191898.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/z2eEQ66QuaM6umZmg8fKoL.jpg" mos="" align="middle" fullscreen="" width="996" height="1146" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Earbuds 2 take active noise cancellation to the next level. In our <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-earbuds-2" data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$149">Bose QuietComfort Earbuds 2 review</a>, we said these buds are a remarkable follow-up to their predecessors delivering better sound, call quality and unrivaled ANC. Sound balance and noise neutralization work extremely well and the battery life is up to 6 hours, with an extra 24 hours via the charging case.<a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow" data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="06fcf086-8389-4303-92ba-52c2eacb6532" data-action="Deal Block" data-label="This relatively new Bluetooth speaker is only just seeing its first discounts, and they're really good. This is a big saving on a speaker that offers great sound quality and 20 hours of battery life." data-dimension48="This relatively new Bluetooth speaker is only just seeing its first discounts, and they're really good. This is a big saving on a speaker that offers great sound quality and 20 hours of battery life." data-dimension25="$179" href="https://www.amazon.com/dp/B0F7HVC62G/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1227px;"><p class="vanilla-image-block" style="padding-top:65.04%;"><img id="9ijfXyWiRHYsywonwsmRwQ" name="soundlink plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9ijfXyWiRHYsywonwsmRwQ.jpg" mos="" align="middle" fullscreen="" width="1227" height="798" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This relatively new Bluetooth speaker is only just seeing its first discounts, and they're really good. This is a big saving on a speaker that offers great sound quality and 20 hours of battery life.<a class="view-deal button" href="https://www.amazon.com/dp/B0F7HVC62G/" target="_blank" rel="nofollow" data-dimension112="06fcf086-8389-4303-92ba-52c2eacb6532" data-action="Deal Block" data-label="This relatively new Bluetooth speaker is only just seeing its first discounts, and they're really good. This is a big saving on a speaker that offers great sound quality and 20 hours of battery life." data-dimension48="This relatively new Bluetooth speaker is only just seeing its first discounts, and they're really good. This is a big saving on a speaker that offers great sound quality and 20 hours of battery life." data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$179" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:134.46%;"><img id="hHbg269p5MJKe2LQvoMyMd" name="bose quietcomfort" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hHbg269p5MJKe2LQvoMyMd.jpg" mos="" align="middle" fullscreen="" width="679" height="913" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>In our <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-headphones" data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$179">Bose QuietComfort Headphones review</a>, we said these are "excellent always-on noise-cancelers with enhanced sound and battery life." They're missing spatial audio mode and touch controls, but for $180 less, these are nearly perfect. <a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" target="_blank" rel="nofollow" data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="75d09ad7-6976-4d09-9943-db9ef4594a80" data-action="Deal Block" data-label="This budget soundbar will bring extra dialogue clarity to make sure you can hear every word of commentary. It's also louder than your TV speakers, so you can crank it up and enjoy background music to the max." data-dimension48="This budget soundbar will bring extra dialogue clarity to make sure you can hear every word of commentary. It's also louder than your TV speakers, so you can crank it up and enjoy background music to the max." data-dimension25="$199" href="https://www.amazon.com/dp/B088KRPCQJ/" 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:39.47%;"><img id="AHTTmLHs5odVXSuSHG9SB9" name="TV speaker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AHTTmLHs5odVXSuSHG9SB9.png" mos="" align="middle" fullscreen="" width="1500" height="592" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This budget soundbar will bring extra dialogue clarity to make sure you can hear every word of commentary. It's also louder than your TV speakers, so you can crank it up and enjoy background music to the max.<a class="view-deal button" href="https://www.amazon.com/dp/B088KRPCQJ/" target="_blank" rel="nofollow" data-dimension112="75d09ad7-6976-4d09-9943-db9ef4594a80" data-action="Deal Block" data-label="This budget soundbar will bring extra dialogue clarity to make sure you can hear every word of commentary. It's also louder than your TV speakers, so you can crank it up and enjoy background music to the max." data-dimension48="This budget soundbar will bring extra dialogue clarity to make sure you can hear every word of commentary. It's also louder than your TV speakers, so you can crank it up and enjoy background music to the max." data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$199" href="https://www.amazon.com/dp/B0CPFV77W4/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1268px;"><p class="vanilla-image-block" style="padding-top:62.38%;"><img id="qDBpkjESq4Z3UsvHc4vEeX" name="bose open earbuds" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qDBpkjESq4Z3UsvHc4vEeX.jpg" mos="" align="middle" fullscreen="" width="1268" height="791" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose Ultra Open perfected the open earbud formula. They have a comfortable, non-invasive fit, solid battery life, and they sound better than you might expect from open buds. They got <a href="https://www.tomsguide.com/audio/earbuds/bose-ultra-open-earbuds" data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$199">4 stars in our review</a>, where we loved their simple controls and surprising lack of sound leakage. <a class="view-deal button" href="https://www.amazon.com/dp/B0CPFV77W4/" target="_blank" rel="nofollow" data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="21614f99-e07c-4c54-94d8-3bccf72b5cc5" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension25="$249" href="https://www.amazon.com/dp/B0F7M3HPBD?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:934px;"><p class="vanilla-image-block" style="padding-top:124.20%;"><img id="a9jV9Xm3AhpGwNWnqABVVP" name="Bose QuietComfort Ultra Earbuds gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/a9jV9Xm3AhpGwNWnqABVVP.png" mos="" align="middle" fullscreen="" width="934" height="1160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly.<a class="view-deal button" href="https://www.amazon.com/dp/B0F7M3HPBD?" target="_blank" rel="nofollow" data-dimension112="21614f99-e07c-4c54-94d8-3bccf72b5cc5" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="c097b7bc-cc7a-4220-95f9-3407c8e22bd8" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension48="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension25="$299" href="https://www.amazon.com/dp/B0CN9FTKJ4" 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:120.00%;"><img id="g64SDV3bmD2tcgopiiNgP6" name="Bose QuietComfort Ultra headphones Versus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g64SDV3bmD2tcgopiiNgP6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else.<a class="view-deal button" href="https://www.amazon.com/dp/B0CN9FTKJ4" target="_blank" rel="nofollow" data-dimension112="c097b7bc-cc7a-4220-95f9-3407c8e22bd8" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension48="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension25="$299">View Deal</a></p></div><div class="product"><a data-dimension112="62651099-3d29-49e4-b22d-e0f44917f1e5" data-action="Deal Block" data-label="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension48="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension25="$279" href="https://www.amazon.com/dp/B0CVL1K7DX/" 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="dT2cC2J8saDETsZvrBwfqk" name="Bose_SoundLink_Max_square.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dT2cC2J8saDETsZvrBwfqk.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time. <a class="view-deal button" href="https://www.amazon.com/dp/B0CVL1K7DX/" target="_blank" rel="nofollow" data-dimension112="62651099-3d29-49e4-b22d-e0f44917f1e5" data-action="Deal Block" data-label="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension48="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension25="$279">View Deal</a></p></div><div class="product"><a data-dimension112="529e2276-a73d-49dd-8994-c3234f0a6f30" data-action="Deal Block" data-label="Bose QuietComfort Ultra Headphones" data-dimension48="Bose QuietComfort Ultra Headphones" data-dimension25="$369" href="https://www.amazon.com/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G" 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="kB88HDDjXRQ3niWNqEpCt9" name="Bose QuietComfort Ultra Headphones Blue prod image" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kB88HDDjXRQ3niWNqEpCt9.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review" data-dimension112="529e2276-a73d-49dd-8994-c3234f0a6f30" data-action="Deal Block" data-label="Bose QuietComfort Ultra Headphones" data-dimension48="Bose QuietComfort Ultra Headphones" data-dimension25="$369">Bose QuietComfort Ultra Headphones</a> are a little overpriced at their $449 MSRP, so I'd recommend only grabbing them while they're on sale. Thankfully, they're just $369 right now, which makes them great value. You get best-in-class ANC and supreme comfort — I'd recommend these headphones to anyone who spends a lot of time traveling. <a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G" target="_blank" rel="nofollow" data-dimension112="529e2276-a73d-49dd-8994-c3234f0a6f30" data-action="Deal Block" data-label="Bose QuietComfort Ultra Headphones" data-dimension48="Bose QuietComfort Ultra Headphones" data-dimension25="$369">View Deal</a></p></div><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Audio&view_mode=savings_squad&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      width: 100%;      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 120px;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 16px 16px 8px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }                  .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 14px;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    .tg-df-grid-wrapper { position: relative; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.40);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #1f69ff; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #0056e0; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \x3C/div>                  \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E      \x3Cdiv class="tg-df-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-filters">          \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>          \x3C/div>        \x3C/div>        \x3C/div>      \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          const showHeaderDetails = params.get('show_header_details') !== 'false';          const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = (mode === 'savings_squad' && showHeaderDetails) ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = params.get('view_mode');          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              this.searchInput.value = this.currentQuery;            }          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'date_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          if (matches.length > 0) {                 this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                 this.autocompleteDropdown.classList.add('active');             } else {                 this.autocompleteDropdown.classList.remove('active');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    this.deals = [];                    this.render();                  }                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = tag;                   }                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = 'date_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }        async fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = this.getRowsLimit();                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=${siteParam}&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (!this.activeDealTag && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.forEach((article) => {             if (!article.articlepage) return;             let pageData = [];             try { pageData = JSON.parse(article.articlepage[0]); } catch(e){ console.warn(e); }             const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');             savingsSquad.forEach((block) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : 'date_desc';          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)}${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover; flex-shrink: 0;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_div}                         ${_div}                      ${_div}                    ` : ''}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>View Deal${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover; flex-shrink: 0;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit) {            dealsHtml += `              \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer;">Load More${_button}              ${_div}            `;          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));          }, 50);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += this.getRowsLimit();              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I test Bluetooth speakers for a living and I’ve found the best Prime Day speaker deals from Bose, JBL, Marshall and more, starting from just $27 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/bluetooth-speakers/amazon-prime-day-2026-bluetooth-speakers-deals</link>
                                                                            <description>
                            <![CDATA[ Whether you want to soundtrack a party, do karaoke in the shower, or simply listen to music out loud, I've found the best Prime Day deals on Bose, JBL and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JuJkjagRgfDDULXKWPUuKM</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/TwtG5aUn6cyrzZVgnMrPTe-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 23 Jun 2026 18:12:37 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Bluetooth Speakers]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Speakers]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres.&lt;/p&gt;&lt;p&gt;A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/TwtG5aUn6cyrzZVgnMrPTe-1280-80.jpg">
                                                            <media:credit><![CDATA[Marshall / Bose / JBL / Tribit / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A selection of Bluetooth speakers]]></media:description>                                                            <media:text><![CDATA[A selection of Bluetooth speakers]]></media:text>
                                <media:title type="plain"><![CDATA[A selection of Bluetooth speakers]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/TwtG5aUn6cyrzZVgnMrPTe-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I don't know about you, but I love listening to music whenever possible. Though I usually use earbuds or headphones to do so, I like jamming to my favorite tunes by listening to them through the <a href="https://www.tomsguide.com/us/best-bluetooth-speakers,review-1982.html">best Bluetooth speakers</a> too, especially if I'm hanging out with my partner. Or soundtracking a party. Or performing karaoke in the shower. Or dancing to Tame Impala while I cook.</p><p>Technology has come leaps and bounds, and today, we're spoilt for choice when it comes to speakers. With so many choices, where do you even start? Luckily for you, I review speakers for a living, and this <a href="https://www.tomsguide.com/live/news/prime-day-2026-handpicked-editor-recommended-deals-live">Amazon Prime Day</a>, I've handpicked my top deals, starting from just $27.</p><p>Yep, the <a href="https://www.amazon.com/Tribit-Bluetooth-StormBox-Playtime-Waterproof/dp/B0DSPJZKPK/" target="_blank" rel="nofollow">Tribit StormBox Mini+ is down to just $27</a>! It's the speaker I use at home, and for its size, it can get very loud. But what about those who don't want a small speaker and want a big, boombox-style one with Earth-shaking bass? You're in luck: the <a href="https://www.amazon.com/JBL-Xtreme-Waterproof-PartyBoost-Multi-speaker/dp/B0CTP191Z3/" target="_blank" rel="nofollow">JBL Xtreme 4 is 34% off right now</a>, and this deal saves you $130.</p><p>Fans of rock 'n' roll may want to consider picking up the <a href="https://www.amazon.com/Marshall-Acton-Bluetooth-Speaker-Black/dp/B0BC27MM5Z/" target="_blank" rel="nofollow">Marshall Acton III, available for just $179 this Prime Day</a>, and its drool-worthy looks and tactile amp-like controls are a sight to behold. Or if you want a party speaker that doubles as a guitar amp <em>and </em>karaoke machine, how about the <a href="https://www.amazon.com/Marshall-Bromley-Portable-Wireless-Speaker/dp/B0FTZXFVJ1/" target="_blank" rel="nofollow">Marshall Bromley 750, which is down to its lowest-ever price of $999 right now</a>?</p><p>And there's a lot more where that came from! Keep reading for the best Prime Day speaker deals you can grab this week.</p><h2 id="meet-your-bluetooth-speakers-deals-expert">Meet your Bluetooth speakers deals expert</h2><h2 class="article-body__section" id="section-quick-links"><span>Quick links</span></h2><ul><li><strong></strong><a href="https://www.amazon.com/primeday" target="_blank" rel="nofollow"><strong>Shop all Amazon Prime Day deals now</strong></a><strong></strong></li><li><strong>JBL Flip 7: </strong><a href="https://www.amazon.com/JBL-Flip-Waterproof-Interchangeable-Accessories/dp/B0DMYQ32SC/" target="_blank" rel="nofollow"><strong>was $149 now $94</strong></a><strong></strong></li><li><strong>JBL Xtreme 4: </strong><a href="https://www.amazon.com/JBL-Xtreme-Waterproof-PartyBoost-Multi-speaker/dp/B0CTP191Z3/" target="_blank" rel="nofollow"><strong>was $379 now $249</strong></a><strong></strong></li><li><strong>JBL Charge 6: </strong><a href="https://www.amazon.com/JBL-Charge-Waterproof-Drop-Proof-Built/dp/B0DN2ZCZX6/" target="_blank" rel="nofollow"><strong>was $199 now $159</strong></a><strong></strong></li><li><strong>JBL Go 5: </strong><a href="https://www.amazon.com/JBL-Ultra-Portable-Waterproof-Drop-Proof-Compatible/dp/B0GHY1H2JS/" target="_blank" rel="nofollow"><strong>was $54 now $44</strong></a><strong></strong></li><li><strong>Bose SoundLink Max: </strong><a href="https://www.amazon.com/Bose-SoundLink-Portable-Waterproof-Bluetooth/dp/B0CVL1K7DX/" target="_blank" rel="nofollow"><strong>was $399 now $279</strong></a><strong></strong></li><li><strong>Bose SoundLink Flex (2nd Gen): </strong><a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16/" target="_blank" rel="nofollow"><strong>was $139 now $99</strong></a><strong></strong></li><li><strong>Marshall Emberton III: </strong><a href="https://www.amazon.com/Marshall-Emberton-Portable-Bluetooth-Speaker/dp/B0GXH3N61Z/" target="_blank" rel="nofollow"><strong>was $179 now $99</strong></a><strong></strong></li><li><strong>Marshall Acton III: </strong><a href="https://www.amazon.com/Marshall-Acton-Bluetooth-Speaker-Black/dp/B0BC27MM5Z/" target="_blank" rel="nofollow"><strong>was $299 now $179</strong></a><strong></strong></li><li><strong>Marshall Stanmore III: </strong><a href="https://www.amazon.com/Marshall-Stanmore-Bluetooth-Wireless-Speaker/dp/B09HTFCR59/" target="_blank" rel="nofollow"><strong>was $399 now $249</strong></a><strong></strong></li><li><strong>Marshall Bromley 750: </strong><a href="https://www.amazon.com/Marshall-Bromley-Portable-Wireless-Speaker/dp/B0FTZXFVJ1/" target="_blank" rel="nofollow"><strong>was $1,299 now $999</strong></a><strong></strong></li><li><strong>Tribit StormBox Lava: </strong><a href="https://www.amazon.com/Tribit-StormBox-Portable-Bluetooth-Waterproof/dp/B0DN5F9BC2/" target="_blank" rel="nofollow"><strong>was $139 now $94</strong></a><strong></strong></li><li><strong>Tribit StormBox Micro 3: </strong><a href="https://www.amazon.com/Tribit-StormBox-Portable-Bluetooth-Waterproof/dp/B0GF6PPS4S/" target="_blank" rel="nofollow"><strong>was $64 now $47</strong></a><strong></strong></li><li><strong>Tribit StormBox Mini+:</strong><a href="https://www.amazon.com/Tribit-StormBox-Bluetooth-360%C2%B0Surround-Waterproof/dp/B0DSPCW5M5/" target="_blank" rel="nofollow"><strong> was $34 now $27</strong></a></li><li><strong>EarFun UBoom L: </strong><a href="https://www.amazon.com/Bluetooth-EarFun-Portable-Waterproof-Dustproof/dp/B0B1PJ5SQ7/" target="_blank" rel="nofollow"><strong>was $79 now $52</strong></a></li><li><strong>8BitDo Retro Cube 2: </strong><a href="https://www.amazon.com/Portable-Bluetooth-Wireless-Charging-Connections/dp/B0G48LRFP4/" target="_blank" rel="nofollow"><strong>was $55 now $49</strong></a></li></ul><h2 class="article-body__section" id="section-best-prime-day-jbl-deals"><span>Best Prime Day JBL deals</span></h2><div class="product"><a data-dimension112="a001cab0-5f1e-4a1f-8385-3005dec17a9d" data-action="Deal Block" data-label="JBL Flip 7" data-dimension48="JBL Flip 7" data-dimension25="$94" href="https://www.amazon.com/JBL-Flip-Waterproof-Interchangeable-Accessories/dp/B0DMYQ32SC/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6723px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="TSUFRZEoBKMVXB5HoEYo4d" name="JBL Flip 7" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/TSUFRZEoBKMVXB5HoEYo4d.jpg" mos="" align="middle" fullscreen="" width="6723" height="6723" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/bluetooth-speakers/i-just-tested-the-jbl-flip-7-is-it-the-best-compact-bluetooth-speaker-yet" data-dimension112="a001cab0-5f1e-4a1f-8385-3005dec17a9d" data-action="Deal Block" data-label="JBL Flip 7" data-dimension48="JBL Flip 7" data-dimension25="$94">JBL Flip 7</a> is small and powerful yet adamantly refuses to compromise on sound quality, particularly bass. There are very few minor things I’d change — let’s beef up that (admittedly still decent) battery life, enable stereo output on other JBL models, and crowbar in a low-latency mode for streaming and gaming.<a class="view-deal button" href="https://www.amazon.com/JBL-Flip-Waterproof-Interchangeable-Accessories/dp/B0DMYQ32SC/" target="_blank" rel="nofollow" data-dimension112="a001cab0-5f1e-4a1f-8385-3005dec17a9d" data-action="Deal Block" data-label="JBL Flip 7" data-dimension48="JBL Flip 7" data-dimension25="$94">View Deal</a></p></div><div class="product"><a data-dimension112="2b8c4704-662c-44dd-af51-d6466b70ee86" data-action="Deal Block" data-label="JBL Xtreme 4" data-dimension48="JBL Xtreme 4" data-dimension25="$249" href="https://www.amazon.com/JBL-Xtreme-Waterproof-PartyBoost-Multi-speaker/dp/B0CTP191Z3/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="L2TjtWjKvMz35uXeyxCSKR" name="JBL Xtreme 4.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/L2TjtWjKvMz35uXeyxCSKR.jpg" mos="" align="middle" fullscreen="" width="679" height="679" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Because it has been succeeded by a 5th-gen speaker, now's a great time to buy the <a href="https://www.tomsguide.com/audio/bluetooth-speakers/jbl-xtreme-4-review" data-dimension112="2b8c4704-662c-44dd-af51-d6466b70ee86" data-action="Deal Block" data-label="JBL Xtreme 4" data-dimension48="JBL Xtreme 4" data-dimension25="$249">JBL Xtreme 4</a> as it has been discounted by $130. It boasts customizable EQ, PartyBoost with AuraCast, and ear-splitting (in a good way) volume. We love its IP67 waterproofing, easy-to-use app, and the fact that it doubles as a power bank.<a class="view-deal button" href="https://www.amazon.com/JBL-Xtreme-Waterproof-PartyBoost-Multi-speaker/dp/B0CTP191Z3/" target="_blank" rel="nofollow" data-dimension112="2b8c4704-662c-44dd-af51-d6466b70ee86" data-action="Deal Block" data-label="JBL Xtreme 4" data-dimension48="JBL Xtreme 4" data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="3742ae23-0d1b-46f0-9f6f-edc0e572c44c" data-action="Deal Block" data-label="JBL Go 5" data-dimension48="JBL Go 5" data-dimension25="$44" href="https://www.amazon.com/JBL-Ultra-Portable-Waterproof-Drop-Proof-Compatible/dp/B0GHY1H2JS/" 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="YHNWrEwxj5uzgYGXCTeiJ6" name="Go5-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YHNWrEwxj5uzgYGXCTeiJ6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/bluetooth-speakers/jbl-go-5-review" data-dimension112="3742ae23-0d1b-46f0-9f6f-edc0e572c44c" data-action="Deal Block" data-label="JBL Go 5" data-dimension48="JBL Go 5" data-dimension25="$44">JBL Go 5</a> boasts a wide soundstage packed into a compact, pocketable body. It looks great, sounds even better, and can be customized via a user-friendly companion app. It’s IP68-rated, so it’s highly waterproof, dustproof and drop-proof too.<a class="view-deal button" href="https://www.amazon.com/JBL-Ultra-Portable-Waterproof-Drop-Proof-Compatible/dp/B0GHY1H2JS/" target="_blank" rel="nofollow" data-dimension112="3742ae23-0d1b-46f0-9f6f-edc0e572c44c" data-action="Deal Block" data-label="JBL Go 5" data-dimension48="JBL Go 5" data-dimension25="$44">View Deal</a></p></div><h2 class="article-body__section" id="section-best-prime-day-bose-deals"><span>Best Prime Day Bose deals</span></h2><div class="product"><a data-dimension112="cf2b00d3-f036-45fa-aa66-5596966fae63" data-action="Deal Block" data-label="SoundLink Max" data-dimension48="SoundLink Max" data-dimension25="$279" href="https://www.amazon.com/Bose-SoundLink-Portable-Waterproof-Bluetooth/dp/B0CVL1K7DX/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:958px;"><p class="vanilla-image-block" style="padding-top:83.72%;"><img id="xFfX4WEKpF3opzDYZMKnhB" name="Bose SoundLink Max.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xFfX4WEKpF3opzDYZMKnhB.jpg" mos="" align="middle" fullscreen="" width="958" height="802" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A great addition to Bose's Bluetooth speaker lineup, the <a href="https://www.tomsguide.com/audio/bluetooth-speakers/bose-soundlink-max" data-dimension112="cf2b00d3-f036-45fa-aa66-5596966fae63" data-action="Deal Block" data-label="SoundLink Max" data-dimension48="SoundLink Max" data-dimension25="$279">SoundLink Max</a> delivers expansive stereo sound, a 20-hour battery life and is one of the most practical portable speakers for life on the move. It boasts a wide soundstage and can get very loud without music sounding distorted.<a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Portable-Waterproof-Bluetooth/dp/B0CVL1K7DX/" target="_blank" rel="nofollow" data-dimension112="cf2b00d3-f036-45fa-aa66-5596966fae63" data-action="Deal Block" data-label="SoundLink Max" data-dimension48="SoundLink Max" data-dimension25="$279">View Deal</a></p></div><div class="product"><a data-dimension112="307842e7-8741-428a-806a-1b09eb8511a2" data-action="Deal Block" data-label="Bose SoundLink Flex Gen 2" data-dimension48="Bose SoundLink Flex Gen 2" data-dimension25="$99" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1303px;"><p class="vanilla-image-block" style="padding-top:74.75%;"><img id="hfwnfPdrGwgnEcbUXqjbCP" name="SoundLink Flex Bluetooth Speaker (2nd gen)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hfwnfPdrGwgnEcbUXqjbCP.png" mos="" align="middle" fullscreen="" width="1303" height="974" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>It’s slightly more expensive than the competition, but the <a href="https://www.tomsguide.com/audio/bose-soundlink-flex-2-review" data-dimension112="307842e7-8741-428a-806a-1b09eb8511a2" data-action="Deal Block" data-label="Bose SoundLink Flex Gen 2" data-dimension48="Bose SoundLink Flex Gen 2" data-dimension25="$99">Bose SoundLink Flex Gen 2</a> justifies its higher price with great sound quality and app connectivity. I think it looks great, too, and the new color options make for a super fashionable portable speaker.<a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16/" target="_blank" rel="nofollow" data-dimension112="307842e7-8741-428a-806a-1b09eb8511a2" data-action="Deal Block" data-label="Bose SoundLink Flex Gen 2" data-dimension48="Bose SoundLink Flex Gen 2" data-dimension25="$99">View Deal</a></p></div><h2 class="article-body__section" id="section-best-prime-day-marshall-deals"><span>Best Prime Day Marshall deals</span></h2><div class="product"><a data-dimension112="cd64f3a0-6682-493c-b30b-cc95d48ffc00" data-action="Deal Block" data-label="Marshall Emberton III" data-dimension48="Marshall Emberton III" data-dimension25="$99" href="https://www.amazon.com/Marshall-Emberton-Portable-Bluetooth-Speaker/dp/B0GXH3N61Z/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1509px;"><p class="vanilla-image-block" style="padding-top:99.34%;"><img id="HTvaeX4MhcAV7Mw3cX4oUM" name="marshall Emberton III.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HTvaeX4MhcAV7Mw3cX4oUM.jpg" mos="" align="middle" fullscreen="" width="1509" height="1499" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/marshal-emberton-iii-review" data-dimension112="cd64f3a0-6682-493c-b30b-cc95d48ffc00" data-action="Deal Block" data-label="Marshall Emberton III" data-dimension48="Marshall Emberton III" data-dimension25="$99">Marshall Emberton III</a> is, in one word, epic. It is one of the brand's smaller speakers, but it packs solid sound into a very tasty-looking design. From the control knob found on loads of Marshall gear to the impactful sound, the Emberton III is a great Bluetooth speaker if you’re looking for something unique and stylish.<a class="view-deal button" href="https://www.amazon.com/Marshall-Emberton-Portable-Bluetooth-Speaker/dp/B0GXH3N61Z/" target="_blank" rel="nofollow" data-dimension112="cd64f3a0-6682-493c-b30b-cc95d48ffc00" data-action="Deal Block" data-label="Marshall Emberton III" data-dimension48="Marshall Emberton III" data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="a5fbf596-9366-4937-a1e8-b62788fe2dd9" data-action="Deal Block" data-label="The Marshall Acton III is a retro-looking Bluetooth speaker that can actually make your setup feel more modern. The physical controls are tactile and satisfying, making sure it's easy for you to get the sound you want. Thanks to its large cabinet size and quality audio engineering inside, it's hard to be disappointed in the Acton III. The bass is also super responsive, making it a top-tier choice for parties." data-dimension48="The Marshall Acton III is a retro-looking Bluetooth speaker that can actually make your setup feel more modern. The physical controls are tactile and satisfying, making sure it's easy for you to get the sound you want. Thanks to its large cabinet size and quality audio engineering inside, it's hard to be disappointed in the Acton III. The bass is also super responsive, making it a top-tier choice for parties." data-dimension25="$179" href="https://www.amazon.com/Marshall-Acton-Bluetooth-Speaker-Black/dp/B0BC27MM5Z/" 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:120.00%;"><img id="T2qSjTer2AgBjuQkKpsHm" name="Marshall Acton III" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/T2qSjTer2AgBjuQkKpsHm.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Marshall Acton III is a retro-looking Bluetooth speaker that can actually make your setup feel more modern. The physical controls are tactile and satisfying, making sure it's easy for you to get the sound you want. Thanks to its large cabinet size and quality audio engineering inside, it's hard to be disappointed in the Acton III. The bass is also super responsive, making it a top-tier choice for parties.<a class="view-deal button" href="https://www.amazon.com/Marshall-Acton-Bluetooth-Speaker-Black/dp/B0BC27MM5Z/" target="_blank" rel="nofollow" data-dimension112="a5fbf596-9366-4937-a1e8-b62788fe2dd9" data-action="Deal Block" data-label="The Marshall Acton III is a retro-looking Bluetooth speaker that can actually make your setup feel more modern. The physical controls are tactile and satisfying, making sure it's easy for you to get the sound you want. Thanks to its large cabinet size and quality audio engineering inside, it's hard to be disappointed in the Acton III. The bass is also super responsive, making it a top-tier choice for parties." data-dimension48="The Marshall Acton III is a retro-looking Bluetooth speaker that can actually make your setup feel more modern. The physical controls are tactile and satisfying, making sure it's easy for you to get the sound you want. Thanks to its large cabinet size and quality audio engineering inside, it's hard to be disappointed in the Acton III. The bass is also super responsive, making it a top-tier choice for parties." data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="accafa83-ab63-4dfe-9a8f-8b932991e988" data-action="Deal Block" data-label="The Stanmore III completes Marshall's Homeline III lineup, and it's perfect for small spaces as it measures just 13.78 x 8 x 7.4 inches. It packs Class D amplification rated at 50W for the single mid/woofer, while two 15W amps take care of the tweeters. It sounds incredible, and you should get it just for the rock 'n' roll design, in my opinion." data-dimension48="The Stanmore III completes Marshall's Homeline III lineup, and it's perfect for small spaces as it measures just 13.78 x 8 x 7.4 inches. It packs Class D amplification rated at 50W for the single mid/woofer, while two 15W amps take care of the tweeters. It sounds incredible, and you should get it just for the rock 'n' roll design, in my opinion." data-dimension25="$249" href="https://www.amazon.com/Marshall-Stanmore-Bluetooth-Wireless-Speaker/dp/B09HTFCR59/" 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="wYnAg4Aq77FqRs4Sxa3xn7" name="marshall stanmore iii" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wYnAg4Aq77FqRs4Sxa3xn7.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Stanmore III completes Marshall's Homeline III lineup, and it's perfect for small spaces as it measures just 13.78 x 8 x 7.4 inches. It packs Class D amplification rated at 50W for the single mid/woofer, while two 15W amps take care of the tweeters. It sounds incredible, and you should get it just for the rock 'n' roll design, in my opinion.<a class="view-deal button" href="https://www.amazon.com/Marshall-Stanmore-Bluetooth-Wireless-Speaker/dp/B09HTFCR59/" target="_blank" rel="nofollow" data-dimension112="accafa83-ab63-4dfe-9a8f-8b932991e988" data-action="Deal Block" data-label="The Stanmore III completes Marshall's Homeline III lineup, and it's perfect for small spaces as it measures just 13.78 x 8 x 7.4 inches. It packs Class D amplification rated at 50W for the single mid/woofer, while two 15W amps take care of the tweeters. It sounds incredible, and you should get it just for the rock 'n' roll design, in my opinion." data-dimension48="The Stanmore III completes Marshall's Homeline III lineup, and it's perfect for small spaces as it measures just 13.78 x 8 x 7.4 inches. It packs Class D amplification rated at 50W for the single mid/woofer, while two 15W amps take care of the tweeters. It sounds incredible, and you should get it just for the rock 'n' roll design, in my opinion." data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="1ecb1636-8192-430e-ac69-55c413def5da" data-action="Deal Block" data-label="Marshall Bromley 750" data-dimension48="Marshall Bromley 750" data-dimension25="$999" href="https://www.amazon.com/Marshall-Bromley-Portable-Wireless-Speaker/dp/B0FTZXFVJ1/" 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="hC3fb877MKHEkgSJ57m2nm" name="Bromley-750-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hC3fb877MKHEkgSJ57m2nm.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Thanks to a plethora of wired and wireless connectivity options, the <a href="https://www.tomsguide.com/audio/bluetooth-speakers/marshall-bromley-750-review" data-dimension112="1ecb1636-8192-430e-ac69-55c413def5da" data-action="Deal Block" data-label="Marshall Bromley 750" data-dimension48="Marshall Bromley 750" data-dimension25="$999">Marshall Bromley 750</a> party speaker doubles (or triples) as a guitar amp and a karaoke machine, while delivering powerful sound quality when you’re listening to music. A massive 500W power output makes the bass sound loud and refined, while vocals are crystal clear.<a class="view-deal button" href="https://www.amazon.com/Marshall-Bromley-Portable-Wireless-Speaker/dp/B0FTZXFVJ1/" target="_blank" rel="nofollow" data-dimension112="1ecb1636-8192-430e-ac69-55c413def5da" data-action="Deal Block" data-label="Marshall Bromley 750" data-dimension48="Marshall Bromley 750" data-dimension25="$999">View Deal</a></p></div><h2 class="article-body__section" id="section-best-prime-day-tribit-deals"><span>Best Prime Day Tribit deals</span></h2><div class="product"><a data-dimension112="c4f5f2fb-76f4-4803-8eb6-ee6b7125a3e3" data-action="Deal Block" data-label="Tribit StormBox Lava" data-dimension48="Tribit StormBox Lava" data-dimension25="$94" href="https://www.amazon.com/Tribit-StormBox-Portable-Bluetooth-Waterproof/dp/B0DN5F9BC2/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:83.80%;"><img id="GNykPgtqnDpV9wfnHuMJ9L" name="Tribit StormBox Lava Bluetooth Speaker in black" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GNykPgtqnDpV9wfnHuMJ9L.jpg" mos="" align="middle" fullscreen="" width="679" height="569" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/bluetooth-speakers/tribit-stormbox-lava-review" data-dimension112="c4f5f2fb-76f4-4803-8eb6-ee6b7125a3e3" data-action="Deal Block" data-label="Tribit StormBox Lava" data-dimension48="Tribit StormBox Lava" data-dimension25="$94">Tribit StormBox Lava</a> packs a punch but won’t break the bank. The sleek design means it’s easily portable, while water- and dustproofing equip it for any situation. The bass will shake the ground around you, but it still manages to produce a well-rounded sound with crisp treble.<a class="view-deal button" href="https://www.amazon.com/Tribit-StormBox-Portable-Bluetooth-Waterproof/dp/B0DN5F9BC2/" target="_blank" rel="nofollow" data-dimension112="c4f5f2fb-76f4-4803-8eb6-ee6b7125a3e3" data-action="Deal Block" data-label="Tribit StormBox Lava" data-dimension48="Tribit StormBox Lava" data-dimension25="$94">View Deal</a></p></div><div class="product"><a data-dimension112="68b15a7e-50f3-407f-939a-610865db8544" data-action="Deal Block" data-label="Tribit StormBox Micro 3" data-dimension48="Tribit StormBox Micro 3" data-dimension25="$47" href="https://www.amazon.com/Tribit-StormBox-Portable-Bluetooth-Waterproof/dp/B0GF6PPS4S/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1110px;"><p class="vanilla-image-block" style="padding-top:118.65%;"><img id="dsAxZA3JpSDwfF643VP3eB" name="Micro 3 deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dsAxZA3JpSDwfF643VP3eB.jpg" mos="" align="middle" fullscreen="" width="1110" height="1317" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/bluetooth-speakers/tribit-stormbox-micro-3-review" data-dimension112="68b15a7e-50f3-407f-939a-610865db8544" data-action="Deal Block" data-label="Tribit StormBox Micro 3" data-dimension48="Tribit StormBox Micro 3" data-dimension25="$47">Tribit StormBox Micro 3 </a>offers an IP68 rating, a companion app for EQ customization (although some settings cause compression), and simple controls that make the speaker a breeze to use. It has 24 hours of battery life and can even be used as a portable charger. But most importantly, the audio performance really is excellent.<a class="view-deal button" href="https://www.amazon.com/Tribit-StormBox-Portable-Bluetooth-Waterproof/dp/B0GF6PPS4S/" target="_blank" rel="nofollow" data-dimension112="68b15a7e-50f3-407f-939a-610865db8544" data-action="Deal Block" data-label="Tribit StormBox Micro 3" data-dimension48="Tribit StormBox Micro 3" data-dimension25="$47">View Deal</a></p></div><div class="product"><a data-dimension112="d1e57288-124a-4492-a264-515519343437" data-action="Deal Block" data-label="Tribit StormBox Mini+" data-dimension48="Tribit StormBox Mini+" data-dimension25="$27" href="https://www.amazon.com/Tribit-StormBox-Bluetooth-360%C2%B0Surround-Waterproof/dp/B0DSPCW5M5/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1480px;"><p class="vanilla-image-block" style="padding-top:101.35%;"><img id="iRvkqAH3YBcTTf4zRa7AdC" name="Tribit-StormBox-Mini-Plus-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/iRvkqAH3YBcTTf4zRa7AdC.jpg" mos="" align="middle" fullscreen="" width="1480" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/bluetooth-speakers/tribit-stormbox-mini-plus-review" data-dimension112="d1e57288-124a-4492-a264-515519343437" data-action="Deal Block" data-label="Tribit StormBox Mini+" data-dimension48="Tribit StormBox Mini+" data-dimension25="$27">Tribit StormBox Mini+</a> boasts powerful bass response and detailed vocals. It also sports reactive LED lighting that’s fun to watch, and IPX7 waterproofing so it can be used poolside or in the shower. For the money, I recommend buying two so you can take advantage of the dreamy stereo sound.<a class="view-deal button" href="https://www.amazon.com/Tribit-StormBox-Bluetooth-360%C2%B0Surround-Waterproof/dp/B0DSPCW5M5/" target="_blank" rel="nofollow" data-dimension112="d1e57288-124a-4492-a264-515519343437" data-action="Deal Block" data-label="Tribit StormBox Mini+" data-dimension48="Tribit StormBox Mini+" data-dimension25="$27">View Deal</a></p></div><h2 class="article-body__section" id="section-best-prime-day-miscellaneous-deals"><span>Best Prime Day miscellaneous deals</span></h2><div class="product"><a data-dimension112="130232fe-27d8-4ce2-98e7-3ce3c65377d1" data-action="Deal Block" data-label="EarFun UBoom L" data-dimension48="EarFun UBoom L" data-dimension25="$52" href="https://www.amazon.com/Bluetooth-EarFun-Portable-Waterproof-Dustproof/dp/B0B1PJ5SQ7/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1115px;"><p class="vanilla-image-block" style="padding-top:49.42%;"><img id="U4eB79RfdkjMCrjY6xNuFm" name="EarFun-UBoomL-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/U4eB79RfdkjMCrjY6xNuFm.png" mos="" align="middle" fullscreen="" width="1115" height="551" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/speakers/bluetooth-speakers/earfun-uboom-l-review" data-dimension112="130232fe-27d8-4ce2-98e7-3ce3c65377d1" data-action="Deal Block" data-label="EarFun UBoom L" data-dimension48="EarFun UBoom L" data-dimension25="$52">EarFun UBoom L</a> offers big sound on a budget. This portable speaker produces powerful bass, clear vocals and well-balanced sound across a range of genres. With a dedicated outdoor mode and an IP67 resistance rating, the speaker can soundtrack pool parties and hikes. It has great battery life, and the customizable EQ via the user-friendly companion app works really well.<a class="view-deal button" href="https://www.amazon.com/Bluetooth-EarFun-Portable-Waterproof-Dustproof/dp/B0B1PJ5SQ7/" target="_blank" rel="nofollow" data-dimension112="130232fe-27d8-4ce2-98e7-3ce3c65377d1" data-action="Deal Block" data-label="EarFun UBoom L" data-dimension48="EarFun UBoom L" data-dimension25="$52">View Deal</a></p></div><div class="product"><a data-dimension112="549ce9e6-839f-4f0e-bda8-e1af2c057c61" data-action="Deal Block" data-label="8BitDo Retro Cube 2" data-dimension48="8BitDo Retro Cube 2" data-dimension25="$49" href="https://www.amazon.com/Portable-Bluetooth-Wireless-Charging-Connections/dp/B0G48LRFP4/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:892px;"><p class="vanilla-image-block" style="padding-top:116.82%;"><img id="r5zUUMfK2PzaubVDbQfHCF" name="8BitDo-RetroCube2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/r5zUUMfK2PzaubVDbQfHCF.jpg" mos="" align="middle" fullscreen="" width="892" height="1042" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/bluetooth-speakers/8bitdo-retro-cube-2-review" data-dimension112="549ce9e6-839f-4f0e-bda8-e1af2c057c61" data-action="Deal Block" data-label="8BitDo Retro Cube 2" data-dimension48="8BitDo Retro Cube 2" data-dimension25="$49">8BitDo Retro Cube 2</a> is the quirkiest speaker around, and that’s down to its NES-inspired design and D-pad-style controls. The speaker comes with a wireless charging dock with a slot to store the 2.4GHz dongle safely, and it boasts class-leading battery life of 30 hours. Crisp treble and a refined midrange make the speaker shine.<a class="view-deal button" href="https://www.amazon.com/Portable-Bluetooth-Wireless-Charging-Connections/dp/B0G48LRFP4/" target="_blank" rel="nofollow" data-dimension112="549ce9e6-839f-4f0e-bda8-e1af2c057c61" data-action="Deal Block" data-label="8BitDo Retro Cube 2" data-dimension48="8BitDo Retro Cube 2" data-dimension25="$49">View Deal</a></p></div><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-speaker-deals"><span>We're tracking all the best Prime Day speaker deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Speakers&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const 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.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));               }            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I review audio gear for a living — best Bose Prime Day deals up to 50% off on headphones, soundbars and Bluetooth speakers ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/i-review-audio-gear-for-a-living-best-bose-prime-day-deals-up-to-50-percent-off-on-headphones-soundbars-and-bluetooth-speakers</link>
                                                                            <description>
                            <![CDATA[ Prime Day 2026 has landed and brought Bose's awesome savings with it. You can save 50% on the Bose QuietComfort Headphones right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ov7mSNEna5QYqDy4ckf8Pd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Q4vB9vhHoamycJZhLdxZsf-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 23 Jun 2026 14:22:55 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Audio]]></category>
                                                                                                <author><![CDATA[ erin.bashford@futurenet.com (Erin Bashford) ]]></author>                    <dc:creator><![CDATA[ Erin Bashford ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/rLvJvJVZx43hEzSsJy3BpL.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Erin Bashford is a senior reviews writer at Tom’s Guide. She has a Master’s in Broadcast and Digital Journalism from the University of East Anglia and 7 years of experience reviewing music and events for various publications. She has edited publications such as Outline Magazine’s Guide to Norwich, and she has written for a number of music magazines and websites such as Clash Magazine, Outline Magazine and Dork Magazine. She has a strong interest in audio gear and the music world. &lt;/p&gt;&lt;p&gt;As an ex-barista, Erin is passionate about coffee tech. She also loves finding the best cooking hacks and kitchen appliances, including her beloved Instant Pot. &lt;/p&gt;&lt;p&gt;In her spare time, you can find her reading, practising yoga, hiking, writing fantasy novels, or stressing over NYT Games.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Q4vB9vhHoamycJZhLdxZsf-1280-80.jpg">
                                                            <media:credit><![CDATA[Bose / Edited with Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a composite image of bose gear including bose quietcomfort ultra and bose soundlink flex 2 on a blue background with a tom&#039;s guide prime day badge]]></media:description>                                                            <media:text><![CDATA[a composite image of bose gear including bose quietcomfort ultra and bose soundlink flex 2 on a blue background with a tom&#039;s guide prime day badge]]></media:text>
                                <media:title type="plain"><![CDATA[a composite image of bose gear including bose quietcomfort ultra and bose soundlink flex 2 on a blue background with a tom&#039;s guide prime day badge]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Q4vB9vhHoamycJZhLdxZsf-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Prime Day 2026 is officially here and this year there are <em>tons</em> of discounts on Bose gear. You can save <a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" target="_blank" rel="nofollow">50% on the Bose QuietComfort Headphones right now</a>, 30% on the Bose SoundLink Max, and $150 off the Bose Smart Soundbar. </p><p>I've tested well over 100 audio products by this point, including all the best soundbars, best headphones, best earbuds, best speakers, and everything in between. When people ask me for recommendations, one of the first brands I go to is Bose. Did you know Dr. Bose literally invented ANC? You'd expect the Bose QuietComfort line to have the best ANC in the world — and you'd be right. If you want to shut out the rest of the world, I wholeheartedly recommend checking out any Bose headphones or earbuds.</p><p>We're tracking all the best deals so you don't have to, so be sure to check our <a href="https://www.tomsguide.com/live/news/prime-day-2026-handpicked-editor-recommended-deals-live">Prime Day liveblog</a>, <a href="https://www.tomsguide.com/tvs/live/best-prime-day-tv-deals-2026-live-sales-on-affordable-oleds-qleds-and-more">TV deals liveblog</a> and the <a href="https://www.tomsguide.com/sales-events/best-apple-prime-day-deals-save-up-to-usd150-on-airpods-max-2-apple-watches-and-ipads-right-now">best Apple deals</a>. </p><h2 class="article-body__section" id="section-best-bose-prime-day-deals-quick-links"><span>Best Bose Prime Day deals: Quick links</span></h2><ul><li><strong>Bose SoundLink Flex 2nd Gen: </strong><a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16" target="_blank" rel="nofollow"><strong>was $129 now $99 @ Amazon</strong></a></li><li><strong>Bose QuietComfort Earbuds: </strong><a href="https://www.amazon.com/Bose-New-QuietComfort-Earbuds-Black/dp/B0FC6KNK6X" target="_blank" rel="nofollow"><strong>was $179 now $129 @ Amazon</strong></a></li><li><strong>Bose TV Speaker: </strong><a href="https://www.amazon.com/Bose-Speaker-Soundbar-Bluetooth-connectivity/dp/B088KRPCQJ" target="_blank" rel="nofollow"><strong>was $279 now $199 @ Amazon</strong></a></li><li><strong>Bose QuietComfort Headphones:</strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" target="_blank" rel="nofollow"><strong> was $359 now $179 @ Amazon</strong></a></li><li><strong>Bose SoundLink Plus: </strong><a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0F7HVC62G" target="_blank" rel="nofollow"><strong>was $269 now $179 @ Amazon</strong></a></li><li><strong>Bose QuietComfort Earbuds 2nd Gen: </strong><a href="https://www.amazon.com/Bose-New-QuietComfort-Ultra-Earbuds/dp/B0F7M3HPBD" target="_blank" rel="nofollow"><strong>was $299 now $249 @ Amazon</strong></a></li><li><strong>Bose SoundLink Max: </strong><a href="https://www.amazon.com/Bose-SoundLink-Portable-Waterproof-Bluetooth/dp/B0CVL1K7DX" target="_blank" rel="nofollow"><strong>was $399 now $279 @ Amazon</strong></a></li><li><strong>Bose QuietComfort Ultra Headphones 2nd Gen: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G" target="_blank" rel="nofollow"><strong>was $449 now $379 @ Amazon</strong></a></li><li><strong>Bose Smart Soundbar: </strong><a href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" target="_blank" rel="nofollow"><strong>was $549 now $399 @ Amazon</strong></a></li></ul><h2 class="article-body__section" id="section-best-bose-prime-day-deals"><span>Best Bose Prime Day deals</span></h2><div class="product"><a data-dimension112="d7c47267-ee53-41db-a182-8e39a543c8d3" data-action="Deal Block" data-label="Bose SoundLink Flex 2" data-dimension48="Bose SoundLink Flex 2" data-dimension25="$99" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:932px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="CaY2r9G6VHX74UcMmqyGy" name="bose soundlink flex gen 2 deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CaY2r9G6VHX74UcMmqyGy.jpg" mos="" align="middle" fullscreen="" width="932" height="932" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/bose-soundlink-flex-2-review" data-dimension112="d7c47267-ee53-41db-a182-8e39a543c8d3" data-action="Deal Block" data-label="Bose SoundLink Flex 2" data-dimension48="Bose SoundLink Flex 2" data-dimension25="$99">Bose SoundLink Flex 2</a> is a much-needed improvement on the expensive SoundLink Flex 1. The 2 brings excellent sound, an IP67 rating, and a completely customizable EQ. It sounds powerful, confident, and is small enough to fit into any backpack. Save $40 right now for Prime Day.<a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16" target="_blank" rel="nofollow" data-dimension112="d7c47267-ee53-41db-a182-8e39a543c8d3" data-action="Deal Block" data-label="Bose SoundLink Flex 2" data-dimension48="Bose SoundLink Flex 2" data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="47326a8d-4a2f-49d3-8ccc-372be9e89f6c" data-action="Deal Block" data-label="Bose QuietComfort" data-dimension48="Bose QuietComfort" data-dimension25="$179.99" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" 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="YmXJvbwXhi7xr7vPRU4WYg" name="Bose QuietComfort Headphones on white.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YmXJvbwXhi7xr7vPRU4WYg.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>When my dad asked me to recommend a pair of great headphones, I didn't hesitate. I told him to get the <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-headphones" data-dimension112="47326a8d-4a2f-49d3-8ccc-372be9e89f6c" data-action="Deal Block" data-label="Bose QuietComfort" data-dimension48="Bose QuietComfort" data-dimension25="$179.99">Bose QuietComfort</a> — and he did! Right now you can get them for a huge 50% off, which makes them even better value. The QC Headphones bring bassy sound, supreme ANC, and silky ear cups to the party. <a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" target="_blank" rel="nofollow" data-dimension112="47326a8d-4a2f-49d3-8ccc-372be9e89f6c" data-action="Deal Block" data-label="Bose QuietComfort" data-dimension48="Bose QuietComfort" data-dimension25="$179.99">View Deal</a></p></div><div class="product"><a data-dimension112="bd9ee134-a29c-476a-8d47-a63fbe1826cb" data-action="Deal Block" data-label="Bose QuietComfort Earbuds" data-dimension48="Bose QuietComfort Earbuds" data-dimension25="$129" href="https://www.amazon.com/Bose-New-QuietComfort-Earbuds-Black/dp/B0FC6KNK6X" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:95.43%;"><img id="tEtgPEcP9tofgugi8QdrcP" name="Bose quietcomfort" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tEtgPEcP9tofgugi8QdrcP.jpg" mos="" align="middle" fullscreen="" width="679" height="648" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>We reviewed the <a href="https://www.tomsguide.com/audio/earbuds/bose-quietcomfort-earbuds-2024-review" data-dimension112="bd9ee134-a29c-476a-8d47-a63fbe1826cb" data-action="Deal Block" data-label="Bose QuietComfort Earbuds" data-dimension48="Bose QuietComfort Earbuds" data-dimension25="$129">Bose QuietComfort Earbuds</a> a few years ago and <em>loved</em> them. The ANC is spectacular, as is the bass-forward sound. They even come in a variety of colors so you can be sure to find one that suits your vibe. These are perfect everyday earbuds — and now they're as cheap as the AirPods 4's MSRP (which don't have ANC!). <a class="view-deal button" href="https://www.amazon.com/Bose-New-QuietComfort-Earbuds-Black/dp/B0FC6KNK6X" target="_blank" rel="nofollow" data-dimension112="bd9ee134-a29c-476a-8d47-a63fbe1826cb" data-action="Deal Block" data-label="Bose QuietComfort Earbuds" data-dimension48="Bose QuietComfort Earbuds" data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="4b9ae1fc-5a94-447c-89e4-21e1175e94ea" data-action="Deal Block" data-label="Tired of tinny TV sound but don't have a lot to spend? Look no further than the Bose TV speaker. This 2.0-channel soundbar has surprising detail and width and can instantly upgrade any TV sound. I just wouldn't recommend it for large TVs as it's a compact little soundbar." data-dimension48="Tired of tinny TV sound but don't have a lot to spend? Look no further than the Bose TV speaker. This 2.0-channel soundbar has surprising detail and width and can instantly upgrade any TV sound. I just wouldn't recommend it for large TVs as it's a compact little soundbar." data-dimension25="$199" href="https://www.amazon.com/Bose-Speaker-Soundbar-Bluetooth-connectivity/dp/B088KRPCQJ" 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="bPZFYfdgv6wtpxFQHPHgMF" name="bose-tv-speaker.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bPZFYfdgv6wtpxFQHPHgMF.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Tired of tinny TV sound but don't have a lot to spend? Look no further than the Bose TV speaker. This 2.0-channel soundbar has surprising detail and width and can instantly upgrade any TV sound. I just wouldn't recommend it for large TVs as it's a compact little soundbar. <a class="view-deal button" href="https://www.amazon.com/Bose-Speaker-Soundbar-Bluetooth-connectivity/dp/B088KRPCQJ" target="_blank" rel="nofollow" data-dimension112="4b9ae1fc-5a94-447c-89e4-21e1175e94ea" data-action="Deal Block" data-label="Tired of tinny TV sound but don't have a lot to spend? Look no further than the Bose TV speaker. This 2.0-channel soundbar has surprising detail and width and can instantly upgrade any TV sound. I just wouldn't recommend it for large TVs as it's a compact little soundbar." data-dimension48="Tired of tinny TV sound but don't have a lot to spend? Look no further than the Bose TV speaker. This 2.0-channel soundbar has surprising detail and width and can instantly upgrade any TV sound. I just wouldn't recommend it for large TVs as it's a compact little soundbar." data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="9af68680-d410-4ba5-b0ed-d0a79cfb659a" data-action="Deal Block" data-label="The SoundLink Plus is the perfect bridge between the tiny SoundLink Flex 2 and the huge SoundLink Max. Think of it as the "just right" of Bluetooth speakers. It has a great IP67 rating, meaning it can be used at pool and beach parties without dying, and has a 20-hour battery life." data-dimension48="The SoundLink Plus is the perfect bridge between the tiny SoundLink Flex 2 and the huge SoundLink Max. Think of it as the "just right" of Bluetooth speakers. It has a great IP67 rating, meaning it can be used at pool and beach parties without dying, and has a 20-hour battery life." data-dimension25="$179" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0F7HVC62G" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="umiB8PUGt7JvPecjBZKKRh" name="bose-soundlink-plus-portable-bluetooth-s-4aa9db51-6400-4e0d-aa13-850b33479b5d.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/umiB8PUGt7JvPecjBZKKRh.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The SoundLink Plus is the perfect bridge between the tiny SoundLink Flex 2 and the huge SoundLink Max. Think of it as the "just right" of Bluetooth speakers. It has a great IP67 rating, meaning it can be used at pool and beach parties without dying, and has a 20-hour battery life. <a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0F7HVC62G" target="_blank" rel="nofollow" data-dimension112="9af68680-d410-4ba5-b0ed-d0a79cfb659a" data-action="Deal Block" data-label="The SoundLink Plus is the perfect bridge between the tiny SoundLink Flex 2 and the huge SoundLink Max. Think of it as the "just right" of Bluetooth speakers. It has a great IP67 rating, meaning it can be used at pool and beach parties without dying, and has a 20-hour battery life." data-dimension48="The SoundLink Plus is the perfect bridge between the tiny SoundLink Flex 2 and the huge SoundLink Max. Think of it as the "just right" of Bluetooth speakers. It has a great IP67 rating, meaning it can be used at pool and beach parties without dying, and has a 20-hour battery life." data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="db946d7f-e303-4403-a713-8f8a92c0a3f8" data-action="Deal Block" data-label="QuietComfort Ultra Earbuds Gen 2" data-dimension48="QuietComfort Ultra Earbuds Gen 2" data-dimension25="$249" href="https://www.amazon.com/Bose-New-QuietComfort-Ultra-Earbuds/dp/B0F7M3HPBD" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:934px;"><p class="vanilla-image-block" style="padding-top:124.20%;"><img id="a9jV9Xm3AhpGwNWnqABVVP" name="Bose QuietComfort Ultra Earbuds gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/a9jV9Xm3AhpGwNWnqABVVP.png" mos="" align="middle" fullscreen="" width="934" height="1160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is where Bose starts to get really premium. The <a href="https://www.tomsguide.com/audio/earbuds/bose-quietcomfort-ultra-earbuds-2-review" data-dimension112="db946d7f-e303-4403-a713-8f8a92c0a3f8" data-action="Deal Block" data-label="QuietComfort Ultra Earbuds Gen 2" data-dimension48="QuietComfort Ultra Earbuds Gen 2" data-dimension25="$249">QuietComfort Ultra Earbuds Gen 2</a> are the best ANC earbuds you can get — and we've tested most of 'em. These earbuds sound excellent and will block out everyone around you. <a class="view-deal button" href="https://www.amazon.com/Bose-New-QuietComfort-Ultra-Earbuds/dp/B0F7M3HPBD" target="_blank" rel="nofollow" data-dimension112="db946d7f-e303-4403-a713-8f8a92c0a3f8" data-action="Deal Block" data-label="QuietComfort Ultra Earbuds Gen 2" data-dimension48="QuietComfort Ultra Earbuds Gen 2" data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="9a04256a-a34c-42a5-966d-74c42f9adf0d" data-action="Deal Block" data-label="Bose SoundLink Max" data-dimension48="Bose SoundLink Max" data-dimension25="$279" href="https://www.amazon.com/Bose-SoundLink-Portable-Waterproof-Bluetooth/dp/B0CVL1K7DX" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:958px;"><p class="vanilla-image-block" style="padding-top:83.72%;"><img id="xFfX4WEKpF3opzDYZMKnhB" name="Bose SoundLink Max.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xFfX4WEKpF3opzDYZMKnhB.jpg" mos="" align="middle" fullscreen="" width="958" height="802" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/bluetooth-speakers/bose-soundlink-max" data-dimension112="9a04256a-a34c-42a5-966d-74c42f9adf0d" data-action="Deal Block" data-label="Bose SoundLink Max" data-dimension48="Bose SoundLink Max" data-dimension25="$279">Bose SoundLink Max</a> is the most powerful of its portable speakers. This speaker is designed for soundtracking outdoor parties, house parties, and everything in between. You can save a huge $120 at the moment. You get 20 hours of playback and Bose's classic bassy sound. <a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Portable-Waterproof-Bluetooth/dp/B0CVL1K7DX" target="_blank" rel="nofollow" data-dimension112="9a04256a-a34c-42a5-966d-74c42f9adf0d" data-action="Deal Block" data-label="Bose SoundLink Max" data-dimension48="Bose SoundLink Max" data-dimension25="$279">View Deal</a></p></div><div class="product"><a data-dimension112="c2d48311-ff53-4001-a904-716107f96c56" data-action="Deal Block" data-label="Bose QuietComfort Ultra Headphones" data-dimension48="Bose QuietComfort Ultra Headphones" data-dimension25="$379" href="https://www.amazon.com/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G" 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="kB88HDDjXRQ3niWNqEpCt9" name="Bose QuietComfort Ultra Headphones Blue prod image" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kB88HDDjXRQ3niWNqEpCt9.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review" data-dimension112="c2d48311-ff53-4001-a904-716107f96c56" data-action="Deal Block" data-label="Bose QuietComfort Ultra Headphones" data-dimension48="Bose QuietComfort Ultra Headphones" data-dimension25="$379">Bose QuietComfort Ultra Headphones</a> are a little overpriced at their $449 MSRP, so I'd recommend only grabbing them while they're on sale. Thankfully, they're just $379 right now, which makes them great value. You get best-in-class ANC and supreme comfort — I'd recommend these headphones to anyone who spends a lot of time traveling. <a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G" target="_blank" rel="nofollow" data-dimension112="c2d48311-ff53-4001-a904-716107f96c56" data-action="Deal Block" data-label="Bose QuietComfort Ultra Headphones" data-dimension48="Bose QuietComfort Ultra Headphones" data-dimension25="$379">View Deal</a></p></div><div class="product"><a data-dimension112="c8724ffe-b943-4663-9472-ad3162b137e4" data-action="Deal Block" data-label="Bose Smart Soundbar" data-dimension48="Bose Smart Soundbar" data-dimension25="$399" href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" 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:120.00%;"><img id="rJbLARrb3giTtDi2jTiuGE" name="Bose Smart Soundbar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rJbLARrb3giTtDi2jTiuGE.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>I have the <a href="https://www.tomsguide.com/audio/soundbars/bose-smart-soundbar-review" data-dimension112="c8724ffe-b943-4663-9472-ad3162b137e4" data-action="Deal Block" data-label="Bose Smart Soundbar" data-dimension48="Bose Smart Soundbar" data-dimension25="$399">Bose Smart Soundbar</a> as my personal soundbar at home. I love the Spotify streaming capability, and the AI Dialogue mode means I never miss speech. As it's quite compact, it fits under most TVs, and looks sublime while doing so. The Dolby Atmos performance is nothing to scoff at, either. <a class="view-deal button" href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" target="_blank" rel="nofollow" data-dimension112="c8724ffe-b943-4663-9472-ad3162b137e4" data-action="Deal Block" data-label="Bose Smart Soundbar" data-dimension48="Bose Smart Soundbar" data-dimension25="$399">View Deal</a></p></div><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-audio-deals"><span>We're tracking all the best Prime Day audio deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=audio&view_mode=savings_squad&widget_title=Best+Prime+Day+Audio+Deals&widget_subtitle=Here%27s+the+top+sales+currently+available%2C+curated+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      width: 100%;      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 120px;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 16px 16px 8px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }                  .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 14px;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    .tg-df-grid-wrapper { position: relative; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.40);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #1f69ff; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #0056e0; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \x3C/div>                  \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E      \x3Cdiv class="tg-df-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-filters">          \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>          \x3C/div>        \x3C/div>        \x3C/div>      \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = mode === 'savings_squad' ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = params.get('view_mode');          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              this.searchInput.value = this.currentQuery;            }          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'date_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          if (matches.length > 0) {                 this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                 this.autocompleteDropdown.classList.add('active');             } else {                 this.autocompleteDropdown.classList.remove('active');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    this.deals = [];                    this.render();                  }                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = tag;                   }                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = 'date_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }        async fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (!this.activeDealTag && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.forEach((article) => {             if (!article.articlepage) return;             let pageData = [];             try { pageData = JSON.parse(article.articlepage[0]); } catch(e){ console.warn(e); }             const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');             savingsSquad.forEach((block) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : 'date_desc';          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)}${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_div}                         ${_div}                      ${_div}                    ` : ''}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>View Deal${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit) {            dealsHtml += `              \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer;">Load More${_button}              ${_div}            `;          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));               }          }, 50);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += 12;              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung, Sony, Bose, and Sonos have already launched Prime Day sales: Our highest-rated soundbars are up to $228 off right now ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/soundbars/samsung-sony-bose-and-sonos-have-already-launched-prime-day-sales-our-highest-rated-soundbars-are-up-to-usd228-off-right-now</link>
                                                                            <description>
                            <![CDATA[ I wouldn't wait until Prime Day for these soundbar deals. I've found Bose, Sony, Samsung, Klipsch and Sonos savings on some of their best soundbars. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">MYPyVEfXx2CE5ggb63gWsg</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/wmsvJwYR482seAibhPpppk-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 22 Jun 2026 09:15:12 +0000</pubDate>                                                                                                                                <updated>Mon, 22 Jun 2026 09:49:41 +0000</updated>
                                                                                                                                            <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.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>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/wmsvJwYR482seAibhPpppk-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[the samsung q600f prime day hero image with the tom&#039;s guide savings squad badge]]></media:description>                                                            <media:text><![CDATA[the samsung q600f prime day hero image with the tom&#039;s guide savings squad badge]]></media:text>
                                <media:title type="plain"><![CDATA[the samsung q600f prime day hero image with the tom&#039;s guide savings squad badge]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/wmsvJwYR482seAibhPpppk-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I've sifted through the dregs of Amazon so you don't have to — <em>and</em> I've found savings for five of my highest-rated soundbars. As one of Tom's Guide's resident soundbar reviewers, I've tested enough of these home cinema bad boys to know exactly which ones are worth your time (and money). </p><p>It's not even Prime Day yet, and Samsung, Sony, <em>and</em> Bose have all slashed prices on some of their <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbars</a>, including the super-budget <a href="https://www.tomsguide.com/audio/soundbars/sony-ht-s100f-review">Sony HT-S100F</a>, <a href="https://www.tomsguide.com/audio/soundbars/bose-smart-soundbar-review">Bose Smart Soundbar</a> (usually $550!), and my personal favorite mid-range soundbar, <a href="https://www.tomsguide.com/audio/soundbars/samsung-q600f-review">Samsung Q600F</a>. I genuinely didn't believe this price when I saw it — <em>$371. </em>For a — really good — soundbar and subwoofer? Its launch price was $599! Is this real life? </p><p>I wouldn't wait for Prime Day with deals like this, but if you want to stick around for the Tom's Guide Savings Squad to save the day, we've selected the <a href="https://www.tomsguide.com/sales-events/prime-day-sneak-peek-ive-picked-41-amazon-deals-too-good-to-wait-for">best Prime Day deals</a> on everything from TVs to headphones to coffee makers to smart watches. </p><h2 class="article-body__section" id="section-best-early-prime-day-soundbar-deals-quick-links"><span>Best early Prime Day soundbar deals: Quick links</span></h2><ul><li><strong>Sony HT-S100F: </strong><a href="https://www.amazon.com/Sony-Speaker-Integrated-Bluetooth-HTS100F/dp/B0797MY6JB" target="_blank" rel="nofollow"><strong>was $118 now $98 @ Amazon </strong></a></li><li><strong>Klipsch Flexus Core 100: </strong><a href="https://www.amazon.com/Klipsch-100-Channel-Powered-Bluetooth/dp/B0CV5ZMDYY" target="_blank" rel="nofollow"><strong>was $349 now $249 @ Amazon</strong></a></li><li><strong>Sonos Beam Gen 2: </strong><a href="https://www.amazon.com/Sonos-Beam-Gen-2-Black/dp/B09GPYL7BJ" target="_blank" rel="nofollow"><strong>was $499 now $369 @ Amazon</strong></a></li><li><strong>Samsung Q600F: </strong><a href="https://www.amazon.com/Samsung-Soundbar-HW-Q600F-Wireless-Subwoofer/dp/B0GS4P3YL8" target="_blank" rel="nofollow"><strong>was $599 now $371 @ Amazon</strong></a></li><li><strong>Bose Smart Soundbar: </strong><a href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" target="_blank" rel="nofollow"><strong>was $549 now $399 @ Amazon</strong></a></li></ul><h2 class="article-body__section" id="section-best-early-prime-day-soundbar-deals"><span>Best early Prime Day soundbar deals</span></h2><div class="product"><a data-dimension112="2d3e71b2-e7eb-47cd-af87-012cd3d2c86d" data-action="Deal Block" data-label="Sony HT-S100F" data-dimension48="Sony HT-S100F" data-dimension25="$98" href="https://www.amazon.com/Sony-Speaker-Integrated-Bluetooth-HTS100F/dp/B0797MY6JB" 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="PMZLt3HzCP9i43jUL74LZS" name="Sony-Soundbar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PMZLt3HzCP9i43jUL74LZS.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/soundbars/sony-ht-s100f-review" data-dimension112="2d3e71b2-e7eb-47cd-af87-012cd3d2c86d" data-action="Deal Block" data-label="Sony HT-S100F" data-dimension48="Sony HT-S100F" data-dimension25="$98">Sony HT-S100F</a> (also called simply Sony S100F) is the best budget soundbar you can get nowadays, and there's very little competition. At launch, this soundbar was $99, but now it's usually around $119. Even so, when you can find it back at its pre-tariff price, it's definitely worth the investment. You get super clear dialogue and immersive sound for under $100.<a class="view-deal button" href="https://www.amazon.com/Sony-Speaker-Integrated-Bluetooth-HTS100F/dp/B0797MY6JB" target="_blank" rel="nofollow" data-dimension112="2d3e71b2-e7eb-47cd-af87-012cd3d2c86d" data-action="Deal Block" data-label="Sony HT-S100F" data-dimension48="Sony HT-S100F" data-dimension25="$98">View Deal</a></p></div><div class="product"><a data-dimension112="ce99bb02-06c5-4714-b09c-3d1cc489f81a" data-action="Deal Block" data-label="Klipsch Flexus Core 100" data-dimension48="Klipsch Flexus Core 100" data-dimension25="$249" href="https://www.amazon.com/Klipsch-100-Channel-Powered-Bluetooth/dp/B0CV5ZMDYY" 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="Kst3T7bzZk2GeVeyZe7e5j" name="klipsch flexus core 100 deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Kst3T7bzZk2GeVeyZe7e5j.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/soundbars/klipsch-flexus-core-100-review" data-dimension112="ce99bb02-06c5-4714-b09c-3d1cc489f81a" data-action="Deal Block" data-label="Klipsch Flexus Core 100" data-dimension48="Klipsch Flexus Core 100" data-dimension25="$249">Klipsch Flexus Core 100</a> is one of the best soundbars if you want to build out a whole sound system. You can start with Klipsch's entry-level soundbar (this one) and slowly work your way up with a sub and rears. The Core 100 has powerful bass and clear dialogue, making it ideal for movie nights and also reality TV binging. <a class="view-deal button" href="https://www.amazon.com/Klipsch-100-Channel-Powered-Bluetooth/dp/B0CV5ZMDYY" target="_blank" rel="nofollow" data-dimension112="ce99bb02-06c5-4714-b09c-3d1cc489f81a" data-action="Deal Block" data-label="Klipsch Flexus Core 100" data-dimension48="Klipsch Flexus Core 100" data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="0e7ef59b-205f-4723-b48e-37bb6aa6fa4d" data-action="Deal Block" data-label="Sonos Beam Gen 2" data-dimension48="Sonos Beam Gen 2" data-dimension25="$369" href="https://www.amazon.com/Sonos-Beam-Gen-2-Black/dp/B09GPYL7BJ" 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:120.00%;"><img id="DAZRapi9fiu7HcN3m39JNd" name="Sonos Beam Gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/DAZRapi9fiu7HcN3m39JNd.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>While I haven't personally reviewed the <a href="https://www.tomsguide.com/reviews/sonos-beam-gen-2" data-dimension112="0e7ef59b-205f-4723-b48e-37bb6aa6fa4d" data-action="Deal Block" data-label="Sonos Beam Gen 2" data-dimension48="Sonos Beam Gen 2" data-dimension25="$369">Sonos Beam Gen 2</a>, we gave it a lovely 4-star review when it first released in 2021. Even though this model is 5 years old, it still holds its own and is ideal for smaller TVs. It has fantastic Dolby Atmos and punchy bass, which makes it sound more expensive than it is. <a class="view-deal button" href="https://www.amazon.com/Sonos-Beam-Gen-2-Black/dp/B09GPYL7BJ" target="_blank" rel="nofollow" data-dimension112="0e7ef59b-205f-4723-b48e-37bb6aa6fa4d" data-action="Deal Block" data-label="Sonos Beam Gen 2" data-dimension48="Sonos Beam Gen 2" data-dimension25="$369">View Deal</a></p></div><div class="product"><a data-dimension112="8cf0b3b9-d67e-436a-82ea-122584c6fb1e" data-action="Deal Block" data-label="Samsung Q600F" data-dimension48="Samsung Q600F" data-dimension25="$371" href="https://www.amazon.com/Samsung-Soundbar-HW-Q600F-Wireless-Subwoofer/dp/B0GS4P3YL8" 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:120.00%;"><img id="ExfR2TSGT2maYw6G6JSFS5" name="Samsung Q600F" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ExfR2TSGT2maYw6G6JSFS5.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>I loved the <a href="https://www.tomsguide.com/audio/soundbars/samsung-q600f-review" data-dimension112="8cf0b3b9-d67e-436a-82ea-122584c6fb1e" data-action="Deal Block" data-label="Samsung Q600F" data-dimension48="Samsung Q600F" data-dimension25="$371">Samsung Q600F</a> when I reviewed it last year. This soundbar + subwoofer was <em>already</em> affordable at its launch price of $599, but now it's almost incomprehensibly cheap at $371. I'm not sure why the Amazon page lists its MSRP as $399 — it is most definitely $599. Although this is last year's model now — Samsung refreshes its soundbar lineup every year — I can assure you it sounds fantastic. You get immersive Dolby Atmos and crystal-clear dialogue for just $371... I know I'd be getting this one. <a class="view-deal button" href="https://www.amazon.com/Samsung-Soundbar-HW-Q600F-Wireless-Subwoofer/dp/B0GS4P3YL8" target="_blank" rel="nofollow" data-dimension112="8cf0b3b9-d67e-436a-82ea-122584c6fb1e" data-action="Deal Block" data-label="Samsung Q600F" data-dimension48="Samsung Q600F" data-dimension25="$371">View Deal</a></p></div><div class="product"><a data-dimension112="9d784100-33db-4ba0-8dff-b6ba1832912f" data-action="Deal Block" data-label="Bose Smart Soundbar" data-dimension48="Bose Smart Soundbar" data-dimension25="$399" href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" 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="XT9aaiGZoDf6MtibTHXgr6" name="bose smart soundbar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XT9aaiGZoDf6MtibTHXgr6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>I have the <a href="https://www.tomsguide.com/audio/soundbars/bose-smart-soundbar-review" data-dimension112="9d784100-33db-4ba0-8dff-b6ba1832912f" data-action="Deal Block" data-label="Bose Smart Soundbar" data-dimension48="Bose Smart Soundbar" data-dimension25="$399">Bose Smart Soundbar</a> at home and I love it. This compact soundbar is ideal for small living rooms without skimping on sound quality. Music playback is surprisingly great and AI Dialogue Mode means I never have to rewind due to missed speech. <a class="view-deal button" href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" target="_blank" rel="nofollow" data-dimension112="9d784100-33db-4ba0-8dff-b6ba1832912f" data-action="Deal Block" data-label="Bose Smart Soundbar" data-dimension48="Bose Smart Soundbar" data-dimension25="$399">View Deal</a></p></div><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-soundbar-deals"><span>We're tracking all the best Prime Day soundbar deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Soundbars&min_discount_ratio=0.95&retailer=Amazon&rows=4&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&show_countdown=true&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right {      right: 0;      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>\n        \x3C/div>\n      \x3C/div>\n    \x3C/div>          \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const encodedTag = encodeURIComponent(this.activeDealTag.toLowerCase().replace(/\s+/g, '-'));             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map(v => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              return `                \x3Ca href="${this.escapeHTML(linkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item">                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let existingChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             if (this.getViewMode() === 'carousel') {                 if (!existingChevron) {                     gridWrapper.insertAdjacentHTML('beforeend', '\n                 \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: \'smooth\'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>');                 }             } else {                 if (existingChevron) {                     existingChevron.remove();                 }             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));               }            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ These Bose deals feel like Prime Day came a week early — save up to $130 on headphones and speakers now ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/these-bose-deals-feel-like-prime-day-came-a-week-early-save-up-to-usd130-on-headphones-and-speakers-now</link>
                                                                            <description>
                            <![CDATA[ Amazon's early Prime Day sale is knocking up to 47% off Bose speakers and headphones. Check out my favorite picks from the sale. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">u9v33sRsZk3FWFteUpevSc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/oWEJfRLffGwDUCdAPiKZXQ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 16 Jun 2026 17:05:01 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Olivia Halevy ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/YAg7Fmh9dGKbg3hULBMWiU.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Olivia is a Deals Writer at Tom’s Guide. She loves all things lifestyle, shopping and sourcing the best deals from some of the top brands, retailers and websites around. From fashion and beauty to smart home and tech, she has an eye for finding practical, stylish, and reasonably-priced items that help make life simpler (and a little more aesthetically-pleasing).&amp;nbsp;Olivia has over five years of experience writing lifestyle, commerce, and branded content for &lt;a href=&quot;http://patch.com/&quot;&gt;Patch.com&lt;/a&gt;. She&#039;s covered major shopping holidays like Amazon Prime Day, Black Friday and Cyber Monday. In her free time, she enjoys trying out new exercise classes, binge-watching the latest viral TV shows, cooking, spending time with family and taking long walks with her dog, Gus.&amp;nbsp;&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/oWEJfRLffGwDUCdAPiKZXQ-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon / edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose Deals]]></media:description>                                                            <media:text><![CDATA[Bose Deals]]></media:text>
                                <media:title type="plain"><![CDATA[Bose Deals]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/oWEJfRLffGwDUCdAPiKZXQ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/news/best-prime-day-deals-and-sales">Prime Day</a> is still a week away — but after seeing these Bose deals, it feels like the savings event has already begun! The brand is already slashing prices on its popular audio gear, with <a href="https://www.amazon.com/stores/Bose/page/9E24AFD5-B420-4859-BD2F-A993BA579B20?" target="_blank" rel="nofollow">discounts reaching up to $130 off select devices</a>.</p><p>If you're in the market for a speaker to tote along to the pool or beach this summer, I recommend <a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0FDLD34V5?" target="_blank" rel="nofollow">the Bose SoundLink Micro for just $99</a>. Hoping to grab a new pair of earbuds? The <a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow">Bose QuietComfort Earbuds 2 are currently 47% off</a>. When it comes to headphones, you can't go wrong with the <a href="https://www.amazon.com/dp/B0CCZ1L489?" target="_blank" rel="nofollow">Bose QuietComfort Headphones Ultra for $329</a> — a discount of $120!</p><p>We don't know how long these rare Bose deals will last, so we recommending adding to cart ASAP. Keep scrolling to check out the rest of my favorite picks from the early Prime Day sale. Also, check out the <a href="https://www.tomsguide.com/savings-squad">Tom's Guide Savings Squad</a> for more personal deal recommendations.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links </span></h3><ul><li><a href="https://www.amazon.com/stores/Bose/page/9E24AFD5-B420-4859-BD2F-A993BA579B20?" target="_blank" rel="nofollow"><strong>shop all Bose deals on Amazon</strong></a></li><li><strong>Bose SoundLink Micro: </strong><a href="https://www.amazon.com/dp/B0FDLD34V5" target="_blank" rel="nofollow"><strong>was $129 now $99</strong></a></li><li><strong>Bose SoundLink Flex (Gen 2): </strong><a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0GL88K2QX?" target="_blank" rel="nofollow"><strong>was $159 now $149</strong></a></li><li><strong>Bose QuietComfort Earbuds 2: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow"><strong>was $279 now $149</strong></a></li><li><strong>Bose Ultra Open Earbuds: </strong><a href="https://www.amazon.com/dp/B0CPFV77W4/" target="_blank" rel="nofollow"><strong>was $299 now $199</strong></a></li><li><strong>Bose QuietComfort Headphones: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZC9J1V?" target="_blank" rel="nofollow"><strong>was $359 now $329</strong></a></li><li><strong>Bose QuietComfort Ultra Headphones: </strong><a href="https://www.amazon.com/dp/B0CCZ1L489?" target="_blank" rel="nofollow"><strong>was $449 now $329</strong></a></li><li><strong>Bose Smart Soundbar: </strong><a href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" target="_blank" rel="nofollow"><strong>was $549 now $399</strong></a></li></ul><h3 class="article-body__section" id="section-best-bose-deals"><span>Best Bose Deals</span></h3><div class="product"><a data-dimension112="86c2f2f7-8b67-49da-845f-0e9193d8a89c" data-action="Deal Block" data-label="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension48="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension25="$99" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0FDLD34V5?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1105px;"><p class="vanilla-image-block" style="padding-top:110.05%;"><img id="4S8VXWvZTpFMLYd8oiNBC7" name="Bose Micro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4S8VXWvZTpFMLYd8oiNBC7.jpg" mos="" align="middle" fullscreen="" width="1105" height="1216" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode.<a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0FDLD34V5?" target="_blank" rel="nofollow" data-dimension112="86c2f2f7-8b67-49da-845f-0e9193d8a89c" data-action="Deal Block" data-label="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension48="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$149" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0GL88K2QX?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1064px;"><p class="vanilla-image-block" style="padding-top:73.03%;"><img id="Ndiipqh272F8NFtamhwsnN" name="Bose SoundLink" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Ndiipqh272F8NFtamhwsnN.jpg" mos="" align="middle" fullscreen="" width="1064" height="777" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The new Bose SoundLink (2nd gen) is a compact and powerful Bluetooth speaker with a durable design. This 1.2-pound speaker is water and dust proof and delivered great sound quality in our <a href="https://www.tomsguide.com/audio/bose-soundlink-flex-2-review" target="_blank" data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$149">SoundLink Flex gen 2 review</a>. <a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0GL88K2QX?" target="_blank" rel="nofollow" data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$149" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:996px;"><p class="vanilla-image-block" style="padding-top:115.06%;"><img id="z2eEQ66QuaM6umZmg8fKoL" name="1715191898.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/z2eEQ66QuaM6umZmg8fKoL.jpg" mos="" align="middle" fullscreen="" width="996" height="1146" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Earbuds 2 take active noise cancellation to the next level. In our <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-earbuds-2" data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$149">Bose QuietComfort Earbuds 2 review</a>, we said these buds are a remarkable follow-up to their predecessors delivering better sound, call quality and unrivaled ANC. Sound balance and noise neutralization work extremely well and the battery life is up to 6 hours, with an extra 24 hours via the charging case.<a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow" data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$199" href="https://www.amazon.com/dp/B0CPFV77W4/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1268px;"><p class="vanilla-image-block" style="padding-top:62.38%;"><img id="qDBpkjESq4Z3UsvHc4vEeX" name="bose open earbuds" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qDBpkjESq4Z3UsvHc4vEeX.jpg" mos="" align="middle" fullscreen="" width="1268" height="791" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose Ultra Open perfected the open earbud formula. They have a comfortable, non-invasive fit, solid battery life, and they sound better than you might expect from open buds. They got <a href="https://www.tomsguide.com/audio/earbuds/bose-ultra-open-earbuds" data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$199">4 stars in our review</a>, where we loved their simple controls and surprising lack of sound leakage. <a class="view-deal button" href="https://www.amazon.com/dp/B0CPFV77W4/" target="_blank" rel="nofollow" data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$329" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZC9J1V?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:835px;"><p class="vanilla-image-block" style="padding-top:134.73%;"><img id="JyM73ExSxoY5g8VsqN7SZW" name="Bose Quietcomfort" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/JyM73ExSxoY5g8VsqN7SZW.jpg" mos="" align="middle" fullscreen="" width="835" height="1125" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>In our <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-headphones" data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$329">Bose QuietComfort Headphones review</a>, we said these are "excellent always-on noise-cancelers with enhanced sound and battery life." They're missing spatial audio mode and touch controls, but they're still a great pick. <a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZC9J1V?" target="_blank" rel="nofollow" data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$329">View Deal</a></p></div><div class="product"><a data-dimension112="21614f99-e07c-4c54-94d8-3bccf72b5cc5" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension25="$249" href="https://www.amazon.com/dp/B0F7M1JXVV?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:934px;"><p class="vanilla-image-block" style="padding-top:124.20%;"><img id="a9jV9Xm3AhpGwNWnqABVVP" name="Bose QuietComfort Ultra Earbuds gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/a9jV9Xm3AhpGwNWnqABVVP.png" mos="" align="middle" fullscreen="" width="934" height="1160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly.<a class="view-deal button" href="https://www.amazon.com/dp/B0F7M1JXVV?" target="_blank" rel="nofollow" data-dimension112="21614f99-e07c-4c54-94d8-3bccf72b5cc5" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="c097b7bc-cc7a-4220-95f9-3407c8e22bd8" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension48="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension25="$329" href="https://www.amazon.com/dp/B0CCZ1L489?" 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:120.00%;"><img id="g64SDV3bmD2tcgopiiNgP6" name="Bose QuietComfort Ultra headphones Versus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g64SDV3bmD2tcgopiiNgP6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else.<a class="view-deal button" href="https://www.amazon.com/dp/B0CCZ1L489?" target="_blank" rel="nofollow" data-dimension112="c097b7bc-cc7a-4220-95f9-3407c8e22bd8" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension48="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension25="$329">View Deal</a></p></div><div class="product"><a data-dimension112="0330e6c1-6dd4-46cd-a90b-ccb7748a6f48" data-action="Deal Block" data-label="The Bose Smart Soundbar is a perfect TV speaker upgrade that also slots right in to your smart home ecosystem. The Smart Soundbar is also compatible with Bose's standalone subwoofers and rear speakers so can be upgraded with time. It's got a 3.0.2 channel setup and is capable of Dolby Atmos too (but would sound even better with a separate subwoofer)." data-dimension48="The Bose Smart Soundbar is a perfect TV speaker upgrade that also slots right in to your smart home ecosystem. The Smart Soundbar is also compatible with Bose's standalone subwoofers and rear speakers so can be upgraded with time. It's got a 3.0.2 channel setup and is capable of Dolby Atmos too (but would sound even better with a separate subwoofer)." data-dimension25="$399" href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" 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="XT9aaiGZoDf6MtibTHXgr6" name="bose smart soundbar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XT9aaiGZoDf6MtibTHXgr6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose Smart Soundbar is a perfect TV speaker upgrade that also slots right in to your smart home ecosystem. The Smart Soundbar is also compatible with Bose's standalone subwoofers and rear speakers so can be upgraded with time. It's got a 3.0.2 channel setup and is capable of Dolby Atmos too (but would sound even better with a separate subwoofer).<a class="view-deal button" href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" target="_blank" rel="nofollow" data-dimension112="0330e6c1-6dd4-46cd-a90b-ccb7748a6f48" data-action="Deal Block" data-label="The Bose Smart Soundbar is a perfect TV speaker upgrade that also slots right in to your smart home ecosystem. The Smart Soundbar is also compatible with Bose's standalone subwoofers and rear speakers so can be upgraded with time. It's got a 3.0.2 channel setup and is capable of Dolby Atmos too (but would sound even better with a separate subwoofer)." data-dimension48="The Bose Smart Soundbar is a perfect TV speaker upgrade that also slots right in to your smart home ecosystem. The Smart Soundbar is also compatible with Bose's standalone subwoofers and rear speakers so can be upgraded with time. It's got a 3.0.2 channel setup and is capable of Dolby Atmos too (but would sound even better with a separate subwoofer)." data-dimension25="$399">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Amazon is practically giving away audio devices — 21 best deals on Bose, Sony and Apple with up to 50% off ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/amazon-is-practically-giving-away-audio-devices-21-best-deals-on-bose-sony-and-apple-with-up-to-50-percent-off</link>
                                                                            <description>
                            <![CDATA[ Amazon's early Prime Day sale is knocking up to 50% off speakers and headphones. Check out my favorite affordable picks from Bose, Apple, Sony and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">kXWoLJQFFEAvjEM9e7ZZGm</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/9GA2y8LKzwDmfASLpKgTA4-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 10 Jun 2026 16:56:05 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Olivia Halevy ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/YAg7Fmh9dGKbg3hULBMWiU.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Olivia is a Deals Writer at Tom’s Guide. She loves all things lifestyle, shopping and sourcing the best deals from some of the top brands, retailers and websites around. From fashion and beauty to smart home and tech, she has an eye for finding practical, stylish, and reasonably-priced items that help make life simpler (and a little more aesthetically-pleasing).&amp;nbsp;Olivia has over five years of experience writing lifestyle, commerce, and branded content for &lt;a href=&quot;http://patch.com/&quot;&gt;Patch.com&lt;/a&gt;. She&#039;s covered major shopping holidays like Amazon Prime Day, Black Friday and Cyber Monday. In her free time, she enjoys trying out new exercise classes, binge-watching the latest viral TV shows, cooking, spending time with family and taking long walks with her dog, Gus.&amp;nbsp;&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/9GA2y8LKzwDmfASLpKgTA4-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon / edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[audio devices]]></media:description>                                                            <media:text><![CDATA[audio devices]]></media:text>
                                <media:title type="plain"><![CDATA[audio devices]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/9GA2y8LKzwDmfASLpKgTA4-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With early <a href="https://www.tomsguide.com/news/best-prime-day-deals-and-sales">Prime Day deals</a> cropping up left and right, now is the perfect time to invest in those high-quality headphones, earbuds or speakers you've been eyeing. The good news? Amazon is currently hosting a sale with up to 50% off top-rated audio devices.</p><p>Amazon's sale has deals to fit every budget. In fact, some of the <a href="https://www.tomsguide.com/us/best-headphones-deals,news-28645.html">best headphones</a> we've tested from brands like JBL, Bose, Apple and Sony will cost you as little as $29. Plus, some of our favorite speakers are also on sale, including <a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0FDLD34V5?" target="_blank" rel="nofollow">the Bose SoundLink Micro for just $99</a>. </p><p>If you're ready to upgrade your audio devices ahead of summer travel, pool parties, beach days and more, keep scrolling. I've rounded up all my favorite audio device deals on Amazon that will get you the most bang for your buck! </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links </span></h3><ul><li><a href="https://www.amazon.com/primeday" target="_blank" rel="nofollow"><strong>shop all early Prime Day deals on Amazon</strong></a></li><li><strong>JBL Go 3 Bluetooth Speaker: </strong><a href="https://www.amazon.com/JBL-Bluetooth-Built-Waterproof-Dustproof/dp/B08MYFM4DF?" target="_blank" rel="nofollow"><strong>was $39 now $29</strong></a></li><li><strong>Sony WH-CH520: </strong><a href="https://www.amazon.com/dp/B0BS1RT9S2" target="_blank" rel="nofollow"><strong>was $59 now $38</strong></a></li><li><strong>Beats Flex Wireless: </strong><a href="https://www.amazon.com/Beats-Flex-Wireless-Earphones-Built/dp/B08L6ZYW21/" target="_blank" rel="nofollow"><strong>was $69 now $49</strong></a></li><li><strong>Apple AirPods 4: </strong><a href="https://www.amazon.com/dp/B0DGHMNQ5Z/" target="_blank" rel="nofollow"><strong>was $129 now $99</strong></a></li><li><strong>Bose SoundLink Micro: </strong><a href="https://www.amazon.com/dp/B0FDLD34V5" target="_blank" rel="nofollow"><strong>was $129 now $99</strong></a></li><li><strong>Bose QuietComfort Earbuds 2: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow"><strong>was $279 now $149</strong></a></li></ul><h3 class="article-body__section" id="section-bose-deals"><span>Bose Deals</span></h3><div class="product"><a data-dimension112="86c2f2f7-8b67-49da-845f-0e9193d8a89c" data-action="Deal Block" data-label="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension48="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension25="$99" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0FDLD34V5?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1105px;"><p class="vanilla-image-block" style="padding-top:110.05%;"><img id="4S8VXWvZTpFMLYd8oiNBC7" name="Bose Micro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4S8VXWvZTpFMLYd8oiNBC7.jpg" mos="" align="middle" fullscreen="" width="1105" height="1216" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode.<a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0FDLD34V5?" target="_blank" rel="nofollow" data-dimension112="86c2f2f7-8b67-49da-845f-0e9193d8a89c" data-action="Deal Block" data-label="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension48="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$149" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:996px;"><p class="vanilla-image-block" style="padding-top:115.06%;"><img id="z2eEQ66QuaM6umZmg8fKoL" name="1715191898.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/z2eEQ66QuaM6umZmg8fKoL.jpg" mos="" align="middle" fullscreen="" width="996" height="1146" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Earbuds 2 take active noise cancellation to the next level. In our <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-earbuds-2" data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$149">Bose QuietComfort Earbuds 2 review</a>, we said these buds are a remarkable follow-up to their predecessors delivering better sound, call quality and unrivaled ANC. Sound balance and noise neutralization work extremely well and the battery life is up to 6 hours, with an extra 24 hours via the charging case.<a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow" data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="fb907c62-df7d-40d3-a715-df097ad0db6b" data-action="Deal Block" data-label="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension48="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension25="$289" href="https://www.amazon.com/dp/B08VL5S148/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:871px;"><p class="vanilla-image-block" style="padding-top:172.22%;"><img id="e6o2rGs8aAMyy3SPFHLwNK" name="SoundLink Revolve+" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/e6o2rGs8aAMyy3SPFHLwNK.png" mos="" align="middle" fullscreen="" width="871" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever.<a class="view-deal button" href="https://www.amazon.com/dp/B08VL5S148/" target="_blank" rel="nofollow" data-dimension112="fb907c62-df7d-40d3-a715-df097ad0db6b" data-action="Deal Block" data-label="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension48="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension25="$289">View Deal</a></p></div><div class="product"><a data-dimension112="c097b7bc-cc7a-4220-95f9-3407c8e22bd8" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension48="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension25="$329" href="https://www.amazon.com/dp/B0CCZ1L489?" 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:120.00%;"><img id="g64SDV3bmD2tcgopiiNgP6" name="Bose QuietComfort Ultra headphones Versus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g64SDV3bmD2tcgopiiNgP6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else.<a class="view-deal button" href="https://www.amazon.com/dp/B0CCZ1L489?" target="_blank" rel="nofollow" data-dimension112="c097b7bc-cc7a-4220-95f9-3407c8e22bd8" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension48="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension25="$329">View Deal</a></p></div><h3 class="article-body__section" id="section-apple-deals"><span>Apple Deals</span></h3><div class="product"><a data-dimension112="72ea5f7f-796e-4188-91ea-4eac75ddb7e7" data-action="Deal Block" data-label="The AirPods 4 are about as barebones as AirPods come, but they're still packed with features. Spatial Audio is on board for example, something you'd have to pay more for on the old model. 5 hours of battery isn't the very best, but they're a great on boarding place for the AirPods line." data-dimension48="The AirPods 4 are about as barebones as AirPods come, but they're still packed with features. Spatial Audio is on board for example, something you'd have to pay more for on the old model. 5 hours of battery isn't the very best, but they're a great on boarding place for the AirPods line." data-dimension25="$99" href="https://www.amazon.com/dp/B0DGHMNQ5Z/" 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:120.00%;"><img id="kTKCG8gCBjg4vScr6CMgoN" name="AirPods 4 BG image.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kTKCG8gCBjg4vScr6CMgoN.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The AirPods 4 are about as barebones as AirPods come, but they're still packed with features. Spatial Audio is on board for example, something you'd have to pay more for on the old model. 5 hours of battery isn't the very best, but they're a great on boarding place for the AirPods line.<a class="view-deal button" href="https://www.amazon.com/dp/B0DGHMNQ5Z/" target="_blank" rel="nofollow" data-dimension112="72ea5f7f-796e-4188-91ea-4eac75ddb7e7" data-action="Deal Block" data-label="The AirPods 4 are about as barebones as AirPods come, but they're still packed with features. Spatial Audio is on board for example, something you'd have to pay more for on the old model. 5 hours of battery isn't the very best, but they're a great on boarding place for the AirPods line." data-dimension48="The AirPods 4 are about as barebones as AirPods come, but they're still packed with features. Spatial Audio is on board for example, something you'd have to pay more for on the old model. 5 hours of battery isn't the very best, but they're a great on boarding place for the AirPods line." data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="ce97e23b-56da-45f1-8b62-04a3c3cd2f60" data-action="Deal Block" data-label="AirPods Pro 3 review" data-dimension48="AirPods Pro 3 review" data-dimension25="$179" href="https://www.amazon.com/Apple-Cancellation-Translation-Headphones-High-Fidelity/dp/B0FQFB8FMG" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:842px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="FYzcjQSdtuwidVacXmMNL5" name="AirPods Pro 3.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FYzcjQSdtuwidVacXmMNL5.jpg" mos="" align="middle" fullscreen="" width="842" height="842" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The AirPods Pro 3 bring the heat with 10 hours of battery life, improved sound, and superior active noise canceling. In our <a href="https://www.tomsguide.com/audio/airpods/apple-airpods-pro-3-review" data-dimension112="ce97e23b-56da-45f1-8b62-04a3c3cd2f60" data-action="Deal Block" data-label="AirPods Pro 3 review" data-dimension48="AirPods Pro 3 review" data-dimension25="$179">AirPods Pro 3 review</a> we said the Editor's Choice buds deliver the upgrade iPhone users have been waiting for with improved battery life, stronger noise cancellation, and smart new features like Live Translation, which delivers real-time translations to your ears. <a class="view-deal button" href="https://www.amazon.com/Apple-Cancellation-Translation-Headphones-High-Fidelity/dp/B0FQFB8FMG" target="_blank" rel="nofollow" data-dimension112="ce97e23b-56da-45f1-8b62-04a3c3cd2f60" data-action="Deal Block" data-label="AirPods Pro 3 review" data-dimension48="AirPods Pro 3 review" data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="cba9a91d-22fb-4417-be72-0d4fcc8f0032" data-action="Deal Block" data-label="The AirPods Max 2 are Apple's latest flagship over-ears, with hi-res audio playback via USB-C and Bluetooth, seamless Siri integration and smart features like Live Translation, intuitive controls, and a sleek, iconic design." data-dimension48="The AirPods Max 2 are Apple's latest flagship over-ears, with hi-res audio playback via USB-C and Bluetooth, seamless Siri integration and smart features like Live Translation, intuitive controls, and a sleek, iconic design." data-dimension25="$499" href="https://www.amazon.com/Apple-Headphones-Cancellation-Personalized-Translation/dp/B0GSS72GZJ/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1356px;"><p class="vanilla-image-block" style="padding-top:110.62%;"><img id="augarq3rWrbuXENFrmUU88" name="airpods max 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/augarq3rWrbuXENFrmUU88.jpg" mos="" align="middle" fullscreen="" width="1356" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The AirPods Max 2 are Apple's latest flagship over-ears, with hi-res audio playback via USB-C and Bluetooth, seamless Siri integration and smart features like Live Translation, intuitive controls, and a sleek, iconic design.<a class="view-deal button" href="https://www.amazon.com/Apple-Headphones-Cancellation-Personalized-Translation/dp/B0GSS72GZJ/" target="_blank" rel="nofollow" data-dimension112="cba9a91d-22fb-4417-be72-0d4fcc8f0032" data-action="Deal Block" data-label="The AirPods Max 2 are Apple's latest flagship over-ears, with hi-res audio playback via USB-C and Bluetooth, seamless Siri integration and smart features like Live Translation, intuitive controls, and a sleek, iconic design." data-dimension48="The AirPods Max 2 are Apple's latest flagship over-ears, with hi-res audio playback via USB-C and Bluetooth, seamless Siri integration and smart features like Live Translation, intuitive controls, and a sleek, iconic design." data-dimension25="$499">View Deal</a></p></div><h3 class="article-body__section" id="section-beats-deals"><span>Beats Deals</span></h3><div class="product"><a data-dimension112="fa258a7e-a0ca-4ffd-8f23-c047a77c06d5" data-action="Deal Block" data-label="While they aren't technically true wireless, on account of the wire that connects the buds, the Flex are a great pair of fitness earbuds. They're super comfortable thanks to their lightweight, and this $20 saving is a solid discount." data-dimension48="While they aren't technically true wireless, on account of the wire that connects the buds, the Flex are a great pair of fitness earbuds. They're super comfortable thanks to their lightweight, and this $20 saving is a solid discount." data-dimension25="$49" href="https://www.amazon.com/Beats-Flex-Wireless-Earphones-Built/dp/B08L6ZYW21/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:103.68%;"><img id="FGXTiRGeZrNnRV5M5SvbR9" name="Beats Flex" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FGXTiRGeZrNnRV5M5SvbR9.jpg" mos="" align="middle" fullscreen="" width="679" height="704" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>While they aren't <em>technically </em>true wireless, on account of the wire that connects the buds, the Flex are a great pair of fitness earbuds. They're super comfortable thanks to their lightweight, and this $20 saving is a solid discount.<a class="view-deal button" href="https://www.amazon.com/Beats-Flex-Wireless-Earphones-Built/dp/B08L6ZYW21/" target="_blank" rel="nofollow" data-dimension112="fa258a7e-a0ca-4ffd-8f23-c047a77c06d5" data-action="Deal Block" data-label="While they aren't technically true wireless, on account of the wire that connects the buds, the Flex are a great pair of fitness earbuds. They're super comfortable thanks to their lightweight, and this $20 saving is a solid discount." data-dimension48="While they aren't technically true wireless, on account of the wire that connects the buds, the Flex are a great pair of fitness earbuds. They're super comfortable thanks to their lightweight, and this $20 saving is a solid discount." data-dimension25="$49">View Deal</a></p></div><div class="product"><a data-dimension112="3ff45c7f-f854-4f49-a93e-32fb7708c3dd" data-action="Deal Block" data-label="Beats Studio Buds Plus review" data-dimension48="Beats Studio Buds Plus review" data-dimension25="$99" href="https://www.amazon.com/dp/B0C2W1KLSS/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:107.51%;"><img id="Nu3NHDhGaSDd5XGizimnyT" name="Studio Buds plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nu3NHDhGaSDd5XGizimnyT.jpg" mos="" align="middle" fullscreen="" width="679" height="730" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Beats Studio Buds are a wonderful little pair of buds, with some big improvements over the last model. 9 hours of battery life is exemplary, extended to 36 hours with the charging case, and they're some of the most comfortable wireless in-ears around. In our <a href="https://www.tomsguide.com/reviews/beats-studio-buds-plus" data-dimension112="3ff45c7f-f854-4f49-a93e-32fb7708c3dd" data-action="Deal Block" data-label="Beats Studio Buds Plus review" data-dimension48="Beats Studio Buds Plus review" data-dimension25="$99">Beats Studio Buds Plus review</a>, we gave them 4 stars thanks to their great design and sound.<a class="view-deal button" href="https://www.amazon.com/dp/B0C2W1KLSS/" target="_blank" rel="nofollow" data-dimension112="3ff45c7f-f854-4f49-a93e-32fb7708c3dd" data-action="Deal Block" data-label="Beats Studio Buds Plus review" data-dimension48="Beats Studio Buds Plus review" data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="81c33ad1-2513-46b2-a22a-12c754df1076" data-action="Deal Block" data-label="Beats Pill hands-on review" data-dimension48="Beats Pill hands-on review" data-dimension25="$99" href="https://www.amazon.com/gp/aw/d/B0D4STT6C2/" 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:120.00%;"><img id="DG5WgcSHFZLZ9WcXutJuLT" name="Beats Pill" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/DG5WgcSHFZLZ9WcXutJuLT.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>In our <a href="https://www.tomsguide.com/audio/beats-pill-2024-tested-5-things-i-like-3-that-i-dont" data-dimension112="81c33ad1-2513-46b2-a22a-12c754df1076" data-action="Deal Block" data-label="Beats Pill hands-on review" data-dimension48="Beats Pill hands-on review" data-dimension25="$99">Beats Pill hands-on review</a>, we found a speaker that has (as you might expect) some massive bass and a slick look. Battery life is respectable at 24 hours, and its waterproofing makes it perfect for pool parties and outdoor use.<a class="view-deal button" href="https://www.amazon.com/gp/aw/d/B0D4STT6C2/" target="_blank" rel="nofollow" data-dimension112="81c33ad1-2513-46b2-a22a-12c754df1076" data-action="Deal Block" data-label="Beats Pill hands-on review" data-dimension48="Beats Pill hands-on review" data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="e458bce2-b3ad-4a49-a899-a577277611fd" data-action="Deal Block" data-label="The Beats Solo 4 might not feature noise canceling, but they make up for it by sounding pretty good. They're comfortable as well thanks to Beats new foam, and they fold up super small so that they can fit into any bag. There's also loads of battery life — 50 hours, to be exact." data-dimension48="The Beats Solo 4 might not feature noise canceling, but they make up for it by sounding pretty good. They're comfortable as well thanks to Beats new foam, and they fold up super small so that they can fit into any bag. There's also loads of battery life — 50 hours, to be exact." data-dimension25="$129" href="https://www.amazon.com/dp/B0CZPHPJLN/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:717px;"><p class="vanilla-image-block" style="padding-top:154.25%;"><img id="ZDYGygzUQQsApUVGtH5RBe" name="510fGxoTsTL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ZDYGygzUQQsApUVGtH5RBe.jpg" mos="" align="middle" fullscreen="" width="717" height="1106" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Beats Solo 4 might not feature noise canceling, but they make up for it by sounding pretty good. They're comfortable as well thanks to Beats new foam, and they fold up super small so that they can fit into any bag. There's also loads of battery life — 50 hours, to be exact.<a class="view-deal button" href="https://www.amazon.com/dp/B0CZPHPJLN/" target="_blank" rel="nofollow" data-dimension112="e458bce2-b3ad-4a49-a899-a577277611fd" data-action="Deal Block" data-label="The Beats Solo 4 might not feature noise canceling, but they make up for it by sounding pretty good. They're comfortable as well thanks to Beats new foam, and they fold up super small so that they can fit into any bag. There's also loads of battery life — 50 hours, to be exact." data-dimension48="The Beats Solo 4 might not feature noise canceling, but they make up for it by sounding pretty good. They're comfortable as well thanks to Beats new foam, and they fold up super small so that they can fit into any bag. There's also loads of battery life — 50 hours, to be exact." data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="b3260ccc-124d-482e-b165-0f18f9d49a5c" data-action="Deal Block" data-label="Beats Studio Pro review" data-dimension48="Beats Studio Pro review" data-dimension25="$169" href="https://www.amazon.com/Beats-Studio-Pro-Personalized-Compatibility/dp/B0FHM61VTK" 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="WbdEkaq3pnr5qszwU9U9aX" name="Beats Studio Pro on white.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WbdEkaq3pnr5qszwU9U9aX.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Beats Studio Pro are specifically designed to bring back that thumping bass Beats is known for. They offer improved active noise cancelation and boosted battery life (up to 40 hours with ANC turned off). There's also Spatial Audio support and Beats' signature strong brand look. However, our <a href="https://www.tomsguide.com/reviews/beats-studio-pro-review" data-dimension112="b3260ccc-124d-482e-b165-0f18f9d49a5c" data-action="Deal Block" data-label="Beats Studio Pro review" data-dimension48="Beats Studio Pro review" data-dimension25="$169">Beats Studio Pro review</a> found the clamping force high, which may affect comfort levels for some wearers. Originally priced at $349, they've now on sale for over half off.<a class="view-deal button" href="https://www.amazon.com/Beats-Studio-Pro-Personalized-Compatibility/dp/B0FHM61VTK" target="_blank" rel="nofollow" data-dimension112="b3260ccc-124d-482e-b165-0f18f9d49a5c" data-action="Deal Block" data-label="Beats Studio Pro review" data-dimension48="Beats Studio Pro review" data-dimension25="$169">View Deal</a></p></div><h3 class="article-body__section" id="section-sony-deals"><span>Sony Deals</span></h3><div class="product"><a data-dimension112="92de88d5-77a6-411e-aa1b-a63d0cb3800d" data-action="Deal Block" data-label="Sony WH-CH520 headphones review" data-dimension48="Sony WH-CH520 headphones review" data-dimension25="$38" href="https://www.amazon.com/dp/B0BS1RT9S2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:510px;"><p class="vanilla-image-block" style="padding-top:154.90%;"><img id="bzH89XJXSHScmHcf8rgiyP" name="Sony_WH-C520_Headphones_cappucino_deal_block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bzH89XJXSHScmHcf8rgiyP.jpg" mos="" align="middle" fullscreen="" width="510" height="790" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Our <a href="https://www.tomsguide.com/audio/over-ear-headphones/sony-wh-ch520-review" data-dimension112="92de88d5-77a6-411e-aa1b-a63d0cb3800d" data-action="Deal Block" data-label="Sony WH-CH520 headphones review" data-dimension48="Sony WH-CH520 headphones review" data-dimension25="$38">Sony WH-CH520 headphones review</a> said these headphones "deliver on battery life and performance."  They're 360 Reality Audio compatible for more 3D sound and you can customize EQ in the Sony Headphones app. Although there's no active noise cancelling function, they have built-in mics for hands-free voice and video calls and noise suppression processing to keep your voice sounding clear in noisy environments. They're also rated for up to 50 hours of battery life.<a class="view-deal button" href="https://www.amazon.com/dp/B0BS1RT9S2" target="_blank" rel="nofollow" data-dimension112="92de88d5-77a6-411e-aa1b-a63d0cb3800d" data-action="Deal Block" data-label="Sony WH-CH520 headphones review" data-dimension48="Sony WH-CH520 headphones review" data-dimension25="$38">View Deal</a></p></div><div class="product"><a data-dimension112="c703bc6c-ba12-4961-a9c8-255a6ae4a718" data-action="Deal Block" data-label="One of the best Bluetooth speakers in terms of portability is on sale right now at Amazon. Believe it or not, this 0.6-pound speaker packs a punch. The orange, light grey and black colors are all included in the promotion." data-dimension48="One of the best Bluetooth speakers in terms of portability is on sale right now at Amazon. Believe it or not, this 0.6-pound speaker packs a punch. The orange, light grey and black colors are all included in the promotion." data-dimension25="$43" href="https://www.amazon.com/Sony-Lightweight-Super-Compact-Extra-Durable-Waterproof/dp/B0C296VD7T?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1428px;"><p class="vanilla-image-block" style="padding-top:105.04%;"><img id="2HoERCRCD9zg7NesyDvkZC" name="sony-srs-xb13-speaker.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2HoERCRCD9zg7NesyDvkZC.jpg" mos="" align="middle" fullscreen="" width="1428" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>One of the best Bluetooth speakers in terms of portability is on sale right now at Amazon. Believe it or not, this 0.6-pound speaker packs a punch. The orange, light grey and black colors are all included in the promotion. <a class="view-deal button" href="https://www.amazon.com/Sony-Lightweight-Super-Compact-Extra-Durable-Waterproof/dp/B0C296VD7T?" target="_blank" rel="nofollow" data-dimension112="c703bc6c-ba12-4961-a9c8-255a6ae4a718" data-action="Deal Block" data-label="One of the best Bluetooth speakers in terms of portability is on sale right now at Amazon. Believe it or not, this 0.6-pound speaker packs a punch. The orange, light grey and black colors are all included in the promotion." data-dimension48="One of the best Bluetooth speakers in terms of portability is on sale right now at Amazon. Believe it or not, this 0.6-pound speaker packs a punch. The orange, light grey and black colors are all included in the promotion." data-dimension25="$43">View Deal</a></p></div><div class="product"><a data-dimension112="24731b83-bae0-46b3-93fe-8563ed3cc3f0" data-action="Deal Block" data-label="hands on with the  ULT Field 1" data-dimension48="hands on with the  ULT Field 1" data-dimension25="$88" href="https://www.amazon.com/dp/B0CXL4FQBK" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:892px;"><p class="vanilla-image-block" style="padding-top:69.51%;"><img id="KoGznt83WHerZtKm3W8ec3" name="ULT Field 1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KoGznt83WHerZtKm3W8ec3.jpg" mos="" align="middle" fullscreen="" width="892" height="620" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Sony's ULT line is big, bassy and loads of fun. The ULT Field 1 is a great entry into the family, and when we went <a href="https://www.tomsguide.com/audio/bluetooth-speakers/sony-ult-field-1" data-dimension112="24731b83-bae0-46b3-93fe-8563ed3cc3f0" data-action="Deal Block" data-label="hands on with the  ULT Field 1" data-dimension48="hands on with the  ULT Field 1" data-dimension25="$88">hands on with the  ULT Field 1</a> we found a powerful little speaker with some big sound. Battery life is solid as well at 12 hours. <a class="view-deal button" href="https://www.amazon.com/dp/B0CXL4FQBK" target="_blank" rel="nofollow" data-dimension112="24731b83-bae0-46b3-93fe-8563ed3cc3f0" data-action="Deal Block" data-label="hands on with the  ULT Field 1" data-dimension48="hands on with the  ULT Field 1" data-dimension25="$88">View Deal</a></p></div><div class="product"><a data-dimension112="8d52cd80-c7a2-4b75-b721-7fe712d8516d" data-action="Deal Block" data-label="our review" data-dimension48="our review" data-dimension25="$248" href="https://www.amazon.com/dp/B0C33XXS56/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1509px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="zpDUbSJksxwfgT3KDaf4WS" name="Sony WF-1000XM5.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zpDUbSJksxwfgT3KDaf4WS.jpg" mos="" align="middle" fullscreen="" width="1509" height="1509" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These are some of the best buds that you can buy right now. They sound excellent, with some wickedly detailed sound with plenty of low-end grunt, and feature a very comfortable fit. We gave them 4.5 stars in <a href="https://www.tomsguide.com/reviews/sony-wf-1000xm5" data-dimension112="8d52cd80-c7a2-4b75-b721-7fe712d8516d" data-action="Deal Block" data-label="our review" data-dimension48="our review" data-dimension25="$248">our review</a> because of their great ANC, which manages to block out almost any noise you could throw at them. This isn't <em>quite</em> their lowest price ever, but it's very close.<a class="view-deal button" href="https://www.amazon.com/dp/B0C33XXS56/" target="_blank" rel="nofollow" data-dimension112="8d52cd80-c7a2-4b75-b721-7fe712d8516d" data-action="Deal Block" data-label="our review" data-dimension48="our review" data-dimension25="$248">View Deal</a></p></div><div class="product"><a data-dimension112="b3d07d53-781a-4bd8-93c8-1648375c9a36" data-action="Deal Block" data-label="The XM5s are Sony's premium noise-canceling headphones and our pick for the best headphones on the market. The large, over-ear cushions are incredibly comfortable and the active noise cancelation is excellent. Plus, despite ANC being a drain on battery life, these amazing headphones still give you up to 30 hours with ANC enabled. You can push that up to 40 hours of battery life with ANC turned off." data-dimension48="The XM5s are Sony's premium noise-canceling headphones and our pick for the best headphones on the market. The large, over-ear cushions are incredibly comfortable and the active noise cancelation is excellent. Plus, despite ANC being a drain on battery life, these amazing headphones still give you up to 30 hours with ANC enabled. You can push that up to 40 hours of battery life with ANC turned off." data-dimension25="$278" href="https://www.amazon.com/Sony-WH-1000XM5-Headphones-Hands-Free-WH1000XM5/dp/B0BXYCS74H?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1381px;"><p class="vanilla-image-block" style="padding-top:108.62%;"><img id="TWLQcjD9oitTFCdEHsgTe5" name="Sony WH-1000XM5 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/TWLQcjD9oitTFCdEHsgTe5.jpg" mos="" align="middle" fullscreen="" width="1381" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The XM5s are Sony's premium noise-canceling headphones and our pick for the best headphones on the market. The large, over-ear cushions are incredibly comfortable and the active noise cancelation is excellent. Plus, despite ANC being a drain on battery life, these amazing headphones still give you up to 30 hours with ANC enabled. You can push that up to 40 hours of battery life with ANC turned off.<a class="view-deal button" href="https://www.amazon.com/Sony-WH-1000XM5-Headphones-Hands-Free-WH1000XM5/dp/B0BXYCS74H?" target="_blank" rel="nofollow" data-dimension112="b3d07d53-781a-4bd8-93c8-1648375c9a36" data-action="Deal Block" data-label="The XM5s are Sony's premium noise-canceling headphones and our pick for the best headphones on the market. The large, over-ear cushions are incredibly comfortable and the active noise cancelation is excellent. Plus, despite ANC being a drain on battery life, these amazing headphones still give you up to 30 hours with ANC enabled. You can push that up to 40 hours of battery life with ANC turned off." data-dimension48="The XM5s are Sony's premium noise-canceling headphones and our pick for the best headphones on the market. The large, over-ear cushions are incredibly comfortable and the active noise cancelation is excellent. Plus, despite ANC being a drain on battery life, these amazing headphones still give you up to 30 hours with ANC enabled. You can push that up to 40 hours of battery life with ANC turned off." data-dimension25="$278">View Deal</a></p></div><h3 class="article-body__section" id="section-jbl-deals"><span>JBL Deals</span></h3><div class="product"><a data-dimension112="7ae888f7-2ef3-46fd-96ad-f5876746f805" data-action="Deal Block" data-label="JBL Go 3" data-dimension48="JBL Go 3" data-dimension25="$29" href="https://www.amazon.com/JBL-Bluetooth-Built-Waterproof-Dustproof/dp/B08MYFM4DF?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1395px;"><p class="vanilla-image-block" style="padding-top:61.51%;"><img id="N2CHKo3ceR7eP5bf7WbPjb" name="jbl-go-3.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/N2CHKo3ceR7eP5bf7WbPjb.jpg" mos="" align="middle" fullscreen="" width="1395" height="858" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/reviews/jbl-go-3" data-dimension112="7ae888f7-2ef3-46fd-96ad-f5876746f805" data-action="Deal Block" data-label="JBL Go 3" data-dimension48="JBL Go 3" data-dimension25="$29">JBL Go 3</a> is the ideal Bluetooth speaker for traveling and outdoor adventures, and it's dropped to $29 at Amazon. It's IP67 waterproof and dustproof, and ultra-compact in size. But it still offers surprisingly strong sound and up to five hours of playback on a single battery charge. <a class="view-deal button" href="https://www.amazon.com/JBL-Bluetooth-Built-Waterproof-Dustproof/dp/B08MYFM4DF?" target="_blank" rel="nofollow" data-dimension112="7ae888f7-2ef3-46fd-96ad-f5876746f805" data-action="Deal Block" data-label="JBL Go 3" data-dimension48="JBL Go 3" data-dimension25="$29">View Deal</a></p></div><div class="product"><a data-dimension112="150653c3-a4ca-4511-9250-665512e9f683" data-action="Deal Block" data-label="JBL Go 4 review" data-dimension48="JBL Go 4 review" data-dimension25="$39" href="https://www.amazon.com/JBL-Ultra-Portable-Waterproof-Dustproof-Built/dp/B0CTNWKGM2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:105.30%;"><img id="PfFcSd7yE4rJP5xxATqJ3e" name="JBL Go" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PfFcSd7yE4rJP5xxATqJ3e.jpg" mos="" align="middle" fullscreen="" width="679" height="715" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Our <a href="https://www.tomsguide.com/audio/bluetooth-speakers/jbl-go-4-review" data-dimension112="150653c3-a4ca-4511-9250-665512e9f683" data-action="Deal Block" data-label="JBL Go 4 review" data-dimension48="JBL Go 4 review" data-dimension25="$39">JBL Go 4 review</a> determined that this is the perfect portable Bluetooth speaker for those on a budget. Small enough to take traveling, it still packs enough performance to soundtrack small gatherings while bringing useful features like IP67 water and dust protection, and multi-point connectivity. It also comes in a variety of fun colors.<a class="view-deal button" href="https://www.amazon.com/JBL-Ultra-Portable-Waterproof-Dustproof-Built/dp/B0CTNWKGM2" target="_blank" rel="nofollow" data-dimension112="150653c3-a4ca-4511-9250-665512e9f683" data-action="Deal Block" data-label="JBL Go 4 review" data-dimension48="JBL Go 4 review" data-dimension25="$39">View Deal</a></p></div><div class="product"><a data-dimension112="71929b47-1264-44f4-ae56-e72b774d8f6b" data-action="Deal Block" data-label="With the JBL Vibe Beam, you get access to a huge range of useful features, including adjustable EQ, IP54 dust/water resistance and 8-hour battery life. There's also a transparency mode to help you stay aware of your surroundings while you enjoy your music." data-dimension48="With the JBL Vibe Beam, you get access to a huge range of useful features, including adjustable EQ, IP54 dust/water resistance and 8-hour battery life. There's also a transparency mode to help you stay aware of your surroundings while you enjoy your music." data-dimension25="$47" href="https://www.amazon.com/dp/B0BQPNMXQV?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:998px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="NrdZqYjhf5GrfLbwPz67fS" name="JBL Vibe Beam.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NrdZqYjhf5GrfLbwPz67fS.jpg" mos="" align="middle" fullscreen="" width="998" height="998" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With the JBL Vibe Beam, you get access to a huge range of useful features, including adjustable EQ, IP54 dust/water resistance and 8-hour battery life. There's also a transparency mode to help you stay aware of your surroundings while you enjoy your music.<a class="view-deal button" href="https://www.amazon.com/dp/B0BQPNMXQV?" target="_blank" rel="nofollow" data-dimension112="71929b47-1264-44f4-ae56-e72b774d8f6b" data-action="Deal Block" data-label="With the JBL Vibe Beam, you get access to a huge range of useful features, including adjustable EQ, IP54 dust/water resistance and 8-hour battery life. There's also a transparency mode to help you stay aware of your surroundings while you enjoy your music." data-dimension48="With the JBL Vibe Beam, you get access to a huge range of useful features, including adjustable EQ, IP54 dust/water resistance and 8-hour battery life. There's also a transparency mode to help you stay aware of your surroundings while you enjoy your music." data-dimension25="$47">View Deal</a></p></div><div class="product"><a data-dimension112="12dd2a99-1077-4b77-8354-761ba0c7a0ff" data-action="Deal Block" data-label="These budget cans pack in more features, although you'll miss out on the ANC you'll get with some of the other options on this list. Still, these headphones have a massive 76 hour battery, so they'll last you for a long, long time. Thick cushioning provides a comfortable fit for long periods of wear." data-dimension48="These budget cans pack in more features, although you'll miss out on the ANC you'll get with some of the other options on this list. Still, these headphones have a massive 76 hour battery, so they'll last you for a long, long time. Thick cushioning provides a comfortable fit for long periods of wear." data-dimension25="$49" href="https://www.amazon.com/dp/B0CS8WVRLQ/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1190px;"><p class="vanilla-image-block" style="padding-top:113.61%;"><img id="kYA8RY5ohsqVvc9Ki7zKfL" name="JBL Tune 720BT.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kYA8RY5ohsqVvc9Ki7zKfL.jpg" mos="" align="middle" fullscreen="" width="1190" height="1352" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These budget cans pack in more features, although you'll miss out on the ANC you'll get with some of the other options on this list. Still, these headphones have a massive 76 hour battery, so they'll last you for a long, long time. Thick cushioning provides a comfortable fit for long periods of wear.<a class="view-deal button" href="https://www.amazon.com/dp/B0CS8WVRLQ/" target="_blank" rel="nofollow" data-dimension112="12dd2a99-1077-4b77-8354-761ba0c7a0ff" data-action="Deal Block" data-label="These budget cans pack in more features, although you'll miss out on the ANC you'll get with some of the other options on this list. Still, these headphones have a massive 76 hour battery, so they'll last you for a long, long time. Thick cushioning provides a comfortable fit for long periods of wear." data-dimension48="These budget cans pack in more features, although you'll miss out on the ANC you'll get with some of the other options on this list. Still, these headphones have a massive 76 hour battery, so they'll last you for a long, long time. Thick cushioning provides a comfortable fit for long periods of wear." data-dimension25="$49">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Bose headphones and speakers are up to $130 off right now — my 9 favorite early Prime Day deals ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/bose-headphones-and-speakers-are-up-to-usd130-off-right-now-my-9-favorite-early-prime-day-deals</link>
                                                                            <description>
                            <![CDATA[ Amazon's early Prime Day sale is knocking up to 47% off Bose speakers and headphones. Check out my favorite picks from the sale. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">DacgZXYRKTyG4sxZqmwacd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/B5XvHVAkvArsDunVyieL2S-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 04 Jun 2026 14:35:17 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Olivia Halevy ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/YAg7Fmh9dGKbg3hULBMWiU.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Olivia is a Deals Writer at Tom’s Guide. She loves all things lifestyle, shopping and sourcing the best deals from some of the top brands, retailers and websites around. From fashion and beauty to smart home and tech, she has an eye for finding practical, stylish, and reasonably-priced items that help make life simpler (and a little more aesthetically-pleasing).&amp;nbsp;Olivia has over five years of experience writing lifestyle, commerce, and branded content for &lt;a href=&quot;http://patch.com/&quot;&gt;Patch.com&lt;/a&gt;. She&#039;s covered major shopping holidays like Amazon Prime Day, Black Friday and Cyber Monday. In her free time, she enjoys trying out new exercise classes, binge-watching the latest viral TV shows, cooking, spending time with family and taking long walks with her dog, Gus.&amp;nbsp;&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/B5XvHVAkvArsDunVyieL2S-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon / edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose]]></media:description>                                                            <media:text><![CDATA[Bose]]></media:text>
                                <media:title type="plain"><![CDATA[Bose]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/B5XvHVAkvArsDunVyieL2S-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Need some new audio devices for summer? Look no further than Bose — the popular brand that makes some of the <a href="https://www.tomsguide.com/us/best-headphones,review-1988.html">best headphones</a> and <a href="https://www.tomsguide.com/best-picks/best-waterproof-speakers">best waterproof Bluetooth speakers</a> on the market. In fact, Amazon's early <a href="https://www.tomsguide.com/news/best-prime-day-deals-and-sales">Prime Day</a> sale is currently <a href="https://www.amazon.com/stores/Bose/page/9E24AFD5-B420-4859-BD2F-A993BA579B20?" target="_blank" rel="nofollow">slashing up to 47% off the popular devices</a>. </p><p>If you're in the market for a speaker to tote along to the pool or beach this summer, I recommend the<a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16?" target="_blank" rel="nofollow"> Bose SoundLink Flex (Gen 2) for just $119</a>. When it comes to headphones, you can't go wrong with the <a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0F2LCBKVN?" target="_blank" rel="nofollow">Bose QuietComfort Headphones for $229</a> — a discount of $130!</p><p>We don't know how long these rare Bose deals will last, so we recommending adding to cart ASAP. Keep scrolling to check out the rest of my favorite picks from the early Prime Day sale. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links </span></h3><ul><li><a href="https://www.amazon.com/stores/Bose/page/9E24AFD5-B420-4859-BD2F-A993BA579B20?" target="_blank" rel="nofollow"><strong>shop all Bose deals on Amazon</strong></a></li><li><strong>Bose SoundLink Micro: </strong><a href="https://www.amazon.com/dp/B0FDLD34V5" target="_blank" rel="nofollow"><strong>was $129 now $99</strong></a></li><li><strong>Bose SoundLink Flex (Gen 2): </strong><a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16?" target="_blank" rel="nofollow"><strong>was $149 now $119</strong></a></li><li><strong>Bose QuietComfort Bluetooth Earbud: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Lifestyle-Cancellation/dp/B0D8BZDPXB?" target="_blank" rel="nofollow"><strong>was $179 now $149</strong></a></li><li><strong>Bose QuietComfort Earbuds 2: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow"><strong>was $279 now $149</strong></a></li><li><strong>Bose Ultra Open Earbuds: </strong><a href="https://www.amazon.com/dp/B0CPFV77W4/" target="_blank" rel="nofollow"><strong>was $299 now $229</strong></a></li><li><strong>Bose QuietComfort Headphones: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0F2LCBKVN?" target="_blank" rel="nofollow"><strong>was $359 now $229</strong></a></li><li><strong>Bose QuietComfort Ultra Headphones: </strong><a href="https://www.amazon.com/dp/B0CCZ1L489?" target="_blank" rel="nofollow"><strong>was $449 now $329</strong></a></li></ul><h3 class="article-body__section" id="section-best-bose-deals"><span>Best Bose Deals</span></h3><div class="product"><a data-dimension112="86c2f2f7-8b67-49da-845f-0e9193d8a89c" data-action="Deal Block" data-label="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension48="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension25="$99" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0FDLD34V5?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1105px;"><p class="vanilla-image-block" style="padding-top:110.05%;"><img id="4S8VXWvZTpFMLYd8oiNBC7" name="Bose Micro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4S8VXWvZTpFMLYd8oiNBC7.jpg" mos="" align="middle" fullscreen="" width="1105" height="1216" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode.<a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0FDLD34V5?" target="_blank" rel="nofollow" data-dimension112="86c2f2f7-8b67-49da-845f-0e9193d8a89c" data-action="Deal Block" data-label="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension48="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$119" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1303px;"><p class="vanilla-image-block" style="padding-top:74.75%;"><img id="tHZL4rbqSQZndCkSEE5ijF" name="Bose Soundlink" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tHZL4rbqSQZndCkSEE5ijF.jpg" mos="" align="middle" fullscreen="" width="1303" height="974" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The new Bose SoundLink (2nd gen) is a compact and powerful Bluetooth speaker with a durable design. This 1.2-pound speaker is water and dust proof and delivered great sound quality in our <a href="https://www.tomsguide.com/audio/bose-soundlink-flex-2-review" target="_blank" data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$119">SoundLink Flex gen 2 review</a>. With 12 hours of battery life and $30 off, you have yourself a great deal.<a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16?" target="_blank" rel="nofollow" data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$119">View Deal</a></p></div><div class="product"><a data-dimension112="f6c79d67-92b5-4a2c-bf95-54f286d7794e" data-action="Deal Block" data-label="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $149." data-dimension48="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $149." data-dimension25="$149" href="https://www.amazon.com/Bose-New-QuietComfort-Earbuds-Black/dp/B0D8BZDPXB?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:95.43%;"><img id="tEtgPEcP9tofgugi8QdrcP" name="Bose quietcomfort" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tEtgPEcP9tofgugi8QdrcP.jpg" mos="" align="middle" fullscreen="" width="679" height="648" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $149.<a class="view-deal button" href="https://www.amazon.com/Bose-New-QuietComfort-Earbuds-Black/dp/B0D8BZDPXB?" target="_blank" rel="nofollow" data-dimension112="f6c79d67-92b5-4a2c-bf95-54f286d7794e" data-action="Deal Block" data-label="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $149." data-dimension48="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $149." data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$149" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:996px;"><p class="vanilla-image-block" style="padding-top:115.06%;"><img id="z2eEQ66QuaM6umZmg8fKoL" name="1715191898.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/z2eEQ66QuaM6umZmg8fKoL.jpg" mos="" align="middle" fullscreen="" width="996" height="1146" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Earbuds 2 take active noise cancellation to the next level. In our <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-earbuds-2" data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$149">Bose QuietComfort Earbuds 2 review</a>, we said these buds are a remarkable follow-up to their predecessors delivering better sound, call quality and unrivaled ANC. Sound balance and noise neutralization work extremely well and the battery life is up to 6 hours, with an extra 24 hours via the charging case.<a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow" data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$229" href="https://www.amazon.com/dp/B0CPFV77W4/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1268px;"><p class="vanilla-image-block" style="padding-top:62.38%;"><img id="qDBpkjESq4Z3UsvHc4vEeX" name="bose open earbuds" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qDBpkjESq4Z3UsvHc4vEeX.jpg" mos="" align="middle" fullscreen="" width="1268" height="791" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose Ultra Open perfected the open earbud formula. They have a comfortable, non-invasive fit, solid battery life, and they sound better than you might expect from open buds. They got <a href="https://www.tomsguide.com/audio/earbuds/bose-ultra-open-earbuds" data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$229">4 stars in our review</a>, where we loved their simple controls and surprising lack of sound leakage. <a class="view-deal button" href="https://www.amazon.com/dp/B0CPFV77W4/" target="_blank" rel="nofollow" data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$229">View Deal</a></p></div><div class="product"><a data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$229" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0F2LCBKVN?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:835px;"><p class="vanilla-image-block" style="padding-top:134.73%;"><img id="JyM73ExSxoY5g8VsqN7SZW" name="Bose Quietcomfort" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/JyM73ExSxoY5g8VsqN7SZW.jpg" mos="" align="middle" fullscreen="" width="835" height="1125" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>In our <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-headphones" data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$229">Bose QuietComfort Headphones review</a>, we said these are "excellent always-on noise-cancelers with enhanced sound and battery life." They're missing spatial audio mode and touch controls, but for $120 less, these are nearly perfect. <a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0F2LCBKVN?" target="_blank" rel="nofollow" data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$229">View Deal</a></p></div><div class="product"><a data-dimension112="21614f99-e07c-4c54-94d8-3bccf72b5cc5" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension25="$249" href="https://www.amazon.com/dp/B0F7M1JXVV?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:934px;"><p class="vanilla-image-block" style="padding-top:124.20%;"><img id="a9jV9Xm3AhpGwNWnqABVVP" name="Bose QuietComfort Ultra Earbuds gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/a9jV9Xm3AhpGwNWnqABVVP.png" mos="" align="middle" fullscreen="" width="934" height="1160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly.<a class="view-deal button" href="https://www.amazon.com/dp/B0F7M1JXVV?" target="_blank" rel="nofollow" data-dimension112="21614f99-e07c-4c54-94d8-3bccf72b5cc5" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="fb907c62-df7d-40d3-a715-df097ad0db6b" data-action="Deal Block" data-label="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension48="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension25="$179" href="https://www.amazon.com/dp/B08VL5S148/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:871px;"><p class="vanilla-image-block" style="padding-top:172.22%;"><img id="e6o2rGs8aAMyy3SPFHLwNK" name="SoundLink Revolve+" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/e6o2rGs8aAMyy3SPFHLwNK.png" mos="" align="middle" fullscreen="" width="871" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever.<a class="view-deal button" href="https://www.amazon.com/dp/B08VL5S148/" target="_blank" rel="nofollow" data-dimension112="fb907c62-df7d-40d3-a715-df097ad0db6b" data-action="Deal Block" data-label="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension48="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="c097b7bc-cc7a-4220-95f9-3407c8e22bd8" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension48="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension25="$329" href="https://www.amazon.com/dp/B0CCZ1L489?" 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:120.00%;"><img id="g64SDV3bmD2tcgopiiNgP6" name="Bose QuietComfort Ultra headphones Versus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g64SDV3bmD2tcgopiiNgP6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else.<a class="view-deal button" href="https://www.amazon.com/dp/B0CCZ1L489?" target="_blank" rel="nofollow" data-dimension112="c097b7bc-cc7a-4220-95f9-3407c8e22bd8" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension48="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension25="$329">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Watching the 2026 FIFA World Cup on your phone? I recommend these headphones to feel like you're actually at the games, starting at just $99 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/headphones/headphones-for-fifa-world-cup-2026</link>
                                                                            <description>
                            <![CDATA[ If you're catching up on highlights or watching the match in public, these are my top headphone picks for you. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">cZfxaVBE5eMTzkjWgJgfxZ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/eSCGe4SAPSngvN54YSgm7Y-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 01 Jun 2026 09:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/eSCGe4SAPSngvN54YSgm7Y-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose QuietComfort Ultra 2nd Gen, Marshall Milton ANC and Sony WH-1000XM6 headphones]]></media:description>                                                            <media:text><![CDATA[Bose QuietComfort Ultra 2nd Gen, Marshall Milton ANC and Sony WH-1000XM6 headphones]]></media:text>
                                <media:title type="plain"><![CDATA[Bose QuietComfort Ultra 2nd Gen, Marshall Milton ANC and Sony WH-1000XM6 headphones]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/eSCGe4SAPSngvN54YSgm7Y-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We've all been there. You're on a bus, train or other mode of public transportation, and you're consistently being disturbed by someone watching things on their phone — out loud, without using headphones or earbuds. When the <a href="https://www.tomsguide.com/entertainment/live/watch-world-cup-2026-free">2026 FIFA World Cup</a> starts in a couple of weeks, you'll see — hear, rather — people watching games out loud on their phones. Don't be that guy. No one likes that guy.</p><p>I, for one, know that I'll be using my phone to either catch up on games or watch them live, and there's an easy way to ensure you aren't disturbing anyone's peace, and that's by using a pair of the <a href="https://www.tomsguide.com/best-picks/best-over-ear-headphones">best headphones</a>. I test headphones day in and day out, so for your convenience, I've shortlisted my favorite cans — all of which will arrive well in time for the first  kick-off.</p><p>Whether you've got a budget of $100 or you're willing to spend nearly $500, there's a pair of headphones for everyone. The ones I've picked all feature highly effective ANC to make you feel immersed; clear vocals so that you can hear the commentary properly, and powerful bass so that you can feel the crowd rumbling and chanting in your chest.</p><h2 class="article-body__section" id="section-under-100"><span>Under $100</span></h2><div class="product"><a data-dimension112="f3c9989f-20d7-4df2-a33c-5c435468c3ed" data-action="Deal Block" data-label="Space Two" data-dimension48="Space Two" data-dimension25="$99" href="https://www.amazon.com/Soundcore-Cancelling-Headphones-Reduction-Comfortable/dp/B0C6KKQ7ND/" 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:120.00%;"><img id="JJByiZhukiUvSPjrhY8xY3" name="Anker Soundcore Space One" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/JJByiZhukiUvSPjrhY8xY3.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Though they have now been succeeded by the <a href="https://www.tomsguide.com/audio/headphones/soundcore-space-2-review" data-dimension112="f3c9989f-20d7-4df2-a33c-5c435468c3ed" data-action="Deal Block" data-label="Space Two" data-dimension48="Space Two" data-dimension25="$99">Space Two</a>, the OG <a href="https://www.tomsguide.com/reviews/anker-soundcore-space-one">Soundcore Space One</a> are an absolute bargain. Costing just $99, they're perfect for those looking for strong audio and ANC, as well as long battery life in a stylish package. Vocals especially sound crisp and invigorating, and even when the commentator yells "GOOOOOAL," rest assured that the high-pitch won't pierce your ears.<a class="view-deal button" href="https://www.amazon.com/Soundcore-Cancelling-Headphones-Reduction-Comfortable/dp/B0C6KKQ7ND/" target="_blank" rel="nofollow" data-dimension112="f3c9989f-20d7-4df2-a33c-5c435468c3ed" data-action="Deal Block" data-label="Space Two" data-dimension48="Space Two" data-dimension25="$99">View Deal</a></p></div><h2 class="article-body__section" id="section-under-200"><span>Under $200</span></h2><div class="product"><a data-dimension112="dbe23925-b9bc-4d50-b8dc-16b210ace5ba" data-action="Deal Block" data-label="JLab Epic Lux Lab Edition" data-dimension48="JLab Epic Lux Lab Edition" data-dimension25="$199" href="https://www.amazon.com/JLab-Epic-Wireless-Headphones-Graphite/dp/B0DRDNJNTD/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:943px;"><p class="vanilla-image-block" style="padding-top:159.07%;"><img id="naab9kQoe9jnyUz73sJU8J" name="Jlab-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/naab9kQoe9jnyUz73sJU8J.jpg" mos="" align="middle" fullscreen="" width="943" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Bass is the <a href="https://www.tomsguide.com/audio/over-ear-headphones/jlab-epic-lux-lab-edition-review" data-dimension112="dbe23925-b9bc-4d50-b8dc-16b210ace5ba" data-action="Deal Block" data-label="JLab Epic Lux Lab Edition" data-dimension48="JLab Epic Lux Lab Edition" data-dimension25="$199">JLab Epic Lux Lab Edition</a>'s speciality, so you can thoroughly enjoy the deep rumbling of the stadium and the emotion in the commentators' voices. Plenty of detail in vocals and especially in the mid-range brings commentary and stadium atmosphere to life.<a class="view-deal button" href="https://www.amazon.com/JLab-Epic-Wireless-Headphones-Graphite/dp/B0DRDNJNTD/" target="_blank" rel="nofollow" data-dimension112="dbe23925-b9bc-4d50-b8dc-16b210ace5ba" data-action="Deal Block" data-label="JLab Epic Lux Lab Edition" data-dimension48="JLab Epic Lux Lab Edition" data-dimension25="$199">View Deal</a></p></div><h2 class="article-body__section" id="section-under-300"><span>Under $300</span></h2><div class="product"><a data-dimension112="d91824b8-98ea-4b27-a032-54a6d74482cb" data-action="Deal Block" data-label="Marshall Monitor III" data-dimension48="Marshall Monitor III" data-dimension25="$248" href="https://www.amazon.com/Marshall-Canceling-Over-Ear-Bluetooth-Headphones/dp/B0DFDT1TWC/" 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:120.00%;"><img id="aQySZAydrEzPDCrumqsYBR" name="Marshall Monitor III" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/aQySZAydrEzPDCrumqsYBR.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you want long-lasting headphones, few (if any) are better than the <a href="https://www.tomsguide.com/audio/headphones/marshall-monitor-iii-review" data-dimension112="d91824b8-98ea-4b27-a032-54a6d74482cb" data-action="Deal Block" data-label="Marshall Monitor III" data-dimension48="Marshall Monitor III" data-dimension25="$248">Marshall Monitor III</a>. With up to 70 hours of battery life with ANC and 100 hours without, you can stream multiple games, highlights, fan compilations, and everything in between for days without recharging. And of course, you can still enjoy powerful ANC and immersive sound.<a class="view-deal button" href="https://www.amazon.com/Marshall-Canceling-Over-Ear-Bluetooth-Headphones/dp/B0DFDT1TWC/" target="_blank" rel="nofollow" data-dimension112="d91824b8-98ea-4b27-a032-54a6d74482cb" data-action="Deal Block" data-label="Marshall Monitor III" data-dimension48="Marshall Monitor III" data-dimension25="$248">View Deal</a></p></div><div class="product"><a data-dimension112="c3e21a03-fdc6-4de4-a225-4c0e661d4707" data-action="Deal Block" data-label="Marshall Milton ANC" data-dimension48="Marshall Milton ANC" data-dimension25="$249" href="https://www.amazon.com/Marshall-Wireless-Headphones-Adaptive-Cancelling/dp/B0GLSPPZJ4/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3915px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="W7JiRjcJKxDsmnvxb5hcBR" name="Marshall-Milton-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/W7JiRjcJKxDsmnvxb5hcBR.jpg" mos="" align="middle" fullscreen="" width="3915" height="3915" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you aren't opposed to on-ear cans, the <a href="https://www.tomsguide.com/audio/headphones/marshall-milton-anc-review" data-dimension112="c3e21a03-fdc6-4de4-a225-4c0e661d4707" data-action="Deal Block" data-label="Marshall Milton ANC" data-dimension48="Marshall Milton ANC" data-dimension25="$249">Marshall Milton ANC</a> are an outstanding choice. One of their biggest selling points is Soundstage spatial audio which moves the sound into a virtual room (whose size can be customized) and makes you feel like you're at the heart of the action. Even if you didn't get tickets to the games, you can (sort of) recreate that feeling.<a class="view-deal button" href="https://www.amazon.com/Marshall-Wireless-Headphones-Adaptive-Cancelling/dp/B0GLSPPZJ4/" target="_blank" rel="nofollow" data-dimension112="c3e21a03-fdc6-4de4-a225-4c0e661d4707" data-action="Deal Block" data-label="Marshall Milton ANC" data-dimension48="Marshall Milton ANC" data-dimension25="$249">View Deal</a></p></div><h2 class="article-body__section" id="section-under-400"><span>Under $400</span></h2><div class="product"><a data-dimension112="3b36dc6f-e11f-4047-995c-71f92f167de7" data-action="Deal Block" data-label="Sony WH-1000XM6" data-dimension48="Sony WH-1000XM6" data-dimension25="$398" href="https://www.amazon.com/Sony-WH-1000XM6-Headphones-Microphones-Studio-Quality/dp/B0F3PQHWTZ/" 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:120.00%;"><img id="x3hpHUb8bPXUJsBkoevKDN" name="Sony WH-1000XM6" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/x3hpHUb8bPXUJsBkoevKDN.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/over-ear-headphones/sony-wh-1000xm6-review" data-dimension112="3b36dc6f-e11f-4047-995c-71f92f167de7" data-action="Deal Block" data-label="Sony WH-1000XM6" data-dimension48="Sony WH-1000XM6" data-dimension25="$398">Sony WH-1000XM6</a> feature excellent noise cancellation — though not as good as Bose's, it's still solid, and they'll help keep your immersion intact. These cans are second to none when it comes to vocal clarity, so you can enjoy every small detail in the commentators' and crowd's voices. You might be able to understand what a mic-less player has shouted across the pitch, too.<a class="view-deal button" href="https://www.amazon.com/Sony-WH-1000XM6-Headphones-Microphones-Studio-Quality/dp/B0F3PQHWTZ/" target="_blank" rel="nofollow" data-dimension112="3b36dc6f-e11f-4047-995c-71f92f167de7" data-action="Deal Block" data-label="Sony WH-1000XM6" data-dimension48="Sony WH-1000XM6" data-dimension25="$398">View Deal</a></p></div><h2 class="article-body__section" id="section-under-500"><span>Under $500</span></h2><div class="product"><a data-dimension112="49ebaa2a-14c6-4b1d-ac15-b84897392201" data-action="Deal Block" data-label="Bose QuietComfort Ultra Gen 2" data-dimension48="Bose QuietComfort Ultra Gen 2" data-dimension25="$449" href="https://www.amazon.com/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G/" 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="iPfpWwrQeGYvMmxuZPCecS" name="Bose QC Ultra gen 2 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/iPfpWwrQeGYvMmxuZPCecS.jpg" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>No one does ANC better than Bose, and the <a href="https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review" data-dimension112="49ebaa2a-14c6-4b1d-ac15-b84897392201" data-action="Deal Block" data-label="Bose QuietComfort Ultra Gen 2" data-dimension48="Bose QuietComfort Ultra Gen 2" data-dimension25="$449">Bose QuietComfort Ultra Gen 2</a> are the perfect headphones for immersive listening as you can't hear the outside world. Rich spatial audio further bolsters your immersion, and the powerful bass amplifies every chant and commentary moment. The comfortable fit makes the QC Ultra Gen 2 perfect for extended or back-to-back games.<a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G/" target="_blank" rel="nofollow" data-dimension112="49ebaa2a-14c6-4b1d-ac15-b84897392201" data-action="Deal Block" data-label="Bose QuietComfort Ultra Gen 2" data-dimension48="Bose QuietComfort Ultra Gen 2" data-dimension25="$449">View Deal</a></p></div><h2 class="article-body__section" id="section-under-600"><span>Under $600</span></h2><div class="product"><a data-dimension112="a06d5552-ecb5-4f71-9cba-8a24385be1ab" data-action="Deal Block" data-label="Apple AirPods Max 2" data-dimension48="Apple AirPods Max 2" data-dimension25="$509" href="https://www.amazon.com/Apple-Headphones-Cancellation-Personalized-Translation/dp/B0GSS4SGZR/" 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="TSi2XMUrFhYn5nqrGBsd59" name="airpods max 2 deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/TSi2XMUrFhYn5nqrGBsd59.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/headphones/apple-airpods-max-2-review" data-dimension112="a06d5552-ecb5-4f71-9cba-8a24385be1ab" data-action="Deal Block" data-label="Apple AirPods Max 2" data-dimension48="Apple AirPods Max 2" data-dimension25="$509">Apple AirPods Max 2</a> make listening to music and watching a game extremely fun, thanks to their energetic sound profile. With personalized spatial audio and incredible ANC, the headphones capture and reproduce the energy of the stadium. If you're already deep into Apple's ecosystem, it makes sense to get the AirPods Max 2 for seamless swapping between devices.<a class="view-deal button" href="https://www.amazon.com/Apple-Headphones-Cancellation-Personalized-Translation/dp/B0GSS4SGZR/" target="_blank" rel="nofollow" data-dimension112="a06d5552-ecb5-4f71-9cba-8a24385be1ab" data-action="Deal Block" data-label="Apple AirPods Max 2" data-dimension48="Apple AirPods Max 2" data-dimension25="$509">View Deal</a></p></div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Ww1noX"></div>                            </div>                            <script src="https://kwizly.com/embed/Ww1noX.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/over-ear-headphones/the-apple-airpods-max-2-are-actually-great-headphones">I thought the Apple AirPods Max 2 were way overhyped — but I finally tried them and they're some of the best headphones I've ever used</a></li><li><a href="https://www.tomsguide.com/audio/headphones/marshall-milton-anc-review">I've been testing the new Marshall Milton ANC for 3 weeks — they fix my biggest gripe with on-ear headphones, and are the new gold standard</a></li><li><a href="https://www.tomsguide.com/audio/headphones/my-doctor-banned-me-from-earbuds-so-i-got-these-marshall-headphones-instead-and-im-surprised-i-didnt-do-it-sooner">My doctor banned me from earbuds so I got these Marshall headphones instead — and I’m surprised I didn’t do it sooner</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’m ditching my over-ear headphones for these Sony earbuds to beat the heat this summer — and they offer Bose-like sound for a lot less ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/earbuds/im-ditching-my-over-ear-headphones-for-these-sony-in-ear-buds-to-beat-the-heat-this-summer-and-they-offer-bose-like-sound-for-a-lot-less</link>
                                                                            <description>
                            <![CDATA[ Over-ear headphones are my go-to but they make my ears too hot in the summer. The solution? A pair of fantastic in-ear buds that sound like Bose but for less! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ccC8moiwRhLN5oHa9ShG94</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jVTB8KoGy6KygtEaHNqpE3-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 23 May 2026 05:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Earbuds]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Headphones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/jVTB8KoGy6KygtEaHNqpE3-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Sony WF-C710N in-ear buds]]></media:description>                                                            <media:text><![CDATA[Sony WF-C710N in-ear buds]]></media:text>
                                <media:title type="plain"><![CDATA[Sony WF-C710N in-ear buds]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jVTB8KoGy6KygtEaHNqpE3-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Over a year ago, <a href="https://www.tomsguide.com/audio/headphones/my-doctor-banned-me-from-earbuds-so-i-got-these-marshall-headphones-instead-and-im-surprised-i-didnt-do-it-sooner">I ditched in-ear buds for over-ear headphones</a> and didn't look back. You'll usually find me with my trusty <a href="https://www.tomsguide.com/audio/headphones/marshall-monitor-iii-review">Marshall Monitor III</a> headphones around my neck, or sitting atop my head while I jam to my favorite tunes. While I love my headphones, I'm no stranger to itchy ears from sweating, and due to the very nature of over-ear cans, they can be tricky to wear for long periods of time during the summer.</p><p>The solution is a simple one, of course: get a pair of in-ear buds. In-ear buds don't sit <em>around </em>your ears, like over-ear headphones do, so they don't feel suffocating during the year's hottest months. And you don't need to spend big bucks to get a decent pair — which is why I'm opting for the <a href="https://www.tomsguide.com/audio/earbuds/sony-wf-c710n-wireless-earbuds-review">Sony WF-C710N</a>.</p><div class="product"><a data-dimension112="96beb371-5880-4f00-b3a1-d1fb7fc50e85" data-action="Deal Block" data-label="The Sony WF-C710Ns build on the success of the WF-C700Ns, introducing touch controls, wear detection and new, stylish colors. The earbuds make basslines sound powerful and vocals sound clear, and a user-friendly app lets you customize the EQ to your heart’s content. Oh, and the ANC is extremely effective too — comparable to Bose but for a lot less money." data-dimension48="The Sony WF-C710Ns build on the success of the WF-C700Ns, introducing touch controls, wear detection and new, stylish colors. The earbuds make basslines sound powerful and vocals sound clear, and a user-friendly app lets you customize the EQ to your heart’s content. Oh, and the ANC is extremely effective too — comparable to Bose but for a lot less money." data-dimension25="$129" href="https://www.amazon.com/Sony-WF-C710N-Wireless-Noise-Canceling-Lightweight/dp/B0DWHB886R/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:970px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="ztmFvnegXZhqSbG5gSMaDD" name="Sony WF-C710N.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ztmFvnegXZhqSbG5gSMaDD.jpg" mos="" align="middle" fullscreen="" width="970" height="546" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Sony WF-C710Ns build on the success of the WF-C700Ns, introducing touch controls, wear detection and new, stylish colors. The earbuds make basslines sound powerful and vocals sound clear, and a user-friendly app lets you customize the EQ to your heart’s content. Oh, and the ANC is extremely effective too — comparable to Bose but for a lot less money.<a class="view-deal button" href="https://www.amazon.com/Sony-WF-C710N-Wireless-Noise-Canceling-Lightweight/dp/B0DWHB886R/" target="_blank" rel="nofollow" data-dimension112="96beb371-5880-4f00-b3a1-d1fb7fc50e85" data-action="Deal Block" data-label="The Sony WF-C710Ns build on the success of the WF-C700Ns, introducing touch controls, wear detection and new, stylish colors. The earbuds make basslines sound powerful and vocals sound clear, and a user-friendly app lets you customize the EQ to your heart’s content. Oh, and the ANC is extremely effective too — comparable to Bose but for a lot less money." data-dimension48="The Sony WF-C710Ns build on the success of the WF-C700Ns, introducing touch controls, wear detection and new, stylish colors. The earbuds make basslines sound powerful and vocals sound clear, and a user-friendly app lets you customize the EQ to your heart’s content. Oh, and the ANC is extremely effective too — comparable to Bose but for a lot less money." data-dimension25="$129">View Deal</a></p></div><p>I tested the WF-C710N back in April 2025, and to date, they remain some of the <a href="https://www.tomsguide.com/us/best-wireless-earbuds,review-6160.html">best wireless earbuds</a> I've ever tested. They're lightweight and ridiculously comfortable, and their see-through Glass Blue design is nothing short of delicious. Meaty bass, crisp treble, refined mids, and with highly effective ANC — these earbuds have got it all. And the best part? They're $170 cheaper than the <a href="https://www.tomsguide.com/audio/earbuds/bose-quietcomfort-ultra-earbuds-2-review">Bose QuietComfort Ultra Gen 2</a>. It's time to <a href="https://www.tomsguide.com/uk/savings-squad">upgrade your life for less</a> with the WF-C710N.</p><h2 id="like-you-aren-t-even-wearing-them">Like you aren't even wearing them</h2><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="WhjNQgYhrzmxFPh73WYTeb" name="Sony_WF_C710N_ 5.JPG" alt="A pair of Glass Blue Sony WF-C710N wireless earbuds." src="https://cdn.mos.cms.futurecdn.net/WhjNQgYhrzmxFPh73WYTeb.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>Having tested and used many earbuds in my time, I believe that the true hallmark of a good pair is when you don't even realize they're in your ears. I should be able to go about my day without feeling earbuds digging into my ear canal. By that standard, then, the Sony WF-C710N are simply excellent.</p><p>Each earbud weighs just 0.18oz which is practically nothing. In my ears, they fit snugly and never once have they fallen out, even when I've been walking briskly or headbanging. There have been times where I've forgotten that the WF-C710N are in my ears, and that says everything you need to know about their comfort level.</p><p>In addition to that, the WF-C710N are sure to turn heads because they look stunning. Available in white, black and blue, I'd personally recommend the third option. You can see the wires and hardware on the see-through Glass Blue model, and this sets the earbuds apart from any others on the market right now.</p><h2 id="they-sound-amazing">They sound amazing</h2><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="pPxCiV8PgTrFYW9jHpYkYb" name="Sony_WF_C710N_ 7.JPG" alt="A pair of Glass Blue Sony WF-C710N wireless earbuds." src="https://cdn.mos.cms.futurecdn.net/pPxCiV8PgTrFYW9jHpYkYb.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 never recommend a pair of earbuds unless they sounded downright fantastic — yes, even if it's very comfortable and good-looking. The Sony WF-C710N have that covered, with their 5mm drivers delivering powerful bass and vibrant treble. Thanks to Sony's trademarked Digital Sound Enhancement Engine technology, sound is reproduced as close to the original recording as possible.</p><p>Through the WF-C710N, the distorted bass in 070 Shake's '<a href="https://open.spotify.com/track/4MH3D8angFt2z5B8yO3xnG?si=d3124f7427c24be1" target="_blank" rel="nofollow">Elephant</a>' and the reverberating bassline in Twenty One Pilots' '<a href="https://open.spotify.com/track/2OdfQjIJlomZFUBTEDKMre?si=01db031d2b594591" target="_blank" rel="nofollow">No Chances</a>' sound fantastic. It's powerful enough that you can you feel the music in your skull but not so booming that it overpowers the rest of the soundstage.</p><p>Treble is crisp but not overzealous, so you can clearly hear the high-pitched coins in Pink Floyd's '<a href="https://open.spotify.com/track/0vFOzaXqZHahrZp6enQwQb?si=fdeb27a68dbc4137" target="_blank" rel="nofollow">Money</a>' but that sound doesn't pierce through the soundscape or undermines the other instruments.</p><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="63NPVoRigVtMbYzNCmD6fb" name="Sony_WF_C710N_ 9.JPG" alt="A pair of Glass Blue Sony WF-C710N wireless earbuds." src="https://cdn.mos.cms.futurecdn.net/63NPVoRigVtMbYzNCmD6fb.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>For a pair of in-ear buds, the WF-C710N provide an excellent, immersive listening experience. Combine that with the highly effective ANC that goes toe-to-toe with Bose, and you've got a winning formula. The ANC is so good that you can't hear the kettle boiling or the TV indoors, and the noise of a bus rattling while you're traveling is also muted. You're getting bang for your buck here.</p><p>In the summer, you need a pair of earbuds that enable your ears to breathe — and while headphones are great, they clamp down on your earlobes, leading to some discomfort, especially during heatwaves. Conversely, when it gets colder, over-ear cans are a great choice, because they can double as earmuffs and provide some warmth to your ears when temperatures drop.</p><p>What do you think? Do you swap between over-ear headphones (or on-ears) and in-ear buds depending on the weather? I'd love to hear from you in the comments below!</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-egZ2pX"></div>                            </div>                            <script src="https://kwizly.com/embed/egZ2pX.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/earbuds/sony-wf-c710n-wireless-earbuds-review">Sony WF-C710N review</a></li><li><a href="https://www.tomsguide.com/audio/headphones/bose-quietcomfort-ultra-2nd-gen-marshall-milton-anc-which-should-you-buy">Do you need to spend $449 on the Bose QuietComfort Ultra 2nd Gen when you can get the new Marshall Milton ANC for $229? I tested both and I’m very surprised</a></li><li><a href="https://www.tomsguide.com/audio/headphones/not-all-on-ear-headphones-are-uncomfortable-ive-been-using-the-new-marshall-milton-anc-for-3-weeks-and-theyre-ridiculously-comfortable-and-offer-outstanding-sound-too">Not all on-ear headphones are uncomfortable: I’ve been using the new Marshall Milton ANC for 3 weeks and they’re ridiculously comfortable and offer outstanding sound too</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Do you need to spend $449 on the Bose QuietComfort Ultra 2nd Gen when you can get the new Marshall Milton ANC for $229? I tested both and I’m very surprised ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/headphones/bose-quietcomfort-ultra-2nd-gen-marshall-milton-anc-which-should-you-buy</link>
                                                                            <description>
                            <![CDATA[ The Bose QuietComfort Ultra 2nd Gen are undoubtedly the king of ANC headphones, but do the cheaper Marshall Milton ANC come close for less money? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">WepYQAkcZcGjaCsipgXQXW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EEaMNimgRGvGbLjNEMXtZj-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 21 May 2026 06:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/EEaMNimgRGvGbLjNEMXtZj-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Marshall Milton ANC and Bose QuietComfort Ultra 2nd Gen headphones]]></media:description>                                                            <media:text><![CDATA[Marshall Milton ANC and Bose QuietComfort Ultra 2nd Gen headphones]]></media:text>
                                <media:title type="plain"><![CDATA[Marshall Milton ANC and Bose QuietComfort Ultra 2nd Gen headphones]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EEaMNimgRGvGbLjNEMXtZj-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It's no secret that Bose is the unbeaten king of <a href="https://www.tomsguide.com/us/best-noise-cancelling-headphones,review-5566.html">noise-canceling headphones</a>. The <a href="https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review">Bose QuietComfort Ultra 2nd Gen</a> are incredible, boasting a plethora of outstanding features, including best-in-class ANC, supreme comfort levels, and great battery life. But it's also no secret that these headphones are <em>very </em>expensive, priced at <a href="https://www.amazon.com/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKQ2FG6/" target="_blank" rel="nofollow">$449</a> / <a href="https://www.amazon.co.uk/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G/" target="_blank" rel="nofollow">£449</a>, and not everyone can afford them.</p><p>But just because you're on a budget doesn't mean you can't have nice things — and British manufacturer Marshall has just shaken up the ANC scene with its brand new <a href="https://www.tomsguide.com/audio/headphones/marshall-milton-anc-review">Marshall Milton ANC</a> on-ear cans. I know what you'll say to that: a) they're on-ears and not over-ears like the QuietComfort Ultra, and b) how can any brand even conceivably think of dethroning Bose as the ANC king?</p><div class="product"><a data-dimension112="c32c1e3d-16f8-40ee-9129-c8b8b10d29ff" data-action="Deal Block" data-label="The Marshall Milton ANC set a new gold standard for on-ear headphones. Featuring spacious and soft memory foam ear cushions, the Milton ANC are extremely comfortable for all-day wear. They look beautiful as they borrow design cues from the Marshall Monitor III, and they bridge the gap between the brand’s flagship over-ears and the Major V on-ears." data-dimension48="The Marshall Milton ANC set a new gold standard for on-ear headphones. Featuring spacious and soft memory foam ear cushions, the Milton ANC are extremely comfortable for all-day wear. They look beautiful as they borrow design cues from the Marshall Monitor III, and they bridge the gap between the brand’s flagship over-ears and the Major V on-ears." data-dimension25="$229" href="https://www.marshall.com/gb/en/product/milton-anc" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3915px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="W7JiRjcJKxDsmnvxb5hcBR" name="Marshall-Milton-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/W7JiRjcJKxDsmnvxb5hcBR.jpg" mos="" align="middle" fullscreen="" width="3915" height="3915" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Marshall Milton ANC set a new gold standard for on-ear headphones. Featuring spacious and soft memory foam ear cushions, the Milton ANC are extremely comfortable for all-day wear. They look beautiful as they borrow design cues from the Marshall Monitor III, and they bridge the gap between the brand’s flagship over-ears and the Major V on-ears.<a class="view-deal button" href="https://www.marshall.com/gb/en/product/milton-anc" target="_blank" rel="nofollow" data-dimension112="c32c1e3d-16f8-40ee-9129-c8b8b10d29ff" data-action="Deal Block" data-label="The Marshall Milton ANC set a new gold standard for on-ear headphones. Featuring spacious and soft memory foam ear cushions, the Milton ANC are extremely comfortable for all-day wear. They look beautiful as they borrow design cues from the Marshall Monitor III, and they bridge the gap between the brand’s flagship over-ears and the Major V on-ears." data-dimension48="The Marshall Milton ANC set a new gold standard for on-ear headphones. Featuring spacious and soft memory foam ear cushions, the Milton ANC are extremely comfortable for all-day wear. They look beautiful as they borrow design cues from the Marshall Monitor III, and they bridge the gap between the brand’s flagship over-ears and the Major V on-ears." data-dimension25="$229">View Deal</a></p></div><p>To that, I have a few retorts: a) they're on-ears but they're <em>great </em>on-ears, b) the Milton ANC weren't created to dethrone Bose, and a bonus c) they're <em>half the price </em>of the QuietComfort Ultra and for <a href="https://www.marshall.com/gb/en/product/milton-anc" target="_blank" rel="nofollow">$229 / £179</a>, they're simply fantastic. I've been testing the Milton ANC for three weeks and I've been using the QuietComfort Ultra 2nd Gen for a week. If you can't afford Bose's offering, Marshall's offers bang for your buck. Here's why.</p><p>Hi, Nikita here! This isn't going to be a traditional face-off like the others you may have seen on Tom's Guide, such as my <a href="https://www.tomsguide.com/audio/headphones/marshall-milton-anc-vs-marshall-monitor-iii-winner">Marshall Milton ANC vs Monitor III.</a> It would be unfair to make direct comparisons between the Bose QuietComfort Ultra 2nd Gen and the Milton ANC as both vastly differ when it comes to price, so it would be crown just one a winner. Think of this article as more of buying advice instead.</p><h2 id="a-few-tricks-up-marshall-s-sleeve">A few tricks up Marshall's sleeve</h2><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="Mb8EpD8Sj6Sy34JCqvZ8P8" name="Bose_03.JPG" alt="the bose quietcomfort ultra gen 2 headphones in black photographed on a blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/Mb8EpD8Sj6Sy34JCqvZ8P8.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 Bose QuietComfort Ultra 2nd Gen are excellent, but one of the areas they struggle in is battery life. The OG Ultra offered just 24 hours of playback time, but their successor kicks it up a notch to 30 hours... but that's still not class-leading. Meanwhile, one of the things Marshall has historically nailed with its consumer-first headphones (like the <a href="https://www.tomsguide.com/audio/headphones/marshall-monitor-iii-review">Monitor III</a>) is battery life — and the Milton ANC are no different.</p><p>Offering 50 hours of battery life with ANC on and 80 hours with ANC off, the Milton ANC blow the QuietComfort Ultra 2nd Gen out of the water. It's not even close, really. Sure, you get better ANC with the latter, but if it's more juice you're after, the Milton ANC are worth the trade-off.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PSS6RTgyfKqrL4N7NwbFsf" name="EmptyName 8.JPG" alt="Marshall Milton ANC on-ear headphones" src="https://cdn.mos.cms.futurecdn.net/PSS6RTgyfKqrL4N7NwbFsf.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>But it isn't a massive trade-off either, which brings me to the Milton ANC's key selling point: these are Marshall's first-ever on-ear cans to feature ANC, and they've knocked it out of the park. I've tested a few on-ear headphones now, and the Milton ANC offer the most effective noise cancellation of them all.</p><p>Sounds indoors, like the kettle boiling or the clickity clackity of <a href="https://www.tomsguide.com/best-picks/best-mechanical-keyboards">mechanical keyboards</a>, are muted to ensure you feel immersed in your music. Outdoors, the ANC is alright — the sound of cars zooming past makes it through but it isn't too jarring.</p><p>I won't lie: using the QuietComfort Ultra 2nd Gen outdoors blew me away as I couldn't hear anything, and they made me feel like I was in a room so quiet I could hear a pin drop. But I wouldn't hear that pin drop because the headphones would cancel out the noise. The Milton ANC can't compete with that, and they don't need to. For half the price of the QuietComfort Ultra 2nd Gen, you're still getting pretty solid ANC, and the best on-ears have to offer at the time of writing.</p><h2 id="take-control">Take control</h2><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="S4AtKKTKEMpjASJTwp4LQ8" name="Bose_01.JPG" alt="the bose quietcomfort ultra gen 2 headphones in black photographed on a blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/S4AtKKTKEMpjASJTwp4LQ8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I've spent a fair bit of time using the Bose QuietComfort Ultra 2nd Gen. I've found them extremely comfortable, and the plush ear cushions make my ears feel like they're resting on clouds. The design, though unchanged from the OG headphones, is pretty enough to look at, but the thing that bothers me most? The controls.</p><p>This might be a hot take but I think we need to get rid of touch controls on all headphones. They work fine on earbuds — the ones I've tested, at least — but I've never been a fan of them on headphones. The QuietComfort Ultra 2nd Gen's touch slider to adjust the volume sticks out like a sore thumb, and I've found its placement frustrating and ability to register my commands finicky, at best.</p><p>Turns out, I'm not the only one here at Tom's Guide who has struggled with the touch controls on the QuietComfort Ultra 2nd Gen. Our Buying Guide Editor, Tammy, mentioned them in <a href="https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review#section-bose-quietcomfort-ultra-headphones-2nd-generation-review-controls">her review of the headphones</a>, and Senior Reviews Writer, Erin, easily <a href="https://www.tomsguide.com/audio/headphones/apple-airpods-max-2-vs-bose-quietcomfort-ultra#section-airpods-max-2-vs-bose-quietcomfort-ultra-design">gave the win to the AirPods Max 2</a> when it came to the two headphones' controls.</p><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="RtDDPKWnsVeujiX4d7Nedf" name="EmptyName 4.JPG" alt="Marshall Milton ANC on-ear headphones" src="https://cdn.mos.cms.futurecdn.net/RtDDPKWnsVeujiX4d7Nedf.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>So, what's better than a strange mix of physical and touch controls that leaves users frustrated? Full physical controls, just like on the Marshall Milton ANC. There are two buttons that control everything on the Milton ANC: a joystick-like power button that can be used to adjust volume and change tracks, and a customizable 'M' button that can be personalized to enable Spatial Audio, change EQ, or enable/disable ANC.</p><p>And simplicity <em>works. </em>The controls are easy to understand and don't give you much to complain about. Not to mention, that brass power button looks drool-worthy. The Milton ANC's design, in general, looks classier and more premium than the QuietComfort Ultra 2nd Gen, but that's just my opinion.</p><h2 id="music-to-my-ears">Music to my ears</h2><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="ywSYdLpMydbabofD2ALBuf" name="EmptyName 9.JPG" alt="Marshall Milton ANC on-ear headphones" src="https://cdn.mos.cms.futurecdn.net/ywSYdLpMydbabofD2ALBuf.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>What surprised me most about using the Bose QuietComfort Ultra 2nd Gen and the Marshall Milton ANC to listen to music back-to-back was how similar their tuning is. Both headphones offer deep, rich, bass-first sound profiles, which may not be everyone's cup of tea — and if they aren't, both headphones come with user-friendly apps to customize the EQ.</p><p>Personally, I love bass-first tuning because that's the aspect of the soundstage I enjoy the most, so both the Milton ANC and the QuietComfort Ultra 2nd Gen impressed me straight out of the box. 'Let It Happen' by Tame Impala sounds glorious through both pairs, but when it comes to spatial audio, I think the Milton ANC's Soundstage creates more of an immersive listening experience. The QuietComfort Ultra 2nd Gen's spatial audio is good but it does so at the cost of bass which sounds muted. The Milton ANC's, on the other hand, keeps the bass thumping while making the track sound wider.</p><p>'FA9LA' by Flipperachi sounds excellent through both headphones too, with great emphasis on the pounding bass without making the treble sound too shrill or piercing. Vocals? Crystal clear, with each word discernible and not bleeding into the next.</p><p>One of the biggest advantages of using the QuietComfort Ultra 2nd Gen is that because the ANC is mindblowing, it makes you feel truly immersed in your music. The ANC on the Milton ANC is good, like I said earlier, but doesn't come close, and that has an impact on your listening experience. Swings and roundabouts.</p><h2 id="looking-ahead">Looking ahead...</h2><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="4EPKpctyHybciLiiVM9xLU" name="EmptyName 12.JPG" alt="Marshall Milton ANC and Bose QuietComfort Ultra Headphones 2nd Gen" src="https://cdn.mos.cms.futurecdn.net/4EPKpctyHybciLiiVM9xLU.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>So, should you buy the Marshall Milton ANC or the Bose QuietComfort Ultra 2nd Gen? I wish I could say that there's a straightforward "yes" or "no" to that question but there isn't. Question is, how much are you willing to spend? If you've got a budget of over $450, money is no object, or you want to get peerless ANC, the QuietComfort Ultra 2nd Gen are a no-brainer.</p><p>But if you can't loosen the purse strings to that extent, the Milton ANC are great value for money. They cost $229, so almost half the price of the QuietComfort Ultra 2nd Gen, but they don't compromise on features that matter most to 90% of users. Here at Tom's Guide, our job is to help you <a href="https://www.tomsguide.com/uk/savings-squad">upgrade your life for less</a>, and when it comes to getting premium features and audio at a non-premium price, you can't go wrong with the Milton ANC.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ONVbVO"></div>                            </div>                            <script src="https://kwizly.com/embed/ONVbVO.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/headphones/not-all-on-ear-headphones-are-uncomfortable-ive-been-using-the-new-marshall-milton-anc-for-3-weeks-and-theyre-ridiculously-comfortable-and-offer-outstanding-sound-too">Not all on-ear headphones are uncomfortable: I’ve been using the new Marshall Milton ANC for 3 weeks and they’re ridiculously comfortable and offer outstanding sound too</a></li><li><a href="https://www.tomsguide.com/audio/headphones/marshall-milton-anc-vs-marshall-monitor-iii-winner">I’ve been testing the Marshall Milton ANC on-ears vs Marshall Monitor III over-ears — and it’s closer than you think</a></li><li><a href="https://www.tomsguide.com/audio/headphones/marshall-milton-anc-review">I've been testing the new Marshall Milton ANC for 3 weeks — they fix my biggest gripe with on-ear headphones, and are the new gold standard</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I found 11 Bose deals on Amazon that are actually worth your money — up to 47% off now ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/i-found-9-bose-deals-on-amazon-that-are-actually-worth-your-money-up-to-47-percent-off-now</link>
                                                                            <description>
                            <![CDATA[ Amazon is knocking up to 47% off Bose speakers and headphones. Check out my favorite picks from the sale. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">SMVJ7N8WKKL8bidqiuDZjA</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/B5XvHVAkvArsDunVyieL2S-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 18 May 2026 18:49:38 +0000</pubDate>                                                                                                                                <updated>Tue, 19 May 2026 09:34:24 +0000</updated>
                                                                                                                                            <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Olivia Halevy ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/YAg7Fmh9dGKbg3hULBMWiU.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Olivia is a Deals Writer at Tom’s Guide. She loves all things lifestyle, shopping and sourcing the best deals from some of the top brands, retailers and websites around. From fashion and beauty to smart home and tech, she has an eye for finding practical, stylish, and reasonably-priced items that help make life simpler (and a little more aesthetically-pleasing).&amp;nbsp;Olivia has over five years of experience writing lifestyle, commerce, and branded content for &lt;a href=&quot;http://patch.com/&quot;&gt;Patch.com&lt;/a&gt;. She&#039;s covered major shopping holidays like Amazon Prime Day, Black Friday and Cyber Monday. In her free time, she enjoys trying out new exercise classes, binge-watching the latest viral TV shows, cooking, spending time with family and taking long walks with her dog, Gus.&amp;nbsp;&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/B5XvHVAkvArsDunVyieL2S-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon / edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose]]></media:description>                                                            <media:text><![CDATA[Bose]]></media:text>
                                <media:title type="plain"><![CDATA[Bose]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/B5XvHVAkvArsDunVyieL2S-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Hoping to score some new audio devices for summer? Look no further than Bose — the popular brand that makes some of the <a href="https://www.tomsguide.com/us/best-headphones,review-1988.html">best headphones</a> and <a href="https://www.tomsguide.com/best-picks/best-waterproof-speakers">best waterproof Bluetooth speakers</a> on the market. </p><p>In fact, <a href="https://www.amazon.com/stores/page/68814C03-4893-44A2-B1D9-F1699DA20F70" target="_blank" rel="nofollow">Bose is hosting a sale on Amazon with up to 47% off</a>. If you're in the market for a speaker, I recommend <a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0D6WB7BV6" target="_blank" rel="nofollow">the Bose SoundLink Flex (Gen 2) for just $135</a>. When it comes to headphones, you can't go wrong with the <a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" target="_blank" rel="nofollow">Bose QuietComfort Headphones for $229</a>, which are $120 off. </p><p>We don't know how long these rare Bose deals will last, so we recommending adding to cart ASAP. Keep scrolling to check out the rest of my favorite picks from the sale. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links </span></h3><ul><li><a href="https://www.amazon.com/stores/page/68814C03-4893-44A2-B1D9-F1699DA20F70" target="_blank" rel="nofollow"><strong>shop all Bose deals on Amazon</strong></a></li><li><strong>Bose SoundLink Micro: </strong><a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0FF4RY23S/" target="_blank" rel="nofollow"><strong>was $129 now $99</strong></a></li><li><strong>Bose SoundLink Flex (Gen 2): </strong><a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0D6WB7BV6" target="_blank" rel="nofollow"><strong>was $149 now $135</strong></a></li><li><strong>Bose QuietComfort Bluetooth Earbud: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Lifestyle-Cancellation/dp/B0D8BWD76H" target="_blank" rel="nofollow"><strong>was $179 now $149</strong></a></li><li><strong>Bose QuietComfort Earbuds 2: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow"><strong>was $279 now $149</strong></a></li><li><strong>Bose Ultra Open Earbuds: </strong><a href="https://www.amazon.com/dp/B0CPFV77W4/" target="_blank" rel="nofollow"><strong>was $299 now $229</strong></a></li><li><strong>Bose QuietComfort Headphones: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" target="_blank" rel="nofollow"><strong>was $349 now $229</strong></a></li><li><strong>Bose SoundLink Max: </strong><a href="https://www.amazon.com/dp/B0CVL1K7DX/" target="_blank" rel="nofollow"><strong>was $399 now $339</strong></a></li></ul><h3 class="article-body__section" id="section-best-bose-deals"><span>Best Bose Deals</span></h3><div class="product"><a data-dimension112="86c2f2f7-8b67-49da-845f-0e9193d8a89c" data-action="Deal Block" data-label="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension48="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension25="$99" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0FF4RY23S/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1105px;"><p class="vanilla-image-block" style="padding-top:109.50%;"><img id="jBQUxpMSaZYZyyD2LJmGD7" name="Bose Micro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/jBQUxpMSaZYZyyD2LJmGD7.jpg" mos="" align="middle" fullscreen="" width="1105" height="1210" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode.<a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0FF4RY23S/" target="_blank" rel="nofollow" data-dimension112="86c2f2f7-8b67-49da-845f-0e9193d8a89c" data-action="Deal Block" data-label="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension48="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$135" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0D6WB7BV6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:75.11%;"><img id="fexRzMYRvYZTHGfbcUbFf8" name="Bose speaker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/fexRzMYRvYZTHGfbcUbFf8.jpg" mos="" align="middle" fullscreen="" width="679" height="510" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The new Bose SoundLink (2nd gen) is a compact and powerful Bluetooth speaker with a durable design. This 1.2-pound speaker is water and dust proof and delivered great sound quality in our <a href="https://www.tomsguide.com/audio/bose-soundlink-flex-2-review" target="_blank" data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$135">SoundLink Flex gen 2 review</a>. With 12 hours of battery life and $14 off, you have yourself a great deal.<a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0D6WB7BV6" target="_blank" rel="nofollow" data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$135">View Deal</a></p></div><div class="product"><a data-dimension112="530ab1fc-7bcf-4b2b-9ce1-226b47a27fdd" data-action="Deal Block" data-label="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $149." data-dimension48="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $149." data-dimension25="$149" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Lifestyle-Cancellation/dp/B0D8BWD76H" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:95.43%;"><img id="tEtgPEcP9tofgugi8QdrcP" name="Bose quietcomfort" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tEtgPEcP9tofgugi8QdrcP.jpg" mos="" align="middle" fullscreen="" width="679" height="648" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $149.<a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Lifestyle-Cancellation/dp/B0D8BWD76H" target="_blank" rel="nofollow" data-dimension112="530ab1fc-7bcf-4b2b-9ce1-226b47a27fdd" data-action="Deal Block" data-label="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $149." data-dimension48="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $149." data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$149" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:996px;"><p class="vanilla-image-block" style="padding-top:115.06%;"><img id="z2eEQ66QuaM6umZmg8fKoL" name="1715191898.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/z2eEQ66QuaM6umZmg8fKoL.jpg" mos="" align="middle" fullscreen="" width="996" height="1146" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Earbuds 2 take active noise cancellation to the next level. In our <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-earbuds-2" data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$149">Bose QuietComfort Earbuds 2 review</a>, we said these buds are a remarkable follow-up to their predecessors delivering better sound, call quality and unrivaled ANC. Sound balance and noise neutralization work extremely well and the battery life is up to 6 hours, with an extra 24 hours via the charging case.<a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow" data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="75d09ad7-6976-4d09-9943-db9ef4594a80" data-action="Deal Block" data-label="This budget soundbar will bring extra dialogue clarity to make sure you can hear every word of commentary. It's also louder than your TV speakers, so you can crank it up and enjoy background music to the max." data-dimension48="This budget soundbar will bring extra dialogue clarity to make sure you can hear every word of commentary. It's also louder than your TV speakers, so you can crank it up and enjoy background music to the max." data-dimension25="$199" href="https://www.amazon.com/dp/B088KRPCQJ/" 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:39.47%;"><img id="AHTTmLHs5odVXSuSHG9SB9" name="TV speaker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AHTTmLHs5odVXSuSHG9SB9.png" mos="" align="middle" fullscreen="" width="1500" height="592" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This budget soundbar will bring extra dialogue clarity to make sure you can hear every word of commentary. It's also louder than your TV speakers, so you can crank it up and enjoy background music to the max.<a class="view-deal button" href="https://www.amazon.com/dp/B088KRPCQJ/" target="_blank" rel="nofollow" data-dimension112="75d09ad7-6976-4d09-9943-db9ef4594a80" data-action="Deal Block" data-label="This budget soundbar will bring extra dialogue clarity to make sure you can hear every word of commentary. It's also louder than your TV speakers, so you can crank it up and enjoy background music to the max." data-dimension48="This budget soundbar will bring extra dialogue clarity to make sure you can hear every word of commentary. It's also louder than your TV speakers, so you can crank it up and enjoy background music to the max." data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="06fcf086-8389-4303-92ba-52c2eacb6532" data-action="Deal Block" data-label="This relatively new Bluetooth speaker is only just seeing its first discounts, and they're really good. This is a big saving on a speaker that offers great sound quality and 20 hours of battery life." data-dimension48="This relatively new Bluetooth speaker is only just seeing its first discounts, and they're really good. This is a big saving on a speaker that offers great sound quality and 20 hours of battery life." data-dimension25="$209" href="https://www.amazon.com/dp/B0F7HVC62G/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1227px;"><p class="vanilla-image-block" style="padding-top:65.04%;"><img id="9ijfXyWiRHYsywonwsmRwQ" name="soundlink plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9ijfXyWiRHYsywonwsmRwQ.jpg" mos="" align="middle" fullscreen="" width="1227" height="798" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This relatively new Bluetooth speaker is only just seeing its first discounts, and they're really good. This is a big saving on a speaker that offers great sound quality and 20 hours of battery life.<a class="view-deal button" href="https://www.amazon.com/dp/B0F7HVC62G/" target="_blank" rel="nofollow" data-dimension112="06fcf086-8389-4303-92ba-52c2eacb6532" data-action="Deal Block" data-label="This relatively new Bluetooth speaker is only just seeing its first discounts, and they're really good. This is a big saving on a speaker that offers great sound quality and 20 hours of battery life." data-dimension48="This relatively new Bluetooth speaker is only just seeing its first discounts, and they're really good. This is a big saving on a speaker that offers great sound quality and 20 hours of battery life." data-dimension25="$209">View Deal</a></p></div><div class="product"><a data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$229" href="https://www.amazon.com/dp/B0CPFV77W4/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1268px;"><p class="vanilla-image-block" style="padding-top:62.38%;"><img id="qDBpkjESq4Z3UsvHc4vEeX" name="bose open earbuds" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qDBpkjESq4Z3UsvHc4vEeX.jpg" mos="" align="middle" fullscreen="" width="1268" height="791" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose Ultra Open perfected the open earbud formula. They have a comfortable, non-invasive fit, solid battery life, and they sound better than you might expect from open buds. They got <a href="https://www.tomsguide.com/audio/earbuds/bose-ultra-open-earbuds" data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$229">4 stars in our review</a>, where we loved their simple controls and surprising lack of sound leakage. <a class="view-deal button" href="https://www.amazon.com/dp/B0CPFV77W4/" target="_blank" rel="nofollow" data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$229">View Deal</a></p></div><div class="product"><a data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$229" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:134.46%;"><img id="hHbg269p5MJKe2LQvoMyMd" name="bose quietcomfort" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hHbg269p5MJKe2LQvoMyMd.jpg" mos="" align="middle" fullscreen="" width="679" height="913" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>In our <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-headphones" data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$229">Bose QuietComfort Headphones review</a>, we said these are "excellent always-on noise-cancelers with enhanced sound and battery life." They're missing spatial audio mode and touch controls, but for $120 less, these are nearly perfect. <a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" target="_blank" rel="nofollow" data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$229">View Deal</a></p></div><div class="product"><a data-dimension112="21614f99-e07c-4c54-94d8-3bccf72b5cc5" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension25="$249" href="https://www.amazon.com/dp/B0F7M3HPBD?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:934px;"><p class="vanilla-image-block" style="padding-top:124.20%;"><img id="a9jV9Xm3AhpGwNWnqABVVP" name="Bose QuietComfort Ultra Earbuds gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/a9jV9Xm3AhpGwNWnqABVVP.png" mos="" align="middle" fullscreen="" width="934" height="1160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly.<a class="view-deal button" href="https://www.amazon.com/dp/B0F7M3HPBD?" target="_blank" rel="nofollow" data-dimension112="21614f99-e07c-4c54-94d8-3bccf72b5cc5" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="c097b7bc-cc7a-4220-95f9-3407c8e22bd8" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension48="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension25="$299" href="https://www.amazon.com/dp/B0CN9FTKJ4" 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:120.00%;"><img id="g64SDV3bmD2tcgopiiNgP6" name="Bose QuietComfort Ultra headphones Versus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g64SDV3bmD2tcgopiiNgP6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else.<a class="view-deal button" href="https://www.amazon.com/dp/B0CN9FTKJ4" target="_blank" rel="nofollow" data-dimension112="c097b7bc-cc7a-4220-95f9-3407c8e22bd8" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension48="The Bose QuietComfort Ultra Headphones get you epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension25="$299">View Deal</a></p></div><div class="product"><a data-dimension112="62651099-3d29-49e4-b22d-e0f44917f1e5" data-action="Deal Block" data-label="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension48="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension25="$339" href="https://www.amazon.com/dp/B0CVL1K7DX/" 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="dT2cC2J8saDETsZvrBwfqk" name="Bose_SoundLink_Max_square.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dT2cC2J8saDETsZvrBwfqk.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time. <a class="view-deal button" href="https://www.amazon.com/dp/B0CVL1K7DX/" target="_blank" rel="nofollow" data-dimension112="62651099-3d29-49e4-b22d-e0f44917f1e5" data-action="Deal Block" data-label="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension48="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension25="$339">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Bose Lifestyle Ultra Soundbar hands-on review: Finally, a real Sonos Arc Ultra rival ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/soundbars/bose-lifestyle-ultra-soundbar-hands-on-review-finally-a-real-sonos-arc-ultra-rival</link>
                                                                            <description>
                            <![CDATA[ Although I’ve only had a few days with it so far, the Bose Lifestyle Ultra Soundbar definitely feels like it’s a true Sonos Arc Ultra competitor. Is it time for the Arc Ultra to finally give up its crown as the best soundbar? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">it9DXiPHRqkjDuhbFXxMXa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Mc5DuPc8HGANrHARLmE7FL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 16 May 2026 07:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Soundbars]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Speakers]]></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.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>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Mc5DuPc8HGANrHARLmE7FL-1280-80.jpg">
                                                            <media:credit><![CDATA[Bose]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose Lifestyle Ultra Soundbar shown in living room]]></media:description>                                                            <media:text><![CDATA[Bose Lifestyle Ultra Soundbar shown in living room]]></media:text>
                                <media:title type="plain"><![CDATA[Bose Lifestyle Ultra Soundbar shown in living room]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Mc5DuPc8HGANrHARLmE7FL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Bose has shown us time and time again that it can build some truly great soundbars — both the <a href="https://www.tomsguide.com/audio/soundbars/bose-smart-soundbar-review">Bose Smart</a> and <a href="https://www.tomsguide.com/reviews/bose-smart-ultra-soundbar">Bose Smart Ultra</a> soundbars being good examples. But in 2026, the brand wants to take things to another level with the Bose Lifestyle Ultra Soundbar.</p><p>Although I’ve only had a few days with it, the Bose Lifestyle Ultra Soundbar feels like it’s a true <a href="https://www.tomsguide.com/audio/soundbars/sonos-arc-ultra-review">Sonos Arc Ultra</a> competitor. It sounds great both with and without the additional Lifestyle Ultra Subwoofer, and I was hard-pressed to hear anything wrong with it. </p><p>Is it time for the Arc Ultra to finally give up its crown as the <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbar</a>? </p><h3 class="article-body__section" id="section-tl-dr"><span>TL;DR</span></h3><ul><li><strong>What is it?</strong> A new Spatial Audio soundbar from Bose</li><li><strong>How much will it cost?</strong> $1,099 for the black or white model</li><li><strong>What does it work with?</strong> Any streaming service that supports Google Cast, Apple AirPlay, Spotify Connect, Wi-Fi, or Bluetooth</li></ul><h3 class="article-body__section" id="section-price-and-availability"><span>Price and availability</span></h3><div  class="fancy-box"><div class="fancy_box-title">Bose LifeStyle Ultra Speaker: Specs</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Price: </strong>$1,099<br><strong>Speakers: </strong>9 total speakers and center tweeter<br><strong>Supported streaming:</strong> Google Cast, Apple AirPlay, Spotify Connect<br><strong>Connectivity:</strong> Wi-Fi 6, Bluetooth 5.3<br><strong>Size: </strong>43.54 x 2.64 x 4.96 inches</p></div></div><p>The Bose Lifestyle Ultra Soundbar was announced on May 5 2026, and became available to pre-order at <a href="https://www.bose.com/p/home-theater/bose-lifestyle-ultra-soundbar/LSULT-SOUNDBAR.html" target="_blank" rel="nofollow">Bose.com</a> shortly afterwards. </p><p>At $1,099, it’s the most expensive soundbar in Bose’s range, but it’s similar in specs and power to the $999 Bose Smart Ultra Soundbar and is exactly the same price as its closest competitor, the Sonos Arc Ultra.</p><p>If you want something a bit more manageable in price, the 3.0-channel Bose TV Soundbar starts at $279, while the 5.0-channel Bose Smart Soundbar can be had for $549.</p><h3 class="article-body__section" id="section-design"><span>Design</span></h3><p>Bose being Bose, the Lifestyle Ultra Soundbar only comes in two color options: black and white… Excuse me, <em>Arctic White</em>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Y56bswcNo4bqVxx8wBuEUM" name="Bose Lifestyle Ultra Soundbar" alt="Bose Lifestyle Ultra Soundbar shown in living room" src="https://cdn.mos.cms.futurecdn.net/Y56bswcNo4bqVxx8wBuEUM.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The top of the soundbar is divided into two layers. There’s a fabric layer that wraps all the way around the front and sides of the soundbar and a glossy section that sits on top and acts almost as a mirror to the TV. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3913px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FvvJaAwm6BixTvHpbrC4mM" name="Bose Lifestyle Ultra Soundbar-1" alt="Bose Lifestyle Ultra Soundbar shown in living room" src="https://cdn.mos.cms.futurecdn.net/FvvJaAwm6BixTvHpbrC4mM.jpg" mos="" align="middle" fullscreen="" width="3913" height="2201" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Spin it around to the back and you'll see a strange array of ports. You've got the essential HDMI-in port that you'll want to connect to the eARC HDMI port on your TV, but also connections for Ethernet, Bass and Data, as well as a USB-C port for service. </p><p>I'm not sure I totally understand why some of these ports are here and I would trade any one of the aforementioned extras for an HDMI passthrough that could link up to a Blu-ray player or game console. </p><p>On the top right of the soundbar are the touch-sensitive controls laid out in a large circular indentation. You'll mostly use your phone to control playback, but these are handy to use in a pinch. </p><h3 class="article-body__section" id="section-audio"><span>Audio </span></h3><p>According to Bose, the speaker features six full-range drivers (two up-firing and four front-facing) alongside an additional center tweeter and two proprietary Bose PhaseGuide drivers inside the main bar. On the back are two QuietPort acoustic openings that enable what Bose calls "CleanBass" technology. </p><p>The specs are all very impressive on paper. But how does the speaker actually sound? I haven’t put the Bose Lifestyle Ultra Soundbar through my entire testing regimen yet, but I’m fairly pleased with what I’ve heard from it so far.</p><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="k5e9YrtmUXQehy84sCQtvM" name="Bose Lifestyle Ultra Soundbar-2" alt="Bose Lifestyle Ultra Soundbar shown in living room" src="https://cdn.mos.cms.futurecdn.net/k5e9YrtmUXQehy84sCQtvM.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>To kick things off, I started with songs from Qobuz, my streaming service of choice. First up: “The Mountain” by Gorillaz. Its blend of sitars and flutes fluttered wonderfully out of the soundbar, never too shrill for my ears and perfectly balanced. The soundstage wasn’t the largest, especially if I toggled off the subwoofer, but the clarity was great. </p><p>To test the bass response, I threw on “Barbra Streisand” by Duck Sauce. If you need an impromptu dance party in your living room, I highly recommend giving this a listen. The bass response wasn’t the greatest with just the soundbar, but there was enough oomph there to get me bobbing along with the beat. </p><p>Testing some classical music, “Star Wars: A New Hope Main Title” was up next — and I knew this one was going to be difficult for the soundbar. </p><p>Unfortunately, to make classical music to sound like you’re listening to it at the philharmonic, you <em>need </em>a wide soundstage. It’s here the Bose Lifestyle Ultra Soundbar fell a little flat. There was nothing wrong with the sound profile itself, mind you, it just felt cramped. Admittedly, this is an issue with nearly all soundbars, but I was hoping Bose’s CustomTune technology would widen things a bit. </p><p>Last but not least was “INDUSTRY BABY” by Lil Nas X, a perennial banger that should have the windows and walls shaking with its deep sub-bass. Without the subwoofer enabled, the Bose Lifestyle Ultra Soundbar got pretty darn low, but it wasn’t until I flipped back on the subwoofer that I really got the walls to shake. </p><p>To see how dialogue sounded, I threw on a Premiere League game. With the SpeechClarity setting at Medium, the announcers were crystal clear and the cheers of the audience were audible, but not overwhelming. This is an area that I'll really dive into with more movies and shows when I write the final review early next week.</p><h3 class="article-body__section" id="section-setup-and-smart-features"><span>Setup and smart features</span></h3><p>Setup for the Lifestyle Ultra Soundbar is done via the Bose app. The whole process can be done in just a few minutes and requires little technical knowledge to pull off. It also worked the first time, which is something I can’t say about every soundbar I’ve tested recently (cough, LG Sound Suite H7, cough). </p><p>Inside the app are a number of very simple tuning options. There’s a three-band EQ (treble, mids, bass) and adjustments for height and surround. You’ll want to adjust the height of the sound to match the distance to your TV. If the soundbar sits five feet below the TV, crank this setting up to +5. Need the sound lower? Go in the other direction to -5.</p><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:56.27%;"><img id="XMas2Rc3chLFYifzVuDn6L" name="Bose Lifestyle Ultra Soundbar LIST2" alt="Bose Lifestyle Ultra Soundbar shown in living room" src="https://cdn.mos.cms.futurecdn.net/XMas2Rc3chLFYifzVuDn6L.jpg" mos="" align="middle" fullscreen="" width="1500" height="844" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Bose)</span></figcaption></figure><p>If you pick up the subwoofer to go with it, you’ll be able to toggle it on and off via the app as well as increase its output if you feel the bass is a little lacking. I had mine set to a +2 for the majority of my hands-on time, but I occasionally cranked it up higher to see if I could rattle windows. (I was able to and my wife was none-too-pleased about it.)  </p><p>You’ll also come into the app to re-configure your setup if you shell out for a pair of <a href="https://www.tomsguide.com/audio/smart-speakers/bose-lifestyle-ultra-speaker-review">Bose Lifestyle Ultra speakers</a> or need to change the source of your playback from HDMI to Bluetooth or AirPlay. </p><h3 class="article-body__section" id="section-outlook"><span>Outlook</span></h3><p>I'll need to spend some more time with it before I can say definitively whether this overtakes the Sonos Arc Ultra, but I think it's going to be exceptionally close. </p><p>Features like Bose's custom tuning and SpeechClarity are genuinely helpful, and I think music sounds fantastic for a soundbar. There are some minor issues like the small soundstage and lack of an HDMI passthrough port that are troubling, however.</p><p>Although it's a bit pricey, the Lifestyle Ultra is a darn good entry in Bose's storied soundbar lineup, and it's one I'm excited to fully test over the next week or two. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve been testing the Bose Lifestyle Ultra speaker for a week — Sonos has some real competition ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/smart-speakers/bose-lifestyle-ultra-speaker-review</link>
                                                                            <description>
                            <![CDATA[ I've been testing the Bose Lifestyle Ultra Speaker for a week and it sounds amazing, but faces some real competition from established players ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">dFn6TzGg5gDkYsYw3FcW4j</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/pmLMPkvGNnozJS9H7RsCTR-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 15 May 2026 12:00:00 +0000</pubDate>                                                                                                                                <updated>Fri, 15 May 2026 13:33:17 +0000</updated>
                                                                                                                                            <category><![CDATA[Smart Speakers]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Speakers]]></category>
                                                                                                <author><![CDATA[ mike.prospero@futurenet.com (Mike Prospero) ]]></author>                    <dc:creator><![CDATA[ Mike Prospero ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/6ZM8mX4UwccqDJTh9gLPqV.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Michael A. Prospero is the U.S. Editor-in-Chief for Tom’s Guide. He oversees all evergreen content and oversees the Homes, Smart Home, and Fitness/Wearables categories for the site. In his spare time, he also tests out the latest drones, electric scooters, and smart home gadgets, such as video doorbells. Before his tenure at Tom&#039;s Guide, he was the Reviews Editor for Laptop Magazine, a reporter at Fast Company, the Times of Trenton, and, many eons back, an intern at George magazine. He received his undergraduate degree from Boston College, where he worked on the campus newspaper The Heights, and then attended the Columbia University school of Journalism. When he’s not testing out the latest running watch, electric scooter, or skiing or training for a marathon, he’s probably using the latest sous vide machine, smoker, or pizza oven, to the delight — or chagrin — of his family.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/pmLMPkvGNnozJS9H7RsCTR-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose Lifestyle Ultra Speaker]]></media:description>                                                            <media:text><![CDATA[Bose Lifestyle Ultra Speaker]]></media:text>
                                <media:title type="plain"><![CDATA[Bose Lifestyle Ultra Speaker]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/pmLMPkvGNnozJS9H7RsCTR-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>What took so long? It’s pretty remarkable that, for all its other products, it has taken Bose this long to come out with an in-home smart speaker. But the Bose Lifestyle Ultra is finally here, and it looks like the company has not only taken lessons from its own rich history of designing audio products, but also from what’s worked — and what hasn’t — from its competitors. </p><p>Apart from delivering excellent audio, this is the first smart speaker not made by Amazon that supports Alexa+; it supports AirPlay, Google Cast, and Spotify Connect, and you can even plug it directly into a turntable. </p><p>But, having used it for a week, I have a few reservations. So how does the Bose Lifestyle Ultra stack up against the <a href="https://www.tomsguide.com/us/best-smart-speakers,review-4480.html">best smart speakers</a>? You’ll have to read the rest of my review to find out.</p><h3 class="article-body__section" id="section-bose-lifestyle-ultra-review-price-and-availability"><span>Bose Lifestyle Ultra review: Price and availability</span></h3><p>The Bose LifeStyle Ultra Speaker went on sale May 5 2026 at <a href="https://go.redirectingat.com/?id=92X1584493&xcust=tomsguide_us_1498731132257155470&xs=1&url=https%3A%2F%2Fbose.com%2Fp%2Fspeakers%2Fbose-lifestyle-ultra-speaker%2FLSULT-SPEAKERWIRELESS.html&sref=https%3A%2F%2Fwww.tomsguide.com">Bose.com</a>, and is more widely available at other retailers. The speaker comes in three colors: the black and white models cost $299, while a limited-edition Driftwood Sand model costs $349.</p><h3 class="article-body__section" id="section-bose-lifestyle-ultra-review-design"><span>Bose Lifestyle Ultra review: Design</span></h3><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/r5gG9SbpUv2e9NBnuaXE7b.jpg" alt="Bose Lifestyle Ultra Speaker next to turntable" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/NnwDjnQ6xPK5VLL9LxL8m3.jpg" alt="Bose Lifestyle Ultra Speaker top front" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/GTKetYSsM66ddafB9VQZCk.jpg" alt="Bose Lifestyle Ultra Speaker top showing controls" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Fr2oroLqEdw7LixJQe3LR.jpg" alt="Bose Lifestyle Ultra Speaker side view" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/oCrCx4qxtCjKbTzvjBPMcV.jpg" alt="Bose Lifestyle Ultra Speaker lower front " /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/mjmdrPXhfZufiTmZyT3T2d.jpg" alt="Bose Lifestyle Ultra Speaker rear" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><div  class="fancy-box"><div class="fancy_box-title">Bose Lifestyle Ultra specs</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Price</strong>: $299 ($349 for Sandstone)<br><strong>Speakers</strong>: One 3-inch driver, 1-inch tweeter, 1.5-inch upward-firing twiddler<br><strong>Supported streaming</strong>: Google Cast, Apple AirPlay, Spotify Connect<br><strong>Connectivity</strong>: Wi-Fi 6, Bluetooth 5.3, 3.5mm<br><strong>Size</strong>: 7.3 x 6.6 x 4.8 inches</p></div></div><p>Stylistically, the Bose speaker falls between the all-plastic <a href="https://www.tomsguide.com/reviews/sonos-era-100">Sonos Era 100</a> and the completely cloth-covered <a href="https://www.tomsguide.com/reviews/apple-homepod-2nd-generation">Apple HomePod 2</a>. The body of Bose’s speaker is made primarily of plastic, but the front and sides are wrapped in an acoustic cloth, which softens the overall look. </p><p>The top of the device has a speaker grille towards the front, and a circular indentation towards the rear with volume controls. In between are additional touch-sensitive controls for Bluetooth and muting the speaker’s microphone. With all the little icons, it feels a bit busy, but that’s just me.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PhFe4DhXLdwD5y3meXnWkd" name="Bose Lifestyle Ultra Speaker" alt="Bose Lifestyle Ultra Speaker - all thee colors" src="https://cdn.mos.cms.futurecdn.net/PhFe4DhXLdwD5y3meXnWkd.jpg" mos="" align="middle" fullscreen="" width="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 saw all three color options in person, and the limited-edition Driftwood Sand model definitely stands out, especially with its white oak base. If you have wood decor, it might be worth springing the cash.</p><h3 class="article-body__section" id="section-bose-lifestyle-ultra-review-audio-quality"><span>Bose Lifestyle Ultra review: Audio quality</span></h3><p>As you might expect from a Bose product, the sound quality from the Lifestyle Ultra speaker is superb. To test its performance, I streamed a number of tracks through Spotify. </p><p>One thing I noticed in my hands-on — and confirmed in my home — is that the Bose speaker has much brighter mids and highs compared to the Sonos Era 100. As a result, female vocals were especially more pronounced and defined. I could really hear the personality of Carole King singing “I feel the Earth Move,” Dua Lipa in “Dance the Night,” and Kristen Chenoweth belting out “Popular.”</p><p>In fact, the mids were forward sometimes to the point of them sounding a bit too harsh. It was especially evident when I cranked “Tom Sawyer,” Geddy Lee’s falsetto cracked a little bit on the higher lines. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:7728px;"><p class="vanilla-image-block" style="padding-top:56.21%;"><img id="NnwDjnQ6xPK5VLL9LxL8m3" name="Bose Lifestyle Ultra Speaker-4" alt="Bose Lifestyle Ultra Speaker top front" src="https://cdn.mos.cms.futurecdn.net/NnwDjnQ6xPK5VLL9LxL8m3.jpg" mos="" align="middle" fullscreen="" width="7728" height="4344" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Lower tones also came through loud and clear; on that same track, the bass line and drums were so crisp that I could hear every bang and thump cleanly. The thumping bass line on the Beastie Boys’ “Paul Revere” also rang through like the silversmith running through Massachusetts warning of the British.</p><p>When played on the Sonos Era 100, those same vocals weren’t as present — things felt a bit rounder and pulled back — but the soundstage also was a bit wider, if not as tall as the Bose. </p><p>Ultimately, choosing between the Bose and the Sonos really comes down to a matter of preference. Both offer superior audio quality, and it’s hard to pick a winner based on sound alone.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:7588px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bCWzpbeVYJarnb4okMd5WD" name="Bose Lifestyle Ultra Speaker-9" alt="Bose Lifestyle Ultra Speaker with Sonos Era 100 and Apple HomePod 2" src="https://cdn.mos.cms.futurecdn.net/bCWzpbeVYJarnb4okMd5WD.jpg" mos="" align="middle" fullscreen="" width="7588" height="4268" attribution="" endorsement="" 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 upward-firing speaker also added a bit more height to music, which, in the absence of Dolby Atmos support, is a nice little extra. Still, both the HomePod 2 and Amazon Echo Studio support spatial audio, so Atmos’ absence is felt.</p><p>Unlike some of the other smart speakers I’ve tested — most notably the Sonos Era 100, HomePod 2, and even the <a href="https://www.tomsguide.com/audio/smart-speakers/amazon-echo-studio-2025-review">Amazon Echo Studio</a> — the Bose Lifestyle Ultra speaker does not support Bose’s room-tuning feature, CustomTune. </p><h3 class="article-body__section" id="section-bose-lifestyle-ultra-review-app-and-home-theater-capabilities"><span>Bose Lifestyle Ultra review: App and home theater capabilities </span></h3><p>Maybe Bose learned from Sonos’ lesson, because its app is pretty minimalistic — but in a good way. You really only need it to set up the speaker, connect it to Wi-Fi, Alexa+, and tweak EQ settings. It has a 3-band EQ (treble, mid, and bass) plus a fourth for height. Overall, it has one of the clearest guides to walk you through the setup process that I’ve ever seen.</p><p>After that, there’s little reason why you’d need to use the app, as Bose has designed it to work within the music app of your choice. It’s compatible with Google Cast, Apple Airplay, and Spotify Connect; when I opened Spotify, the Bose speaker was listed there as a music source. </p><p>If all else fails, you can also simply connect to the speaker via Bluetooth, or just plug in a 3.5mm cord in the back. At a time when physical audio connections seem to be disappearing, it’s nice to see Bose keeping this legacy connector around. </p><p>You can also pair two Bose Lifestyle Ultra speakers for stereo sound, group them in different rooms of your house, or add them as part of a home theater surround system. One bummer is that, while the Lifestyle Ultra Speakers can be paired with a Bose Lifestyle Ultra soundbar, they’re not backwards-compatible with other Bose equipment. So, if you already have a Bose soundbar, you won’t be able to use these as surrounds.</p><h3 class="article-body__section" id="section-bose-lifestyle-ultra-review-smart-home-features"><span>Bose Lifestyle Ultra review: Smart home features</span></h3><p>The Lifestyle Ultra is the first third-party smart speaker that’s compatible with <a href="https://www.tomsguide.com/ai/ive-been-using-alexa-for-3-months-here-are-my-5-favorite-features-and-one-im-not-a-fan-of">Alexa+</a>, Amazon’s AI-improved voice assistant. However, unlike the HomePod and Echo Studio, the Bose Lifestyle Ultra lacks presence, temperature, or any other sensor of that ilk which would allow you to create automated routines</p><h3 class="article-body__section" id="section-bose-lifestyle-ultra-review-bottom-line"><span>Bose Lifestyle Ultra review: Bottom line</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:7193px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Fr2oroLqEdw7LixJQe3LR" name="Bose Lifestyle Ultra Speaker-7" alt="Bose Lifestyle Ultra Speaker side view" src="https://cdn.mos.cms.futurecdn.net/Fr2oroLqEdw7LixJQe3LR.jpg" mos="" align="middle" fullscreen="" width="7193" height="4046" attribution="" endorsement="" 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 Bose Lifestyle Ultra is a very capable and well-designed smart speaker. Its audio quality is superb, it’s easy to set up, it works seamlessly with all the major music streaming services and it’s the first third-party smart speaker that can access Alexa+.</p><p>All that being said, it’s sandwiched between some well-established competition. At $299, it’s the same price as the Amazon Echo Studio and Apple HomePod 2, but those models both support spatial audio and have extra sensors to take fuller advantage of their smart home capabilities. </p><p>Bose’s other chief competitor in this market, the <a href="https://www.tomsguide.com/reviews/sonos-era-100">Sonos Era 100</a>, has now been out for three years, costs $80 less, and offers similar audio quality. (Sonos also sells the Alexa-free <a href="https://www.tomsguide.com/audio/smart-speakers/i-found-the-perfect-use-for-sonos-new-era-100-sl-speakers-and-i-couldnt-be-happier">Sonos Era 100 SL</a> for $189, so I suspect that not as many use voice controls as the company originally thought.)</p><p>In addition, all three rivals offer some sort of room-tuning capability, while the Bose does not. </p><p>On the basis of its performance as a speaker to play music from your turntable or streaming service of choice, the Bose Lifestyle Ultra will not disappoint. However, it falls a little short when it comes to the little extras you get with its rivals. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I went hands-on with the Bose Lifestyle Ultra Speaker — and Sonos should be worried ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/smart-speakers/i-went-hands-on-with-the-bose-lifestyle-ultra-speaker-and-sonos-should-be-worried</link>
                                                                            <description>
                            <![CDATA[ The new Bose Lifestyle Ultra Speaker looks to compete with Sonos and Apple in the smart speaker space; I got an early first look (and listen). ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zmffsBsihXaahdMGtf6dkE</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/PhFe4DhXLdwD5y3meXnWkd-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 05 May 2026 12:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 05 May 2026 17:50:40 +0000</updated>
                                                                                                                                            <category><![CDATA[Smart Speakers]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Speakers]]></category>
                                                                                                <author><![CDATA[ mike.prospero@futurenet.com (Mike Prospero) ]]></author>                    <dc:creator><![CDATA[ Mike Prospero ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/6ZM8mX4UwccqDJTh9gLPqV.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Michael A. Prospero is the U.S. Editor-in-Chief for Tom’s Guide. He oversees all evergreen content and oversees the Homes, Smart Home, and Fitness/Wearables categories for the site. In his spare time, he also tests out the latest drones, electric scooters, and smart home gadgets, such as video doorbells. Before his tenure at Tom&#039;s Guide, he was the Reviews Editor for Laptop Magazine, a reporter at Fast Company, the Times of Trenton, and, many eons back, an intern at George magazine. He received his undergraduate degree from Boston College, where he worked on the campus newspaper The Heights, and then attended the Columbia University school of Journalism. When he’s not testing out the latest running watch, electric scooter, or skiing or training for a marathon, he’s probably using the latest sous vide machine, smoker, or pizza oven, to the delight — or chagrin — of his family.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/PhFe4DhXLdwD5y3meXnWkd-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose Lifestyle Ultra Speaker - all thee colors]]></media:description>                                                            <media:text><![CDATA[Bose Lifestyle Ultra Speaker - all thee colors]]></media:text>
                                <media:title type="plain"><![CDATA[Bose Lifestyle Ultra Speaker - all thee colors]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/PhFe4DhXLdwD5y3meXnWkd-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It's taken a minute, but Bose is finally coming out with a smart speaker that will rival the likes of the Sonos Era 100 and Apple HomePod 2. Last week, I had the opportunity to listen to the Bose LifeStyle Ultra Speaker, a new device that will not only let you stream music from Spotify, Apple Music and more, but also connect to your home theater system — including your record player.</p><p>But how does Bose's new product compare to the <a href="https://www.tomsguide.com/us/best-smart-speakers,review-4480.html">best smart speakers</a>? I checked out the Bose LifeStyle Ultra Speaker; here's my early impression of a device that could be the next addition to your entertainment system.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7636376245797784863" data-video-id="7636376245797784863" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguide" href="https://www.tiktok.com/@tomsguide">@tomsguide</a>                            <p></p><a target="_blank" title="♬ Dreamy - Elijah Lee" href="https://www.tiktok.com/music/Dreamy-6750065390681851906">♬ Dreamy - Elijah Lee</a></section>                    </blockquote></div>                <h3 class="article-body__section" id="section-tl-dr"><span>TL;DR</span></h3><ul><li><strong>What is it?</strong> A new smart speaker from Bose</li><li><strong>How much will it cost?</strong> $299 for the black or white model</li><li><strong>What does it work with?</strong> Any streaming service that supports Google Cast, Apple AirPlay, Spotify Connect, Wi-Fi, or Bluetooth</li></ul><h3 class="article-body__section" id="section-price-and-availability"><span>Price and availability</span></h3><div  class="fancy-box"><div class="fancy_box-title">Bose LifeStyle Ultra Speaker: Specs</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Price: </strong>$299 ($349 for Sandstone)<br><strong>Speakers</strong>: One 3-inch driver, 1-inch tweeter, 1.5-inch upward-firing twiddler<br><strong>Supported streaming:</strong> Google Cast, Apple AirPlay, Spotify Connect<br><strong>Connectivity</strong>: Wi-Fi 6, Bluetooth 5.3, 3.5mm<br><strong>Size</strong>: 7.3 x 6.6 x 4.8 inches</p></div></div><p>The Bose LifeStyle Ultra Speaker goes on sale today (May 5) at <a href="https://bose.com/p/speakers/bose-lifestyle-ultra-speaker/LSULT-SPEAKERWIRELESS.html" target="_blank" rel="nofollow">Bose.com </a>— we can only imagine that it will be available at other retailers shortly after. The Lifestyle Ultra Speaker will come in three colors: the black and white models will cost $299, while a limited-edition Sandstone model will cost $349.</p><p>At launch, Bose's speaker will cost $80 more than the <a href="https://www.tomsguide.com/reviews/sonos-era-100">Sonos Era 100</a> and <a href="https://www.tomsguide.com/audio/smart-speakers/amazon-echo-studio-2025-review">Amazon Echo Studio</a>, but is the same price as the <a href="https://www.tomsguide.com/reviews/apple-homepod-2nd-generation">Apple HomePod 2</a>.  </p><p>Also going on sale today is the Bose Lifestyle Ultra Soundbar ($1,099) as well as the Bose Lifestyle Ultra Subwoofer ($899). Unfortunately, the soundbar is only available in black or white, so you can't get one to match your Sandstone-colored Speaker.</p><h3 class="article-body__section" id="section-design"><span>Design</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:58.60%;"><img id="qBGxfsPMNdWqtasBhdwRbn" name="Bose Lifestyle Ultra Speaker" alt="Bose Lifestyle Ultra Speaker - front and rear" src="https://cdn.mos.cms.futurecdn.net/qBGxfsPMNdWqtasBhdwRbn.jpg" mos="" align="middle" fullscreen="" width="2000" height="1172" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Bose's smart speaker is roughly the same size as its main competition, but has some nice design flourishes to set it apart. As viewed from the top, it has an oval shape, with a fabric wrapping around the front and sides, to give it a softer look. The majority of the rest of the speaker is made of plastic, but the base of the Sandstone model is made of white oak, which looks most visually distinctive. </p><p>On the top are the speaker's touch-sensitive controls; there's a large circular indentation for volume controls, which you can adjust either by tapping or spinning your finger around. </p><p>Also on the top, you'll see a grille for an upward-firing speaker, which Bose says will help give your music more vertical depth.  </p><p>Around back is the power plug, as well as a 3.5mm audio jack; the bottom of the speaker has a screw mount should you wish to place it on a pedestal.</p><h3 class="article-body__section" id="section-audio"><span>Audio </span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1250px;"><p class="vanilla-image-block" style="padding-top:58.80%;"><img id="QMKiSUE7TJKxXndXaJzW9W" name="Bose Lifestyle Ultra Speaker" alt="Bose Lifestyle Ultra Speaker internal speakers" src="https://cdn.mos.cms.futurecdn.net/QMKiSUE7TJKxXndXaJzW9W.jpg" mos="" align="middle" fullscreen="" width="1250" height="735" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Bose)</span></figcaption></figure><p>Inside the Lifestyle Ultra Speaker are three drivers; a forward-facing woofer and tweeter, and one more tweeter that's directed upwards. There's also a rather large resonance chamber that exits out the rear of the speaker, to add additional passive bass to your music. </p><p>During my hands-on session with the speaker, the music I heard ("Man I Need by Olivia Dean, "Bad as I Used to Be" by Chris Stapleton, "Peaceful Place" by Leon Bridges," and "Hey Nineteen" by Steely Dan) was definitely impressive for its size. Bass was powerful without being overwhelming, and vocals came through crisply. </p><p>I will say that the highs sounded a bit too bright for my tastes, but I'll have to listen to it more before I can render an official verdict.</p><p>The upward-firing speaker definitely added height to the tracks I listened to, but this is a speaker you'll want to have placed fairly close to a wall, so that the music has something to bounce off. However, keep in mind that unlike the HomePod 2, it does not support Dolby Atmos.</p><h3 class="article-body__section" id="section-home-theater-capabilities"><span>Home theater capabilities</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1145px;"><p class="vanilla-image-block" style="padding-top:54.06%;"><img id="MuXQzNwUnVh2a7LU949x6" name="Bose Lifestyle Ultra Speaker" alt="Bose Lifestyle Ultra Speakers with turntable" src="https://cdn.mos.cms.futurecdn.net/MuXQzNwUnVh2a7LU949x6.jpg" mos="" align="middle" fullscreen="" width="1145" height="619" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Bose)</span></figcaption></figure><p>Like most other smart speakers, you can pair two of Bose's together for stereo, and you can also create a multi-room setup. </p><p>Similar to the Sonos Era 100, the Bose Lifestyle Ultra Speaker can be used as rear-channel satellites with the Bose Lifestyle Ultra Soundbar, should you want to create a more fully immersive home theater setup. However, the Ultra Speakers struggle to interface directly with a TV, unless you were to run RCA cables from your TV to each speaker. </p><p>The Bose Lifestyle Ultra Speaker has a 3.5mm jack, which lets you connect it directly to a turntable — a nice touch for those who want to listen to records with as little fuss as possible. (With the Sonos, you need to purchase a USB-C adapter, and the HomePod and Echo Studio lack this capability entirely.)</p><h3 class="article-body__section" id="section-smart-functions"><span>Smart functions</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DmsGhXwwCFEzbedrpWVtn5" name="bose speaker touch controls" alt="Bose Lifestyle Ultra Speaker controls" src="https://cdn.mos.cms.futurecdn.net/DmsGhXwwCFEzbedrpWVtn5.jpg" mos="" align="middle" fullscreen="" width="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>Bose takes a very light approach when it comes to the app that controls the speaker. While you need the app to set it up, connect it to your Wi-Fi network, and adjust things such as treble and bass, you won't use the app to when using your music streaming service of choice. </p><p>Rather, you'll go through that company's app — be it Apple Music, Spotify, or whatever — and select the Bose speaker there. The speaker supports Google Cast, Apple AirPlay, and Spotify Connect, so you should be well-covered. </p><p>In the U.S., the Bose speaker will also support Alexa+, and in fact will be the first third-party speaker to support Amazon's upgraded smart assistant. (The Sonos Era 100 supports the older Alexa, but not the newer version.)</p><h3 class="article-body__section" id="section-outlook"><span>Outlook</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.30%;"><img id="YrvotqL6R7UwdABMPJW4iB" name="Bose Lifestyle Ultra Speaker" alt="Bose Lifestyle Ultra Speaker" src="https://cdn.mos.cms.futurecdn.net/YrvotqL6R7UwdABMPJW4iB.jpg" mos="" align="middle" fullscreen="" width="2000" height="1126" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Bose finally has a smart speaker that rivals those of its biggest competitors: The Bose Lifestyle Ultra Speaker certainly ticks all the necessary boxes with strong audio capabilities, as well as support for the major streaming protocols — and it has an audio jack in the back.</p><p>At $299, it's priced to compete with the established names out there, so we can't wait to get one in to test out and see how it fares in our home. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I struggled to hear movie dialogue until I got a soundbar — here's my top 6 recommendations for every budget ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/soundbars/i-struggled-to-hear-movie-dialogue-until-i-got-a-soundbar-heres-my-top-6-recommendations-for-every-budget</link>
                                                                            <description>
                            <![CDATA[ I've tested 17 soundbars, so I'm sharing my favorite 6 to help you bring the movie theater home. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">fCacqLDEVrQpxmYy39JxY9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4eA5cS4PE8cTCLgnAKXKQN-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 18 Apr 2026 07:30: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.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>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/4eA5cS4PE8cTCLgnAKXKQN-1280-80.jpg">
                                                            <media:credit><![CDATA[Samsung / Sony / Bose / Polk Audio / Edited with Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[an image of the samsung q600f, qs750f, hw-b650, polk audio signa s4, sony ht-s100f, and bose smart soundbar on a living room cabinet]]></media:description>                                                            <media:text><![CDATA[an image of the samsung q600f, qs750f, hw-b650, polk audio signa s4, sony ht-s100f, and bose smart soundbar on a living room cabinet]]></media:text>
                                <media:title type="plain"><![CDATA[an image of the samsung q600f, qs750f, hw-b650, polk audio signa s4, sony ht-s100f, and bose smart soundbar on a living room cabinet]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4eA5cS4PE8cTCLgnAKXKQN-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Muffled TV dialogue is so last year. In 2026, we're not going to resort to using subtitles or accepting that we can barely hear our TV shows and movies. And how are we going to do that? By getting one of the <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbars,</a> of course. </p><p>Soundbars are essential for home theater setups, even if all you watch is Netflix and YouTube. TV speakers are seriously so tinny and flat and make everything sound squashed. This isn't really fixable — the speakers trapped inside flatscreen TVs (99% of all modern TVs, your QLEDs, your OLEDs, your mini LEDs) are tiny because they have to be. </p><p>But there's a fix! You can upgrade your home theater sound with a soundbar. You don't even have to spend a ton of money — one of my go-to recommendations is the $99 <a href="https://www.tomsguide.com/audio/soundbars/sony-ht-s100f-review">Sony HT-S100F</a>. If you've got money to spend, though, I've also got the multi-channel <a href="https://www.tomsguide.com/audio/soundbars/samsung-qs750f-review">Samsung QS750F</a> on this list. </p><h2 id="my-top-soundbar-recommendations">My top soundbar recommendations</h2>        <div class="featured_product_block featured_block_hero" data-id="1905f735-3798-47ec-96eb-c5d63c673afb">            <a href="https://www.bestbuy.com/product/sony-hts100f-2-0-channel-soundbar-with-bass-reflex-speaker-black/J7XSRH42CT" data-model-name="HT-S100F" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:120.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/6MkHgEucKsGfPryXymSorK.jpg" alt="Sony HT-S100F"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Sony</div>                                        <div class="featured__title">HT-S100F</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="69e8644f-46f0-4bca-8974-9106d3002e8f">            <a href="https://www.bestbuy.com/product/samsung-hw-b650-za-3-1-channel-soundbar-with-wireless-subwoofer-dolby-5-1-dts-virtualx-black/J3ZYG2XWJJ" data-model-name="B650" 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/RFuy9EY8WNkD8jriP4sfnS.jpg" alt="Samsung HW-B650 Soundbar"></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">B650</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="8145cf29-89b5-47fc-a9d8-ab5f7b32b607">            <a href="https://www.amazon.com/Polk-Audio-Signa-S4-Ultra-Slim/dp/B09J753M18" data-model-name="Signa S4" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:27.32%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/Xsqdya39Q6fdEfvMEKAKDR.jpg" alt="Polk Audio Signa S4"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Polk Audio</div>                                        <div class="featured__title">Signa S4</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="da7215ff-6494-44aa-b088-20f63f3b30c2">            <a href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" data-model-name="Smart Soundbar" 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/XT9aaiGZoDf6MtibTHXgr6.jpg" alt="the bose smart soundbar in black on a white background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Bose</div>                                        <div class="featured__title">Smart Soundbar</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="8183942d-d058-455a-9213-bee853cf4e38">            <a href="https://www.bestbuy.com/product/samsung-q-series-hw-q600f-atmos-3-1-2-ch-soundbar-with-subwoofer-titan-black/J3ZYG2FV7Z" data-model-name="Q600F" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:120.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/ExfR2TSGT2maYw6G6JSFS5.jpg" alt="Samsung Q600F"></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">Q600F</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="8204206c-5400-4c0c-88c4-c65f05ca4531">            <a href="https://www.bestbuy.com/product/samsung-q-series-hw-qs750f-5-1-2-ch-soundbar-with-subwoofer-and-rear-speakers-titan-black/J3ZYGX7CYL" data-model-name="QS750F" 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/TjpQTnAYrWC6KVhSH67Cf6.jpg" alt="the samsung qs750f soundbar, subwoofer, and rears 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">QS750F</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div><h2 id="how-do-i-choose-the-best-soundbar-for-me">How do I choose the best soundbar for me? </h2><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="DUinHpC2RKAgJKy6std6CZ" name="Sony_HTSF150_soundbar_ 2.JPG" alt="the sony ht-s100f or sony ht-sf150 in uk, a black soundbar with buttons on the top, a remote, photographed with a panasonic TV" src="https://cdn.mos.cms.futurecdn.net/DUinHpC2RKAgJKy6std6CZ.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>Right, so the most important thing you need to consider is <strong>budget</strong>. How much money are you willing to spend on your soundbar? Around $100 will get you a decent 2-channel configuration like the <a href="https://www.tomsguide.com/audio/soundbars/sony-ht-s100f-review">Sony HT-S100F</a>. I've not tested any Amazon-brand cheap soundbars so I can't vouch for them personally — but the Sony HT-S100F is fantastic for the price, with clear, audible dialogue and surprising height. You won't get floor-shaking bass, of course, but for $100, it's a great option. </p><p>If you've got money to spend, I'd recommend getting the <a href="https://www.tomsguide.com/audio/soundbars/samsung-qs750f-review">Samsung QS750F</a>. This 5.1.2  soundbar's subwoofer and rears make it one of the best-value soundbars on the market. Although it's $899 at full price (discounted to $799 right now), I've tested $600 that are just that — a soundbar. No sub, no rears. The QS750F is basically a cheat code to movie theater sound for less. </p><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="L98EQ9fkEvbXMw9GNhvwiH" name="Samsung_QS750F_.JPG" alt="the samsung qs750f soundbar with two rear surround speakers and subwoofer photographed against a blue background and a TV" src="https://cdn.mos.cms.futurecdn.net/L98EQ9fkEvbXMw9GNhvwiH.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>Next, you want to look at <strong>space</strong>. How big is your TV? How big is your TV stand? </p><p>If you have a 43-inch TV, you don't want a large soundbar like the <a href="https://www.tomsguide.com/audio/soundbars/polk-audio-signa-s4-review">Polk Audio Signa S4</a> ($449, 41 inches long). But if you have a 65-inch TV, you <em>do</em> want a large soundbar like the Polk Audio Signa S4. </p><p>A small soundbar like the <a href="https://www.tomsguide.com/audio/soundbars/bose-smart-soundbar-review">Bose Smart Soundbar</a> ($549, 27 inches long) or the <a href="https://www.tomsguide.com/audio/soundbars/samsung-hw-b650-soundbar-review">Samsung B650</a> ($397, 33 inches long) will look weird with a 75 incher, but it looks great with my 55-inch Panasonic MZ1500. </p><p>Lastly, you want to think about <strong>performance</strong>. Unfortunately, budget and space will mostly decide this for you. If you want a serious home theater setup with cinematic Dolby Atmos and room-configuration technology, well, you're not going to get that for under $800 — and that's <em>cheap</em>. </p><p>The most immersive soundbar system I've ever tested is the JBL Bar 1300X ($1,799), but it's just too expensive for most people. </p><p>For most people, I'd recommend the <a href="https://www.tomsguide.com/audio/soundbars/samsung-q600f-review">Samsung Q600F</a>, a gorgeous midrange soundbar that combines crystal-clear dialogue, powerful bass, and immersion without breaking the bank (but you miss out on smart features like Wi-Fi playback). </p><p>Which soundbar tickles your fancy? Let me know in the comments!</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WQ3mAX"></div>                            </div>                            <script src="https://kwizly.com/embed/WQ3mAX.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/i-got-my-first-turntable-six-months-ago-and-ive-never-felt-so-connected-to-music-even-if-my-bank-account-is-crying"><strong>I got my first turntable six months ago — and I've never felt so connected to music (even if my bank account is crying)</strong></a></li><li><a href="https://www.tomsguide.com/best-picks/best-cheap-noise-cancelling-headphones"><strong>Best cheap noise-canceling headphones</strong></a></li><li><a href="https://www.tomsguide.com/audio/ive-been-collecting-vinyl-for-over-a-decade-12-products-i-think-you-should-add-to-your-cart-this-record-store-day"><strong>I've been collecting vinyl for over a decade — 12 products I think you should add to your cart this Record Store Day</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested the Nothing Ear (3) vs Bose QuietComfort earbuds — here's the winner ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/earbuds/bose-quietcomfort-versus-nothing-ear-3-face-off</link>
                                                                            <description>
                            <![CDATA[ The Bose QuietComfort and Nothing Ear (3) cost $179 each, and both mid-range earbuds are fantastic for sound and call quality, but is one better than the other? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">5xT93etYatgX4rzcu73ztD</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/dqDHhU6cE4oMrRdAJHoJxE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 06 Apr 2026 10:30:00 +0000</pubDate>                                                                                                                                <updated>Mon, 06 Apr 2026 11:29:57 +0000</updated>
                                                                                                                                            <category><![CDATA[Earbuds]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Headphones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/dqDHhU6cE4oMrRdAJHoJxE-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Nothing Ear (3) versus Bose QuietComfort]]></media:description>                                                            <media:text><![CDATA[Nothing Ear (3) versus Bose QuietComfort]]></media:text>
                                <media:title type="plain"><![CDATA[Nothing Ear (3) versus Bose QuietComfort]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/dqDHhU6cE4oMrRdAJHoJxE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>You don't need to spend over $200 to get good sound quality — just look at the <a href="https://www.tomsguide.com/audio/earbuds/bose-quietcomfort-earbuds-2024-review">Bose QuietComfort</a> and the <a href="https://www.tomsguide.com/audio/earbuds/nothing-ear-3-review">Nothing Ear (3)</a>. These earbuds cost $179 each, and during sales events, like Black Friday, you can get them for even cheaper. Both are excellent at delivering nuanced vocals and powerful bass, and both are good at blocking out external sounds with solid ANC.</p><p>I reviewed the QuietComfort back in 2025, and now in 2026, I've finishing reviewing the Ear (3). I awarded both pairs 4-star ratings in their respective reviews. This got me thinking, "Is one better than the other?" Chances are, you're probably going to go for the QuietComfort because Bose is a household name. But I don't think you should write Nothing off so quickly.</p><p>If you're on the hunt for a fantastic pair of earbuds but don't want to spend more than $180, I'm here to make that decision easier for you. I put the QuietComfort and the Ear (3) through their paces in this face off to find out which is best value for money. Spoiler alert: it's closer than you think.</p>        <div class="featured_product_block featured_block_versus" data-id="a7d876b2-0916-4f6d-9ae9-757eb40b2dec">            <a href="https://www.amazon.com/Bose-New-QuietComfort-Earbuds-Black/dp/B0D8BZDPXB/" data-model-name="QuietComfort" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:95.55%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/gng2pmSiBsvdSJEfE2mEde.png" alt="Bose QuietComfort Earbuds"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                            <div class='featured__brand'>Bose</div>                    <div class="featured__title">QuietComfort</div>                                    </div>                <div class="subtitle__description">                                <div class="stars__reviews"><span itemprop="reviewRating" itemscope itemtype="http://schema.org/Rating" class="chunk rating"><span class="icon icon-star"> </span><span class="icon icon-star"> </span><span class="icon icon-star"> </span><span class="icon icon-star"> </span><meta itemprop="bestRating" content="100.0" /><meta itemprop="worstRating" content="0.0" /><meta itemprop="ratingValue" content="80" /></span></div>                                        <p><p>The 2024 iteration of the Bose QuietComfort Earbuds looks fantastic and is extremely comfortable. The earbuds offer best-in-class active noise cancellation and incredible sound quality, plus long battery life too. However, they’re a little sensitive to voice commands, the case is plasticky, and there’s no support for advanced codecs.</p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_versus" data-id="16f7d533-ed93-4ceb-97ab-caf14bd17109">            <a href="https://www.amazon.com/Nothing-Wireless-Cancelling-Bluetooth-Headphones/dp/B0FHWM1D2Y/" data-model-name="Ear (3)" 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/t58Cd53WhJS87iLh7Vi8r9.jpg" alt="Nothing Ear 3"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                            <div class='featured__brand'>Nothing</div>                    <div class="featured__title">Ear (3)</div>                                    </div>                <div class="subtitle__description">                                <div class="stars__reviews"><span itemprop="reviewRating" itemscope itemtype="http://schema.org/Rating" class="chunk rating"><span class="icon icon-star"> </span><span class="icon icon-star"> </span><span class="icon icon-star"> </span><span class="icon icon-star"> </span><meta itemprop="bestRating" content="100.0" /><meta itemprop="worstRating" content="0.0" /><meta itemprop="ratingValue" content="80" /></span></div>                                        <p><p>The Nothing Ear (3) are a triumph, and as the British giant’s flagships, they impress on many fronts. The sci-fi design is a treat for the eyes, and the earbuds are extremely comfortable for all-day wear. Powerful bass and nuanced vocals serve up a sonic treat, while the innovative ‘Super Mic’ case offers superb vocal clarity.</p></p>                </div>                            </div>        </div><h2 class="article-body__section" id="section-bose-quietcomfort-vs-nothing-ear-3-specs-compared"><span>Bose QuietComfort vs Nothing Ear (3): Specs compared</span></h2><div ><table><thead><tr><th class="firstcol " ><p><strong>Specs</strong></p></th><th  ><p>Bose QuietComfort</p></th><th  ><p><strong>Nothing Ear (3)</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Bose-New-QuietComfort-Earbuds-Black/dp/B0D8BZDPXB/" target="_blank" rel="nofollow">$179</a> / <a href="https://www.argos.co.uk/product/4092227/" target="_blank" rel="nofollow">£179</a></p></td><td  ><p><a href="https://www.amazon.com/Nothing-Wireless-Cancelling-Bluetooth-Headphones/dp/B0FHWM1D2Y/" target="_blank" rel="nofollow">$179</a> / <a href="https://www.amazon.co.uk/Nothing-Adaptative-Cancelling-Headphones-Compatible/dp/B0FHWM1D2Y/" target="_blank" rel="nofollow">£179</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black, Chilled Lilac, White Smoke</p></td><td  ><p>Black, White</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>20Hz-20,000Hz</p></td><td  ><p>20Hz-40,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life (ANC on)</strong></p></td><td  ><p>8.5 hours, 31.5 hours (charging case)</p></td><td  ><p>5.5 hours, 22 hours (charging case)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life (ANC off)</strong></p></td><td  ><p>Not specified</p></td><td  ><p>10 hours, 38 hours (charging case)</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>Yes</p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>2</p></td><td  ><p>2</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth 5.4 with AAC, SBC and Bluetooth LE</p></td><td  ><p>Bluetooth 5.4 with SBC, AAC and LDAC</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>0.29oz (each bud)</p></td><td  ><p>0.18oz (each bud)</p></td></tr><tr><td class="firstcol " ><p><strong>Durability</strong></p></td><td  ><p>IPX4</p></td><td  ><p>IP54</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-bose-quietcomfort-vs-nothing-ear-3-price"><span>Bose QuietComfort vs Nothing Ear (3): Price</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Lz7GqtGvwgamHhXCGX9nbM" name="Bose_QuietComfort_Earbuds_ 4.JPG" alt="A pair of chilled lilac Bose QuietComfort Earbuds (2024)" src="https://cdn.mos.cms.futurecdn.net/Lz7GqtGvwgamHhXCGX9nbM.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 Bose QuietComfort and the Nothing Ear (3) cost the same in the U.S. and in the U.K. You can grab the QuietComfort for <a href="https://www.amazon.com/Bose-New-QuietComfort-Earbuds-Black/dp/B0D8BZDPXB/" target="_blank" rel="nofollow">$179 at Amazon U.S.</a> / <a href="https://www.argos.co.uk/product/4092227/" target="_blank" rel="nofollow">£179 at Argos U.K.</a>, and the Ear (3) for <a href="https://www.amazon.com/Nothing-Wireless-Cancelling-Bluetooth-Headphones/dp/B0FHWM1D2Y/" target="_blank" rel="nofollow">$179</a> / <a href="https://www.amazon.co.uk/Nothing-Adaptative-Cancelling-Headphones-Compatible/dp/B0FHWM1D2Y/" target="_blank" rel="nofollow">£179 at Amazon</a>. Since the QuietComfort have been out for longer, you can often find them for $129 / £129 during sales events. The Ear (3) are yet to receive a substantial price drop.</p><p>The QuietComfort and the Ear (3) do more than enough to justify their individual price tags, as you'll soon see throughout this comparison, so we'll call this round a tie.</p><p><strong>Winner: </strong>Tie</p><h2 class="article-body__section" id="section-bose-quietcomfort-vs-nothing-ear-3-design"><span>Bose QuietComfort vs Nothing Ear (3): Design</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zRmrnViA9xRSnzf8yvwZAF" name="Nothing(R)_Earbuds_004.JPG" alt="Nothing Ear (3) wireless earbuds" src="https://cdn.mos.cms.futurecdn.net/zRmrnViA9xRSnzf8yvwZAF.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 most noticeable difference between the Bose QuietComfort and the Nothing Ear (3) is the design, as they look vastly different from one another. The QuietComfort have a rounded design with rubber ‘stability bands’ that aid the earbuds' secure fit. Each bud weighs 0.29oz. An important thing to note is that the QuietComforts' look fairly bulky, even though they aren't <em>that </em>heavy. They protrude out of your ears, and while there isn't anything wrong with that, it might not be everyone's cup of tea.</p><p>The Ear (3), on the other hand, sport your classic drop-stem design — you know, the one you find on the likes of the <a href="https://www.tomsguide.com/audio/airpods/apple-airpods-pro-3-review">Apple AirPods Pro 3</a>. They look futuristic, keeping in line with the British brand's sci-fi design philosophy, and feature see-through plastic. They look very cool, and they're comfortable too, with each bud weighing just 0.18oz. As opposed to the QuietComfort, they look more inconspicuous as they don't bulge out.</p><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="GiSMuDhHZ2UksK5RqtdoeM" name="Bose_QuietComfort_Earbuds_ 9.JPG" alt="A pair of chilled lilac Bose QuietComfort Earbuds (2024)" src="https://cdn.mos.cms.futurecdn.net/GiSMuDhHZ2UksK5RqtdoeM.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 pairs of earbuds are mighty comfortable, and I haven't experienced any discomfort wearing either of them. I asked my partner, who uses the QuietComforts as her daily drivers, to try the Ear (3) and she said she almost preferred them over Bose's offering.</p><p>Touch controls on both the QuietComfort and the Ear (3) are fairly straightforward but it's worth noting that while you can use voice commands on the former, they're a bit too sensitive to these, and will often trigger on their own. The Ear (3) don't suffer from this problem, winning them the crown in this round.</p><p><strong>Winner: </strong>Nothing Ear (3)</p><h2 class="article-body__section" id="section-bose-quietcomfort-vs-nothing-ear-3-features-connectivity"><span>Bose QuietComfort vs Nothing Ear (3): Features & connectivity</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BGEZwswKFrCXBQ2hyK6ecM" name="Bose_QuietComfort_Earbuds_ 6.JPG" alt="A pair of chilled lilac Bose QuietComfort Earbuds (2024)" src="https://cdn.mos.cms.futurecdn.net/BGEZwswKFrCXBQ2hyK6ecM.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 Bose QuietComfort and the Nothing Ear (3) are chock-full of features. They both feature multipoint connectivity so you can connect them to two devices simultaneously. Each pair utilizes Bluetooth 5.4 for seamless wireless connectivity, but here's the kicker. The QuietComforts support AAC and SBC codecs but there's no aptX or lossless support. The Ear (3), on the other hand, feature LDAC, if that's something that matters deeply to you.</p><p>Other similarities between the two include effective wear detection, Google Fast Pair, Find My features, and extremely detailed and user-friendly companion apps. In terms of waterproofing and dust protection, the Ear (3) are better because they're IP54-rated as opposed to the QuietComforts being only IPX4 rated, so the latter aren't protected against dust. By a narrow margin, the Ear (3) win this round once again.</p><p><strong>Winner: </strong>Nothing Ear (3)</p><h2 class="article-body__section" id="section-bose-quietcomfort-vs-nothing-ear-3-sound-quality"><span>Bose QuietComfort vs Nothing Ear (3): Sound quality</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jcVupCw4knkaiKJc6swpJF" name="Nothing(R)_Earbuds_006.JPG" alt="Nothing Ear (3) wireless earbuds" src="https://cdn.mos.cms.futurecdn.net/jcVupCw4knkaiKJc6swpJF.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'll be honest with you: I will never recommend you spending any amount of money on a pair of earbuds that doesn't make music sound like angels are singing. Thankfully, both the Bose QuietComfort and the Nothing Ear (3) warrant recommendations here as they're both outstanding. The QuietComforts have a frequency response range of 20Hz-20KHz while the Ear (3) have a range of 20Hz-40KHz — so both cover the entire spectrum of human hearing.</p><p>In terms of vocals and the upper ranges, both the QuietComforts and the Ear (3) are excellent, delivering nuanced sound packed with plenty of detail. For instance, on the QuietComforts, Mika's high notes in 'Grace Kelly' sound pleasant, controller and never so shrill that they pierce through the rest of the track. On the Ear (3), Emily Armstrong's breathy vocals and screams in 'IGYEIH' by Linkin Park sound layered and wide, with great instrumental and vocal separation.</p><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="WEn69MFkFps8VNcnTuWBdM" name="Bose_QuietComfort_Earbuds_ 2.JPG" alt="A pair of chilled lilac Bose QuietComfort Earbuds (2024)" src="https://cdn.mos.cms.futurecdn.net/WEn69MFkFps8VNcnTuWBdM.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>Listening to 'No Chances' by Twenty One Pilots first on the QuietComforts and then on the Ear (3) revealed practically no differences. The mid- and sub-bass was textured and I could feel a steady, vibrating pressure in my ear canal through both earbuds. It also felt like I was engulfed by the driving bassline, which made for a thoroughly immersive listening experience.</p><p>While the Ear (3) and the QuietComforts are mostly on equal footing when it comes to sound quality, the Ear (3) have a tendency to make the treble sound a tad harsh at times. It isn't surprising as the Ear (3) utilize a 'V' equalizer curve so the treble can sound overzealous when this happens. In 070 Shake's 'Skin and Bones,' the "chkkk" sound of the hi-hats and cymbals pierced through the track. Though not unpleasant, it wasn't particularly enjoyable.</p><p>This is never the case on the QuietComforts. The QuietComforts' sound profile is well-balanced and refined throughout the frequency range. The winner is, therefore, clear. Sorry, Nothing.</p><p><strong>Winner: </strong>Bose QuietComfort</p><h2 class="article-body__section" id="section-bose-quietcomfort-vs-nothing-ear-3-anc"><span>Bose QuietComfort vs Nothing Ear (3): ANC</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="9JSvVuctCALT3nrhCyAkZM" name="Bose_QuietComfort_Earbuds_ 5.JPG" alt="A pair of chilled lilac Bose QuietComfort Earbuds (2024)" src="https://cdn.mos.cms.futurecdn.net/9JSvVuctCALT3nrhCyAkZM.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 active noise cancellation (ANC), there's a clear winner, and I don't think you need me to spell it out, but I'll do it anyway. The Bose QuietComfort win, <em>easily. </em>Look, Bose is the king of ANC and it's something we've all known for a while now. Whether I'm indoors or on a busy street outdoors, the QuietComforts block out 90% of sounds, so I can go about my day in peace.</p><p>This isn't to say the Nothing Ear (3)'s ANC is bad. It's very good, actually. Indoors, at least. With the Ear (3) in my ears, I can't hear the sound of my very loud mechanical keyboard, the kettle boiling or the doorbell ringing. This is also the case with the QuietComforts. Both pairs of earbuds create excellent seals to ensure no noise makes it through.</p><p>But the reason the QuietComforts win is because the Ear (3) aren't as effective outdoors. When I wear them outside, I can still hear cars whizzing past me, and the sound of the bus rattling. With the QuietComforts? Nothing. Nada. Zilch. The ANC is so good on the QuietComforts that it makes you feel lonely.</p><p><strong>Winner: </strong>Bose QuietComfort</p><h2 class="article-body__section" id="section-bose-quietcomfort-vs-nothing-ear-3-call-quality"><span>Bose QuietComfort vs Nothing Ear (3): Call quality</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aYJTmKdAQpo3fY7Drdq6EF" name="Nothing(R)_Earbuds_003.JPG" alt="Nothing Ear (3) wireless earbuds" src="https://cdn.mos.cms.futurecdn.net/aYJTmKdAQpo3fY7Drdq6EF.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 call quality, both the Bose QuietComfort and the Nothing Ear (3) are excellent, as both ensure that your voice is heard loudly and clearly on the other end. Having tested both back-to-back on a call with my partner, she said that she could hear me properly through both.</p><p>But the Ear (3) have an ace up their sleeve. Their charging case features a ‘Super Mic’ dual-microphone system which you can use by holding the 'Talk' button on the case (when the earbuds are in your ears). You can then hold up the case to your mouth and speak into it, and the 'Super Mic' will cancel out 95dB of noise so that only you can be heard. In my testing, this worked exceptionally well, as my partner said she couldn't hear the public's chatter or the cars going past me.</p><p>However, is it <em>actually </em>an advantage? Because the QuietComfort, without their own 'Super Mic' feature, effectively cancel out ambient noise so that only you can be heard. The mic on the QuietComforts' is just as good if not better than the 'Super Mic' on the Ear (3), so we'll call this round a draw.</p><p><strong>Winner: </strong>Tie</p><h2 class="article-body__section" id="section-bose-quietcomfort-vs-nothing-ear-3-battery-life"><span>Bose QuietComfort vs Nothing Ear (3): Battery life</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rT4ZNTVMdnUkDfkq4F8zaM" name="Bose_QuietComfort_Earbuds_ 7.JPG" alt="A pair of chilled lilac Bose QuietComfort Earbuds (2024)" src="https://cdn.mos.cms.futurecdn.net/rT4ZNTVMdnUkDfkq4F8zaM.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'm not exaggerating when I say the Nothing Ear (3)'s battery life is disappointing because that's exactly what it is: subpar and underwhelming. And the Bose QuietComforts have them easily beat. With ANC enabled in my testing, the Ear (3) died after 5 hours, and they're officially rated for 5.5 with an additional 16.5 hours from the charging case.</p><p>The QuietComforts, on the other hand, comfortably lasted me nearly 9 hours, and they're officially rated for 8.5 with an additional two and a half charges from the case. The QuietComforts are far more reliable, and though Bose doesn't specify how long they can last with ANC off, we can safely assume it's a long time — the Ear (3) can last 10 hours with an additional 28 hours from the case when ANC is disabled.</p><p><strong>Winner: </strong>Bose QuietComfort</p><h2 class="article-body__section" id="section-bose-quietcomfort-vs-nothing-ear-3-verdict"><span>Bose QuietComfort vs Nothing Ear (3): Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TAmSazdAE3BZSXK7BSqueM" name="Bose_QuietComfort_Earbuds_ 8.JPG" alt="A pair of chilled lilac Bose QuietComfort Earbuds (2024)" src="https://cdn.mos.cms.futurecdn.net/TAmSazdAE3BZSXK7BSqueM.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There's no denying that the Nothing Ear (3) are extremely competent earbuds. I've absolutely loved testing them and I've been using them ever since I reviewed them. But are they better than the Bose QuietComfort, the undisputed kings of mid-range ANC? By a tight margin, yes.</p><p>The QuietComforts win in the sound quality, ANC and battery life departments, while they're tied with the Ear (3) in the price and call quality rounds. While the Ear (3) win in the design, features and connectivity departments, when it comes down to it, the QuietComforts simply offer more bang for your buck.</p><p>Most people care the most about sound quality and ANC, and if you're one of those folks, then the QuietComforts are easily the way to go. Still not convinced? Check out my full <a href="https://www.tomsguide.com/audio/earbuds/bose-quietcomfort-earbuds-2024-review">Bose QuietComfort review</a> and <a href="https://www.tomsguide.com/audio/earbuds/nothing-ear-3-review">Nothing Ear (3) review</a> for the detail breakdown.</p><h2 class="article-body__section" id="section-bose-quietcomfort-vs-nothing-ear-3-ratings-scorecard"><span>Bose QuietComfort vs Nothing Ear (3): Ratings scorecard</span></h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Bose QuietComfort</p></th><th  ><p>Nothing Ear (3)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price and value (5)</strong></p></td><td  ><p>5</p></td><td  ><p>5</p></td></tr><tr><td class="firstcol " ><p><strong>Design (15)</strong></p></td><td  ><p>12</p></td><td  ><p>14</p></td></tr><tr><td class="firstcol " ><p><strong>Controls (10)</strong></p></td><td  ><p>7</p></td><td  ><p>10</p></td></tr><tr><td class="firstcol " ><p><strong>Sound quality (25)</strong></p></td><td  ><p>25</p></td><td  ><p>22</p></td></tr><tr><td class="firstcol " ><p><strong>Active noise cancelation (20)</strong></p></td><td  ><p>20</p></td><td  ><p>15</p></td></tr><tr><td class="firstcol " ><p><strong>Call quality (10)</strong></p></td><td  ><p>9</p></td><td  ><p>9</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity (5)</strong></p></td><td  ><p>4</p></td><td  ><p>5</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life (10)</strong></p></td><td  ><p>8</p></td><td  ><p>5</p></td></tr><tr><td class="firstcol " ><p><strong>Total Score (100)</strong></p></td><td  ><p>90</p></td><td  ><p>85</p></td></tr></tbody></table></div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OKQwKe"></div>                            </div>                            <script src="https://kwizly.com/embed/OKQwKe.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/earbuds/bose-quietcomfort-earbuds-2024-review">Bose QuietComfort Earbuds (2024) review: These mid-range earbuds reign supreme</a></li><li><a href="https://www.tomsguide.com/audio/earbuds/nothing-ear-3-review">I’ve been testing the Nothing Ear (3) for a week — they look super stylish but the sound is the real star</a></li><li><a href="https://www.tomsguide.com/us/best-wireless-earbuds,review-6160.html">Best wireless earbuds in 2026</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested the Apple AirPods Max 2 vs the Bose QuietComfort Ultra — and I'm so impressed ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/headphones/apple-airpods-max-2-vs-bose-quietcomfort-ultra</link>
                                                                            <description>
                            <![CDATA[ I compared the brand-new Apple AirPods Max 2 with the reigning champ of ANC, the Bose QuietComfort Ultra 2nd Gen to see which premium headphones are the best. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TW7Auj6vVVGSzSoBRPbzCi</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/bpL97bVHdER3m3QjKogUQ8-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Apr 2026 05:45:00 +0000</pubDate>                                                                                                                                <updated>Mon, 18 May 2026 11:56:10 +0000</updated>
                                                                                                                                            <category><![CDATA[Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                                                                <author><![CDATA[ erin.bashford@futurenet.com (Erin Bashford) ]]></author>                    <dc:creator><![CDATA[ Erin Bashford ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/rLvJvJVZx43hEzSsJy3BpL.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Erin Bashford is a senior reviews writer at Tom’s Guide. She has a Master’s in Broadcast and Digital Journalism from the University of East Anglia and 7 years of experience reviewing music and events for various publications. She has edited publications such as Outline Magazine’s Guide to Norwich, and she has written for a number of music magazines and websites such as Clash Magazine, Outline Magazine and Dork Magazine. She has a strong interest in audio gear and the music world. &lt;/p&gt;&lt;p&gt;As an ex-barista, Erin is passionate about coffee tech. She also loves finding the best cooking hacks and kitchen appliances, including her beloved Instant Pot. &lt;/p&gt;&lt;p&gt;In her spare time, you can find her reading, practising yoga, hiking, writing fantasy novels, or stressing over NYT Games.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/bpL97bVHdER3m3QjKogUQ8-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[the bose quietcomfort ultra gen 2 headphones in black photographed on a blue tom&#039;s guide background]]></media:description>                                                            <media:text><![CDATA[the bose quietcomfort ultra gen 2 headphones in black photographed on a blue tom&#039;s guide background]]></media:text>
                                <media:title type="plain"><![CDATA[the bose quietcomfort ultra gen 2 headphones in black photographed on a blue tom&#039;s guide background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/bpL97bVHdER3m3QjKogUQ8-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div class="featured_product_block featured_block_versus" data-id="dd045275-bdc9-4ab6-b600-32b9e60c109c">            <a href="https://www.apple.com/shop/buy-airpods/airpods-max-2" data-model-name="AirPods Max 2" 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/TSi2XMUrFhYn5nqrGBsd59.jpg" alt="the airpods max 2 on a white background showing all the color options"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                            <div class='featured__brand'>Apple</div>                    <div class="featured__title">AirPods Max 2</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_versus" data-id="ad358b3c-a752-480b-8bee-6a2b3141c7c4">            <a href="https://www.amazon.com/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G" data-model-name="QuietComfort Ultra Gen 2" 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/iPfpWwrQeGYvMmxuZPCecS.jpg" alt="Bose QuietComfort Ultra Headphones gen 2"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                            <div class='featured__brand'>Bose</div>                    <div class="featured__title">QuietComfort Ultra Gen 2</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div><p>The <a href="https://tomsguide.com/audio/headphones/apple-airpods-max-2-review">AirPods Max 2</a> are the most exciting audio release of 2026. Apple fans have been waiting since 2020 to see an upgraded model of the flagship over-ears, and I awarded them a 4.5-star rating in my review. The unbeatable sound quality, the much-improved ANC, and the plethora of features makes them some of the <a href="https://www.tomsguide.com/us/best-headphones,review-1988.html">best headphones</a> money can buy right now. </p><p>But this got me thinking: how do the AirPods Max 2 compare to the <a href="https://www.tomsguide.com/us/best-noise-cancelling-headphones,review-5566.html">best noise-cancelling headphones</a>, the <a href="https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review">Bose QuietComfort Ultra 2nd Gen</a>?<a href="https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review"> </a>Bose gear is the reigning champion of ANC — Dr. Bose literally invented ANC — and the QC Ultra 2 are widely considered industry-leading cans. </p><p>To find out which cans come out on top, keep reading this AirPods Max 2 vs Bose QuietComfort Ultra showdown. </p><h2 class="article-body__section" id="section-airpods-max-2-vs-bose-quietcomfort-ultra-specs"><span>AirPods Max 2 vs Bose QuietComfort Ultra: Specs</span></h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Bose QuietComfort Ultra Gen 2</strong></p></th><th  ><p><strong>AirPods Max 2</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G" target="_blank" rel="nofollow">$449</a>/<a href="https://www.amazon.co.uk/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G" target="_blank" rel="nofollow">£449</a></p></td><td  ><p><a href="https://www.apple.com/shop/buy-airpods/airpods-max-2" target="_blank" rel="nofollow">$549</a>/<a href="https://www.apple.com/uk/shop/buy-airpods/airpods-max-2" target="_blank" rel="nofollow">£499</a></p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth 5.4</p></td><td  ><p>Bluetooth 5.3</p></td></tr><tr><td class="firstcol " ><p><strong>ANC</strong></p></td><td  ><p>Yes </p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Durability</strong></p></td><td  ><p>No IP rating</p></td><td  ><p>No IP rating</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>30 hours</p></td><td  ><p>20 hours</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>8.8 ounces</p></td><td  ><p>13.6 ounces</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>7.7 x 5.5 x 2 inches</p></td><td  ><p>7.4 x 6.6 x 3.28 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black, white, navy, beige, black/gold</p></td><td  ><p>Starlight, midnight, orange, purple, blue</p></td></tr><tr><td class="firstcol " ><p><strong>Compatibility </strong></p></td><td  ><p>iOS, Android </p></td><td  ><p>iOS, Android</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-airpods-max-2-vs-bose-quietcomfort-ultra-price"><span>AirPods Max 2 vs Bose QuietComfort Ultra: Price</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gZWzARxqgTgogm2hv3A5R8" name="Bose_04.JPG" alt="the bose quietcomfort ultra gen 2 headphones in black photographed on a blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/gZWzARxqgTgogm2hv3A5R8.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 AirPods Max 2 are the same price as their predecessor: <a href="https://www.apple.com/shop/buy-airpods/airpods-max-2" target="_blank" rel="nofollow">$549 in the U.S.</a> and <a href="https://www.apple.com/uk/shop/buy-airpods/airpods-max-2" target="_blank" rel="nofollow">£499 in the U.K.</a>. This makes the AirPods Max 2 some of the most expensive lifestyle Bluetooth headphones on the market right now. </p><p>Sure, the AirPods Max 2 sound awesome, and are the perfect cans for someone like me — loads of Apple gear, loves wide, rich soundscapes with loud-but-not-overpowering bass — but I won't pretend they're not overpriced. </p><p>Of the "main players", only the <a href="https://www.tomsguide.com/audio/over-ear-headphones/i-just-tested-these-impeccable-hi-res-headphones-and-they-blow-away-the-airpods-max">Bowers & Wilkins PX8 S2</a> ($799), <a href="https://www.tomsguide.com/audio/over-ear-headphones/bang-and-olufsen-beoplay-h95-review-headphones">Bang & Olufsen Beoplay H95 </a>($1,200) and the <a href="https://www.tomsguide.com/audio/i-just-tested-these-usd1-299-headphones-with-magnesium-drivers-and-they-could-be-your-next-pair-of-premium-anc-cans">Focal Bathys MG</a> ($1,099) outprice the AirPods Max. </p><p>The Bose QuietComfort Ultra 2nd Gen are relatively affordable by comparison — <a href="https://www.amazon.com/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G" target="_blank" rel="nofollow">$449 in the U.S.</a> and <a href="https://www.amazon.co.uk/Bose-QuietComfort-Bluetooth-Headphones-Cancelling/dp/B0FDKR293G" target="_blank" rel="nofollow">£449 in the U.K.</a>. For your $449, you get industry-leading ANC, supreme comfort, and bass-heavy sound — for most customers, the "holy trifecta" of headphone features. </p><p>The $100 saving makes the Bose more in-keeping with the rest of the flagship Bluetooth headphone market: the <a href="https://www.tomsguide.com/audio/over-ear-headphones/sony-wh-1000xm6-review">Sony </a><a href="https://www.tomsguide.com/audio/over-ear-headphones/sony-wh-1000xm6-review">WH-1000XM6</a> are $449, and the <a href="https://www.tomsguide.com/reviews/beats-studio-pro-review">Beats Studio Pro</a> are $349. I also recently tested the <a href="https://www.tomsguide.com/audio/headphones/nothing-headphone-a-review">Nothing Headphone (a)</a>, which, granted, don't sound anywhere near as good as the AirPods Max 2 or Bose QC Ultra, but will set you back just $199. </p><p><strong>Winner: </strong>Bose QuietComfort Ultra 2nd Gen.</p><h2 class="article-body__section" id="section-airpods-max-2-vs-bose-quietcomfort-ultra-design"><span>AirPods Max 2 vs Bose QuietComfort Ultra: Design</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SuHi77PnUWBh5LTUcebjPF" name="AirpodsMax2_15.JPG" alt="the apple airpods max 2 in blue photographed against a blue tom's guide background, showing the mesh headband, anodized aluminum ear cups, carry case, and controls" src="https://cdn.mos.cms.futurecdn.net/SuHi77PnUWBh5LTUcebjPF.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 AirPods Max 2 take the award for "prettiest headphones", hands down. There are some things Apple dominates the market in, and design is one of them. The AirPods Max 2 look and feel like the premium cans they are: gorgeous, shiny ear cups, intuitive controls, and a weight-bearing mesh headband that prevents headphone headaches as much as possible. </p><p>In comparison, the Bose QuietComfort Ultra 2nd Gen look a little, dare I say, <em>cheap</em>. </p><p>Of course, there are swings and roundabouts here: the AirPods Max 2 look and feel more premium, but they're incredibly heavy. Conversely, the Bose QC Ultra feel a little cheaper and they're not as pretty, but they're almost half the weight of the AirPods, and are much comfier to wear for long periods. </p><p>Your preference will, of course, depend on you. Would you rather a sleek metal-forward design, or a slightly plasticky, yet lightweight finish? </p><p>Personally, I prefer the look and feel of the AirPods Max. </p><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="NMgcqPf9GriRiKThvRs9P8" name="Bose_02.JPG" alt="the bose quietcomfort ultra gen 2 headphones in black photographed on a blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/NMgcqPf9GriRiKThvRs9P8.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>Controls are also a slam-dunk for Apple: everything is managed via two tactile buttons on the right cup. You've got Apple's "Digital Crown" for things like play/pause, Siri, and volume. The tab-shaped button controls ANC. </p><p>The Bose controls are a little confusing, and took me a while to get used to. You adjust the volume by rubbing the underside of the right cup. To pause, you press the multi-function button on the right cup — while searching for this, I accidentally increased the volume. </p><p>You also use this button to switch between Immersion, Quiet, and Aware modes. You cannot turn ANC off on the Bose cans. </p><p>For me, this choice was easy. Yes, I am begging Apple to make the AirPods Max lighter, but the easy controls and premium appearance means the Maxes take this round. </p><p><strong>Winner: </strong>AirPods Max 2. </p><h2 class="article-body__section" id="section-airpods-max-2-vs-bose-quietcomfort-ultra-features-connectivity"><span>AirPods Max 2 vs Bose QuietComfort Ultra: Features & connectivity</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SFZsRLkZwDr2CuvgqXtCEF" name="AirpodsMax2_07.JPG" alt="the apple airpods max 2 in blue photographed against a blue tom's guide background, showing the mesh headband, anodized aluminum ear cups, carry case, and controls" src="https://cdn.mos.cms.futurecdn.net/SFZsRLkZwDr2CuvgqXtCEF.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you're deep in the Apple ecosystem, on the surface it makes more sense to get the AirPods Max 2 as they integrate seamlessly with your iPhone and MacBook. </p><p>However, there's much, much more to both the AirPods Max 2 and the Bose QuietComfort Ultra than that. The Bose QC Ultra also have multipoint connectivity; I was able to connect to my iPhone 16 Pro and MacBook Air M2 and switch between both just as easily. </p><p>The Bose run on Bluetooth 5.4, and the AirPods Max 2 have Blueooth 5.3. I'm surprised to see such "old" Bluetooth versions on flagship new products, especially as Samsung launched its Galaxy Buds 4 line with Bluetooth 6.1 just weeks before the AirPods Max 2. </p><p>Although there aren't any life-changing differences between Bluetooth 5.3 and Bluetooth 6.1, the more modern version helps future-proof the product and allows for a wider and more reliable connection. I'd like to see both Bose and Apple go for the 6.1 version with its next releases. </p><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="Mb8EpD8Sj6Sy34JCqvZ8P8" name="Bose_03.JPG" alt="the bose quietcomfort ultra gen 2 headphones in black photographed on a blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/Mb8EpD8Sj6Sy34JCqvZ8P8.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>Connectivity complaints aside, both the AirPods Max 2 and Bose QC Ultra boast a huge range of features, some more "modern" than the others. </p><p>Apple has gone for a more "smart tech" angle with the AirPods Max 2, stuffing the cans with Live Translation, Siri integration, a camera remote for your iPhone — no, I'm not joking — and AirPods Pro functions like Conversation Awareness. </p><p>Bose has leaned more into the "do one thing and do it really well" angle. Instead of these smart features, the QC Ultra 2nd Gen sound great, feel great, and have supreme ANC. So while you won't be able to translate other languages while on vacation, your long-haul flight to your holiday destination will be a heck of a lot comfier with the Bose. </p><p>It really depends on what you personally look for in a pair of headphones, but seeing as the AirPods Max 2 offer way more features, I'm giving Apple the win. </p><p><strong>Winner: </strong>AirPods Max 2. </p><h2 class="article-body__section" id="section-airpods-max-2-vs-bose-quietcomfort-ultra-sound-quality"><span>AirPods Max 2 vs Bose QuietComfort Ultra: Sound quality</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SusawEdjBMCisMriTJVuRF" name="AirpodsMax2_13.JPG" alt="the apple airpods max 2 in blue photographed against a blue tom's guide background, showing the mesh headband, anodized aluminum ear cups, carry case, and controls" src="https://cdn.mos.cms.futurecdn.net/SusawEdjBMCisMriTJVuRF.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Alright, now let's get into the meat of it: sound quality. </p><p>Apple and Bose gear have different sound signatures, so they will, inevitably, sound different. While Apple goes for a more expansive, immersive, and detail-focused soundscape, Bose offers a deeper, richer, and bassier listening experience. </p><p>There's no right or wrong way to do sound, so your personal preference will likely differ from mine. I lean more towards the Apple side of the spectrum — I like immersive music that handles bass with clarity and focus and allows each layer of the track to shine. </p><p>That's not to say I dislike Bose's sound — not at all. The QuietComfort Ultra sound immense, with powerful, bass-driven energy and clarity across most of the frequency range. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="S4AtKKTKEMpjASJTwp4LQ8" name="Bose_01.JPG" alt="the bose quietcomfort ultra gen 2 headphones in black photographed on a blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/S4AtKKTKEMpjASJTwp4LQ8.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 played the same three songs via Spotify Lossless to even the playing field — using Apple Music would be unfair in favor of the AirPods Max 2 — and analyzed each track independently. </p><p>First, I played an electronic track: "Birth4000" by Floating Points. This song is built over a glitchy, fearless synth bassline and electronic hi-hats, clattering tambourines playing in the background, and a punchy kick-drum keeping the whole thing going. </p><p>The QC Ultra handled this track excellently, unafraid of the pulsing, glitchy bassline, not allowing the kick drum to get lost in the melee. Even so, the low-end was the most pronounced part of the track, somewhat overshadowing delicate high-frequency stereo effects in the left ear. </p><p>When I played this track with the AirPods Max 2, I was surprised to hear a squeaky, wobbly sound effect in the left ear. In the Bose cans, this was almost completely overpowered by bass. </p><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="YxRm6Az2tYdUsWnHyUGZFF" name="AirpodsMax2_16.JPG" alt="the apple airpods max 2 in blue photographed against a blue tom's guide background, showing the mesh headband, anodized aluminum ear cups, carry case, and controls" src="https://cdn.mos.cms.futurecdn.net/YxRm6Az2tYdUsWnHyUGZFF.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 also listened to "Regular John" by Queens of the Stone Age, a heavy rock track with raucous bass and a rich rhythm guitar section. The AirPods Max 2 handled the vocals fantastically, clearly separating them from the rich instrumental and focusing on the texture in Homme's voice. </p><p>Comparatively, I think this song sounded a little muddied in the Bose QC Ultra, like all the sonic layers were competing for the same volume and the same point on the frequency range. </p><p>The AirPods Max 2 made this song sound much more expansive and wide, and separated the instruments with more precision. </p><p>Finally, I played "Run Your Mouth" by the Marias, a soul-pop track with funky basslines and sunsoaked synth layers. The breathy vocal and soulful guitars sounded clear and balanced through the AirPods Max 2, and the samba-esque bass didn't overpower the vocals. When I listened with the QuietComfort Ultra, the vocals were equally as effective, but the bass and kick drum were brought forward, rather than the synth chord progressions. </p><p>Sound is a very subjective experience, but I personally prefer the wider, clearer soundscape of the AirPods Max 2. </p><p><strong>Winner: </strong>AirPods Max 2. </p><h2 class="article-body__section" id="section-airpods-max-2-vs-bose-quietcomfort-ultra-anc"><span>AirPods Max 2 vs Bose QuietComfort Ultra: ANC</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="7GSq4MwV53yqyht3gU9BR8" name="Bose_06.JPG" alt="the bose quietcomfort ultra gen 2 headphones in black photographed on a blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/7GSq4MwV53yqyht3gU9BR8.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 goes without saying that Bose wins this round. Spoilers, guys, sorry. But, yeah, Bose is still the undefeated champion of ANC. What can I say? The company invented it. </p><p>No other headphones come close. When I was testing the QC Ultra around the city, I couldn't hear a single car. No engines, no buses, no motorbikes. I was in my own little bubble, just me and my music against the world. </p><p>It is a little frustrating that you can't turn off ANC at all — unlike on AirPods, there's no 'Off' mode, just 'Immersive', 'Quiet', and 'Aware' — as this will inevitably drain the battery a little more. </p><p>Even so, the clue's in the name — <em>Quiet</em>Comfort, after all. You buy Bose cans for the ANC. </p><p>In comparison, Apple's ANC is good, but not quite Bose-level yet. I could still hear a few high-frequency sounds leaking through, but most of the low, grumbly environmental noise — like car engines — was blocked out. </p><p><strong>Winner: </strong>Bose QuietComfort Ultra</p><h2 class="article-body__section" id="section-airpods-max-2-vs-bose-quietcomfort-ultra-call-quality"><span>AirPods Max 2 vs Bose QuietComfort Ultra: Call quality</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Vq8Z9qHwR7AEdHeZkcZ9nE" name="AirpodsMax2_01.JPG" alt="the apple airpods max 2 in blue photographed against a blue tom's guide background, showing the mesh headband, anodized aluminum ear cups, carry case, and controls" src="https://cdn.mos.cms.futurecdn.net/Vq8Z9qHwR7AEdHeZkcZ9nE.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>We've reached a point where all flagship headphones have identical call quality. There's no way around it. It just is. </p><p>Apple claims the AirPods Max 2 have a "studio-quality" microphone. While I'd rather have one of the <a href="https://www.tomsguide.com/best-picks/best-microphones">best microphones</a> if I were a content creator or vocalist, I will say that, on work calls, my colleagues reported my voice sounded clear and clean. </p><p>Comparatively, the QC Ultra have 12 mics (as opposed to the AirPods' one), but my call recipients couldn't tell the difference between each headphone. </p><p>I think you could use either for work calls or personal calls, and you would sound crystal clear and audible, even in loud environments. </p><p><strong>Winner: </strong>Draw. </p><h2 class="article-body__section" id="section-airpods-max-2-vs-bose-quietcomfort-ultra-battery"><span>AirPods Max 2 vs Bose QuietComfort Ultra: Battery</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="qByoRqBT5yHC3DPHjNGi2F" name="AirpodsMax2_04.JPG" alt="the apple airpods max 2 in blue photographed against a blue tom's guide background, showing the mesh headband, anodized aluminum ear cups, carry case, and controls" src="https://cdn.mos.cms.futurecdn.net/qByoRqBT5yHC3DPHjNGi2F.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 a bit of a sore spot for AirPods Max users. The original Maxes tapped out at 20 hours, which, even in 2020, trailed far behind the industry standard of ~30 hours (ANC on). </p><p>So, imagine my surprise when the AirPods Max 2 were released with <em>the same</em> battery life. 20 hours in 2020 was one thing — 20 hours in 2026 is wildly audacious. Apple claims the battery's "efficiency" has been improved, but it's still 20 hours. </p><p>The Bose QC Ultra have a 30-hour battery life (ANC on, as you cannot turn it off), which drops down to 23 hours with 'Immersive' ANC mode on.</p><p>This is still not particularly impressive: I recently tested the $199 <a href="https://www.tomsguide.com/audio/headphones/nothing-headphone-a-review">Nothing Headphone (a)</a>, which last for a jaw-dropping 135 hours on a single charge, 75 hours with ANC on. This is incomprehensibly long. If you wore the headphones from the moment you stepped through the office door until the moment you left, you'd get almost two weeks out of the Nothing cans. </p><p>Sure, they're probably driving much less power than the AirPods Max and the QuietComfort Ultra, but you'd hope the two behemoths of audio could outlast a relatively new, underdog British company. </p><p>So, while the Bose technically win this round, I really want to give the win to Nothing. </p><p><strong>Winner: </strong>Bose QuietComfort Ultra.</p><h2 class="article-body__section" id="section-airpods-max-2-vs-bose-quietcomfort-ultra-verdict"><span>AirPods Max 2 vs Bose QuietComfort 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bpL97bVHdER3m3QjKogUQ8" name="Bose_05.JPG" alt="the bose quietcomfort ultra gen 2 headphones in black photographed on a blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/bpL97bVHdER3m3QjKogUQ8.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 Bose QuietComfort Ultra 2nd Gen and the AirPods Max 2 are excellent, flagship cans worthy of the praise directed at them. You wouldn't be disappointed with either headphone — both are sleek, sound great, and have fantastic ANC. </p><p>Of course, the Bose QC Ultra block out a touch more sound and are a little comfier for longer periods, but personally? I'm going for the AirPods Max 2. I prefer Apple's wider, more complex sound tuning (true of AirPods Pro, too). The seamless connection between my iPhone, MacBook, and work MacBook makes shifting between devices a breeze. </p><p>If you prefer a bassier soundscape and you travel a lot, I would recommend the Bose QuietComfort Ultra over the AirPods Max 2. But if, like me, you predominantly use your headphones for work and running errands, and you have a lot of Apple gear, it's gotta be the AirPods Max 2. These cans took the term "flagship" and ran with it. </p><h2 class="article-body__section" id="section-airpods-max-2-vs-bose-quietcomfort-ultra-ratings-scorecard"><span>AirPods Max 2 vs Bose QuietComfort Ultra: Ratings scorecard</span></h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>AirPods Max 2</strong></p></th><th  ><p><strong>Bose QuietComfort Ultra 2nd Gen</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price (5)</strong></p></td><td  ><p>3</p></td><td  ><p>4</p></td></tr><tr><td class="firstcol " ><p><strong>Design & controls (15)</strong></p></td><td  ><p>12</p></td><td  ><p>8</p></td></tr><tr><td class="firstcol " ><p><strong>Features (10)</strong></p></td><td  ><p>8</p></td><td  ><p>7</p></td></tr><tr><td class="firstcol " ><p><strong>Sound quality (25)</strong></p></td><td  ><p>24</p></td><td  ><p>20</p></td></tr><tr><td class="firstcol " ><p><strong>ANC (20)</strong></p></td><td  ><p>19</p></td><td  ><p>20</p></td></tr><tr><td class="firstcol " ><p><strong>Call quality (10)</strong></p></td><td  ><p>9</p></td><td  ><p>9</p></td></tr><tr><td class="firstcol " ><p><strong>Battery (15)</strong></p></td><td  ><p>8</p></td><td  ><p>11</p></td></tr><tr><td class="firstcol " ><p><strong>Total score (100)</strong></p></td><td  ><p>83</p></td><td  ><p>77</p></td></tr></tbody></table></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Forget Bose — there's no better party speaker on the planet than the brand-new Marshall Bromley 450 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/bluetooth-speakers/forget-the-bose-s1-pro-the-brand-new-marshall-bromley-450-just-redefined-party-speakers</link>
                                                                            <description>
                            <![CDATA[ I've been testing the brand-new Marshall Bromley 450 party speaker. It sounds incredible and looks beautiful. It's my top pick for the party speaker of 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">5UnLEb5Yw2877Lh3avGFdk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MmD4jwNm73MR7Xi7KzsMh3-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 17 Mar 2026 13:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Bluetooth Speakers]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Speakers]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/MmD4jwNm73MR7Xi7KzsMh3-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Marshall Bromley 450]]></media:description>                                                            <media:text><![CDATA[Marshall Bromley 450]]></media:text>
                                <media:title type="plain"><![CDATA[Marshall Bromley 450]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MmD4jwNm73MR7Xi7KzsMh3-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>One thing I love about my job is that there's never a shortage of audio gear to test: When I'm listening on my own, I use the <a href="https://www.tomsguide.com/audio/headphones/marshall-monitor-iii-review">Marshall Monitor III</a> over-ear headphones. When I'm chilling with my partner or we're hanging out with friends, I turn to one of the <a href="https://www.tomsguide.com/us/best-bluetooth-speakers,review-1982.html">best Bluetooth speakers</a>. And if we're having a party? It's gotta be a party speaker — and there are few (if any) better than the <a href="https://www.tomsguide.com/audio/bluetooth-speakers/marshall-bromley-450-review">Marshall Bromley 450</a>.</p><p>The Bromley 450 is the British audio giant's second-ever party speaker, and it joined its bigger sibling, the <a href="https://www.tomsguide.com/audio/bluetooth-speakers/marshall-bromley-750-review">Bromley 750</a>, in March 2026. I was one of the first reviewers to test the Bromley 450, and I immediately fell in love with it. It looks good, it sounds better, and its battery lasts oh-so-long. I've found it difficult to fault, really, and testing the Bromley 450 got me thinking, "Does it sound better than other party speakers in the same price range?"</p><div class="product"><a data-dimension112="8daa9b1a-d6a9-47d1-91d7-b2a175b6076c" data-action="Deal Block" data-label="A plethora of wired and wireless connectivity options make the Marshall Bromley 450 not just a powerful speaker, but a stunning amp and karaoke machine as well. Music sounds glorious and highly detailed across genres, while Auracast works like a charm, and the reactive LED lighting helps with your immersion. 40-hour battery life and IP55 waterproofing make it a winner." data-dimension48="A plethora of wired and wireless connectivity options make the Marshall Bromley 450 not just a powerful speaker, but a stunning amp and karaoke machine as well. Music sounds glorious and highly detailed across genres, while Auracast works like a charm, and the reactive LED lighting helps with your immersion. 40-hour battery life and IP55 waterproofing make it a winner." data-dimension25="$799" href="https://www.amazon.com/Marshall-Bromley-Portable-Party-Speaker/dp/B0G62KZ7XD/" 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="wVVXS5Du7Xwe7pPYGv3xVS" name="Bromley-450-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wVVXS5Du7Xwe7pPYGv3xVS.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A plethora of wired and wireless connectivity options make the Marshall Bromley 450 not just a powerful speaker, but a stunning amp and karaoke machine as well. Music sounds glorious and highly detailed across genres, while Auracast works like a charm, and the reactive LED lighting helps with your immersion. 40-hour battery life and IP55 waterproofing make it a winner.<a class="view-deal button" href="https://www.amazon.com/Marshall-Bromley-Portable-Party-Speaker/dp/B0G62KZ7XD/" target="_blank" rel="nofollow" data-dimension112="8daa9b1a-d6a9-47d1-91d7-b2a175b6076c" data-action="Deal Block" data-label="A plethora of wired and wireless connectivity options make the Marshall Bromley 450 not just a powerful speaker, but a stunning amp and karaoke machine as well. Music sounds glorious and highly detailed across genres, while Auracast works like a charm, and the reactive LED lighting helps with your immersion. 40-hour battery life and IP55 waterproofing make it a winner." data-dimension48="A plethora of wired and wireless connectivity options make the Marshall Bromley 450 not just a powerful speaker, but a stunning amp and karaoke machine as well. Music sounds glorious and highly detailed across genres, while Auracast works like a charm, and the reactive LED lighting helps with your immersion. 40-hour battery life and IP55 waterproofing make it a winner." data-dimension25="$799">View Deal</a></p></div><p>Luckily, in our testing lab, we had a Bose S1 Pro+, so I listened to it for a while and immediately knew that I preferred the Bromley 450 (sorry, Bose). There's plenty to love about the Bromley 450: from its exquisite design to the drool-worthy light show and delectable sound quality. Few brands come close to the prestige Marshall's speakers and headphones ooze, and it's no different in the case of the Bromley 450. Here's why it's my top pick for the party speaker of 2026.</p><h2 id="i-can-t-stop-staring-at-it">I can't stop staring at it</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="AJQPPonAoe5YZuUtFg5v36" name="Marshall_Bromley_450_edit-2" alt="Marshall Bromley 450 party speaker" src="https://cdn.mos.cms.futurecdn.net/AJQPPonAoe5YZuUtFg5v36.jpg" mos="" align="middle" fullscreen="" width="2048" height="1150" attribution="" endorsement="" class="inline"></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 John Keats wrote "A thing of beauty is a joy forever," he was clearly talking about the Marshall Bromley 450, because I would very much like to place it in my apartment, turn on the LED lamps, and stare at it for as long as I can. It's one of the best-looking speakers I've had the pleasure of testing. No, scratch that. It's one of the best-looking <em>anything </em>I've ever used.</p><p>I'm no stranger to speakers. I've tested many during my time as a tech journalist. I've seen the good, the bad, the ugly, and the Bromley 450 very clearly belongs in the first category. It really is a thing of beauty. Its matte black finish feels exquisite to touch and pleasing to the eye, while its brass and gold accents add a premium panache to the impressive package.</p><p>Adding to the Bromley 450's appeal are its integrated LED lamps, located behind the front grille. They light up in white and yellow, and depending on the lighting mode you choose, they can dance and react to the music you're playing too, to create an immersive light and sound show. Beautiful.</p><p>I could wax poetic about the Bromley 450 all day long if I could but I wouldn't want to bore you, of course. Marshall's trademark tactile controls are present on the Bromley 450 in spades, as you can control basically every sound and light setting via the onboard buttons and dials. Thank goodness for that because the companion app is... underwhelming, at best.</p><h2 id="no-dearth-of-features">No dearth of 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:2048px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="K35X8QaEmHo99FtG6DGJt5" name="Marshall_Bromley_450_edit-9" alt="Marshall Bromley 450 party speaker" src="https://cdn.mos.cms.futurecdn.net/K35X8QaEmHo99FtG6DGJt5.jpg" mos="" align="middle" fullscreen="" width="2048" height="1150" attribution="" endorsement="" class="inline"></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 Marshall Bromley 450 has everything you could need in a proper party speaker. Want to play music from your phone? Bluetooth 5.3 with support for SBC, AAC and LC3 codecs. Want to connect two smart devices at the same time? Multipoint connectivity. Want to plug your phone in for hi-res wired playback? 3.5mm aux or USB-C is at your disposal.</p><p>Or imagine you're hosting a party and someone says, "Hey, I brought my guitar to the party and want to serenade everyone with Oasis' Wonderwall, can I do that?" You've got the Bromley 450, so you can reply with, "My Bromley 450's got two XLR/6.35mm combo ports for guitars and RCA ports for keyboards and turntables so technically you can, but I don't want you to bore everyone with Wonderwall, so let's refrain from that." Sorry, Oasis fans, it is what it is, but at least you <em>can </em>plug your guitar into the Bromley 450 as it doubles/triples as an amp and a karaoke machine!</p><p>In addition to the connectivity options, the Bromley 450 is also protected against dust, dirt and water as it's IP55-rated, so it's perfect for outdoor parties. If you've got another Bromley 450 or 750, or even another Auracast-enabled Marshall speaker, you can sync them up any number of them to play at the same time, making the Bromley 450 even better for big parties.</p><h2 id="but-does-it-sound-good">But does it sound good?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wvM8stngxrdZPYfXrpjkY3" name="Marshall_Bromley_450_edit-18" alt="Marshall Bromley 450" src="https://cdn.mos.cms.futurecdn.net/wvM8stngxrdZPYfXrpjkY3.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Via its onboard controls, you can adjust the Marshall Bromley 450's bass, treble, add reverb and delay effects if you're using the karaoke feature or instruments, and adjust the lighting. </p><p>"Sounds great, but does the speaker sound good?" I hear you ask, and I'm here to tell you, dear reader, that it sounds <em>excellent. </em>The sound quality really doesn't give you much to complain about, and I had to be really nit-picky to find any faults with it. And the faults I found? You'll need to play around with the bass and treble dials to get the perfect sound — but apart from that, that's about it.</p><p>The Bromley 450 is a powerful, well-endowed speaker, and you can learn all about its internal hardware in my full review. All I'm going to tell you in this article is that it sounds phenomenal. I thought the treble, especially, sounded brilliant. Crisp, vibrant, never overzealous or shrill. Sibilance and plosives gave me nothing to moan about as the sounds didn't bleed into one another, especially in tracks like 'White Feather Hawk Tail Deer Hunter' by Lana Del Rey, where she ad-libs different 's' and 'tss' sounds.</p><p>This is a party speaker, though, and chances are you'll be using it to listen to dance music or bass-heavy electronic tracks, and it's the ideal speaker for high tempo music. The bass is warm with plenty of low-end impact and detail in the mid range, and it never sounds booming in tracks like 'Tomorrow is Another Day' by M-High, and you can hear each individual string pluck in songs like 'Money' by Pink Floyd. I have no notes.</p><h2 id="unlimited-powaaaaah">Unlimited powaaaaah</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="zYfLdMhk2avAjKXjixJdU3" name="Marshall_Bromley_450_edit-23" alt="Marshall Bromley 450" src="https://cdn.mos.cms.futurecdn.net/zYfLdMhk2avAjKXjixJdU3.jpg" mos="" align="middle" fullscreen="" width="2048" height="1150" attribution="" endorsement="" class="inline"></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 cherry on top of this beautiful cake is the Marshall Bromley 450's battery life. Marshall says that the speaker can last for up to 40 hours between charges. This will naturally depend on usage conditions, such as the LED lighting and volume. While I couldn't drain the entire battery during my testing period, I noticed that the battery had dropped by only 15% after six hours of listening to the speaker at full volume and with reactive lighting turned on. </p><p>What's even better is that you can remove the Bromley 450's battery pack (securely slotted in the back and protected by a hard plastic cover) and use it as a power bank for your other devices. It's got a USB-C port on it so you can plug in your headphones, phone or laptop. I think that's very cool, and it's something I loved about the Bromley 750 too.</p><p>I absolutely adore the Bromley 450. It's pretty, its sound quality is stunning, and it lasts a long, long time. What more could you possibly need?</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X1ALaX"></div>                            </div>                            <script src="https://kwizly.com/embed/X1ALaX.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/bluetooth-speakers/marshall-bromley-450-review">I’ve been testing the Marshall Bromley 450, and it might be the ‘best party speaker of 2026’</a></li><li><a href="https://www.tomsguide.com/audio/bluetooth-speakers/marshall-bromley-450-versus-marshall-bromley-750-face-off">I tested the Marshall Bromley 450 and the Marshall Bromley 750 party speakers — and the winner surprised me</a></li><li><a href="https://www.tomsguide.com/audio/bluetooth-speakers/as-a-guitarist-and-an-audiophile-this-is-the-all-in-one-speaker-ive-been-waiting-for">As a guitarist and an audiophile, this is the all-in-one speaker I’ve been waiting for</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ These 5 March Madness soundbar deals will transform your living room into courtside seats ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/soundbars/these-5-march-madness-soundbar-deals-will-transform-your-living-room-into-courtside-seats</link>
                                                                            <description>
                            <![CDATA[ If you plan on using your TV's built-in speakers to watch every game during March Madness, you better plan on missing out on some key game details. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">eX5X2cpmUsscn3BraCgVCf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qnnj8omo9K7wFrgs7ipzvU-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 15 Mar 2026 06:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Soundbars]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Speakers]]></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.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>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/qnnj8omo9K7wFrgs7ipzvU-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[the samsung q600f premium soundbar and subowoofer in black ]]></media:description>                                                            <media:text><![CDATA[the samsung q600f premium soundbar and subowoofer in black ]]></media:text>
                                <media:title type="plain"><![CDATA[the samsung q600f premium soundbar and subowoofer in black ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qnnj8omo9K7wFrgs7ipzvU-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you plan on using your TV's built-in speakers to watch every game during March Madness, you better plan on missing out on some key game details.</p><p>Whether it's a hard-to-hear announcer, inaudible band noise or the barely there chants in the crowd, TV speakers simply struggle with the multitude of fine details found in every broadcast.</p><p>The good news is that even the <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbars</a> aren't hefty investments and some models can be found for well under $500. Here's our top draft picks. For more deals, check out our guide to the best <a href="https://www.tomsguide.com/deals/march-madness-tv-sales">March Madness TV sales</a>.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong></strong><a href="https://www.amazon.com/Home-Audio-Sound-Bars/b/?ie=UTF8&node=3237803011" target="_blank" rel="nofollow"><strong>shop all soundbars at Amazon</strong></a><strong></strong></li><li><strong></strong><a href="https://www.bestbuy.com/site/speakers/sound-bars/abcat0205007.c?id=abcat0205007" target="_blank" rel="nofollow"><strong>shop all soundbars at Best Buy</strong></a><strong></strong></li><li><strong>Samsung Q600F: </strong><a href="https://www.bestbuy.com/product/samsung-q-series-hw-q600f-atmos-3-1-2-ch-soundbar-with-subwoofer-titan-black/J3ZYG2FV7Z/sku/6619392" target="_blank" rel="nofollow"><strong>was $699 now $449 @ Best Buy</strong></a><strong></strong></li><li><strong>Klipsch Flexus Core 200: </strong><a href="https://www.amazon.com/dp/B0CV6439SR/" target="_blank" rel="nofollow"><strong>was $549 now $499 @ Amazon</strong></a><strong></strong></li><li><strong>Bose Smart Soundbar: </strong><a href="https://www.amazon.com/Bose-Soundbar-Wireless-Bluetooth-Surround/dp/B0C548MYF3" target="_blank" rel="nofollow"><strong>was $899 now $729 @ Amazon</strong></a><strong></strong></li><li><strong>LG S90TR: </strong><a href="https://www.amazon.com/dp/B0CX41212N/" target="_blank" rel="nofollow"><strong>was $1,199 now $796 @ Amazon</strong></a><strong></strong></li><li><strong>Samsung Q990F: </strong><a href="https://www.amazon.com/dp/B0DY1XTF77/" target="_blank" rel="nofollow"><strong>was $1,697 now $1,597 @ Amazon</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-best-soundbar-deals"><span>Best soundbar deals</span></h3><div class="product"><a data-dimension112="2d182a03-bf4a-462f-8947-71c66d39b617" data-action="Deal Block" data-label="This is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it." data-dimension48="This is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it." data-dimension25="$449" href="https://www.bestbuy.com/product/samsung-q-series-hw-q600f-atmos-3-1-2-ch-soundbar-with-subwoofer-titan-black/J3ZYG2FV7Z/sku/6619392" 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:120.00%;"><img id="ExfR2TSGT2maYw6G6JSFS5" name="Samsung Q600F" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ExfR2TSGT2maYw6G6JSFS5.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it. <a class="view-deal button" href="https://www.bestbuy.com/product/samsung-q-series-hw-q600f-atmos-3-1-2-ch-soundbar-with-subwoofer-titan-black/J3ZYG2FV7Z/sku/6619392" target="_blank" rel="nofollow" data-dimension112="2d182a03-bf4a-462f-8947-71c66d39b617" data-action="Deal Block" data-label="This is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it." data-dimension48="This is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it." data-dimension25="$449">View Deal</a></p></div><div class="product"><a data-dimension112="2699d377-ed87-464b-b46a-246e31900864" data-action="Deal Block" data-label="This large soundbar is packed with epic features, along with some great bass reproduction for that epic feel. You can expect great spoken word clarity as well, so you'll hear every word of commentary over the sound of screaming crowds. This soundbar has next-day delivery with an Amazon Prime account." data-dimension48="This large soundbar is packed with epic features, along with some great bass reproduction for that epic feel. You can expect great spoken word clarity as well, so you'll hear every word of commentary over the sound of screaming crowds. This soundbar has next-day delivery with an Amazon Prime account." data-dimension25="$499" href="https://www.amazon.com/dp/B0CV6439SR/" 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:57.47%;"><img id="GfGDka5SJCEW3bGzphkXGm" name="Flexus CORE 200" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GfGDka5SJCEW3bGzphkXGm.png" mos="" align="middle" fullscreen="" width="1500" height="862" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This large soundbar is packed with epic features, along with some great bass reproduction for that epic feel. You can expect great spoken word clarity as well, so you'll hear every word of commentary over the sound of screaming crowds. This soundbar has next-day delivery with an Amazon Prime account.<a class="view-deal button" href="https://www.amazon.com/dp/B0CV6439SR/" target="_blank" rel="nofollow" data-dimension112="2699d377-ed87-464b-b46a-246e31900864" data-action="Deal Block" data-label="This large soundbar is packed with epic features, along with some great bass reproduction for that epic feel. You can expect great spoken word clarity as well, so you'll hear every word of commentary over the sound of screaming crowds. This soundbar has next-day delivery with an Amazon Prime account." data-dimension48="This large soundbar is packed with epic features, along with some great bass reproduction for that epic feel. You can expect great spoken word clarity as well, so you'll hear every word of commentary over the sound of screaming crowds. This soundbar has next-day delivery with an Amazon Prime account." data-dimension25="$499">View Deal</a></p></div><div class="product"><a data-dimension112="fc15d294-f23c-4560-bf77-5ff36d119601" data-action="Deal Block" data-label="The Bose Smart Ultra soundbar has a 5.1.2 channel setup and works with Bose's subwoofer range (sold separately). My favorite part of the Bose Smart range is that it links up with music streaming apps for seamless listening." data-dimension48="The Bose Smart Ultra soundbar has a 5.1.2 channel setup and works with Bose's subwoofer range (sold separately). My favorite part of the Bose Smart range is that it links up with music streaming apps for seamless listening." data-dimension25="$729" href="https://www.amazon.com/Bose-Soundbar-Wireless-Bluetooth-Surround/dp/B0C548MYF3" 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="dLLYXWpy2mJsCzXj262Tq6" name="bose smart soundbar ultra" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dLLYXWpy2mJsCzXj262Tq6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose Smart Ultra soundbar has a 5.1.2 channel setup and works with Bose's subwoofer range (sold separately). My favorite part of the Bose Smart range is that it links up with music streaming apps for seamless listening. <a class="view-deal button" href="https://www.amazon.com/Bose-Soundbar-Wireless-Bluetooth-Surround/dp/B0C548MYF3" target="_blank" rel="nofollow" data-dimension112="fc15d294-f23c-4560-bf77-5ff36d119601" data-action="Deal Block" data-label="The Bose Smart Ultra soundbar has a 5.1.2 channel setup and works with Bose's subwoofer range (sold separately). My favorite part of the Bose Smart range is that it links up with music streaming apps for seamless listening." data-dimension48="The Bose Smart Ultra soundbar has a 5.1.2 channel setup and works with Bose's subwoofer range (sold separately). My favorite part of the Bose Smart range is that it links up with music streaming apps for seamless listening." data-dimension25="$729">View Deal</a></p></div><div class="product"><a data-dimension112="a4a09ecc-15a8-485b-9dc8-bae655b863b8" data-action="Deal Block" data-label="This monster soundbar doesn't just have a standard bar — it's also packing some physical surround speakers for extra soundstage. The subwoofer will bring the bass; you're in for the best game-day sound you've ever heard." data-dimension48="This monster soundbar doesn't just have a standard bar — it's also packing some physical surround speakers for extra soundstage. The subwoofer will bring the bass; you're in for the best game-day sound you've ever heard." data-dimension25="$796" href="https://www.amazon.com/dp/B0CX41212N/" 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:60.40%;"><img id="fJwsKp5Lwq6Vwso7xxHKz9" name="LG290TR.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/fJwsKp5Lwq6Vwso7xxHKz9.jpg" mos="" align="middle" fullscreen="" width="1500" height="906" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This monster soundbar doesn't just have a standard bar — it's also packing some physical surround speakers for extra soundstage. The subwoofer will bring the bass; you're in for the best game-day sound you've ever heard. <a class="view-deal button" href="https://www.amazon.com/dp/B0CX41212N/" target="_blank" rel="nofollow" data-dimension112="a4a09ecc-15a8-485b-9dc8-bae655b863b8" data-action="Deal Block" data-label="This monster soundbar doesn't just have a standard bar — it's also packing some physical surround speakers for extra soundstage. The subwoofer will bring the bass; you're in for the best game-day sound you've ever heard." data-dimension48="This monster soundbar doesn't just have a standard bar — it's also packing some physical surround speakers for extra soundstage. The subwoofer will bring the bass; you're in for the best game-day sound you've ever heard." data-dimension25="$796">View Deal</a></p></div><div class="product"><a data-dimension112="df316ce6-9f28-4b31-ba96-a93a8cad0253" data-action="Deal Block" data-label="This Samsung soundbar is loud and in charge. There are a pair of surround speakers that come in the box for a much wider soundstage, and then a massive sub to make sure you get the most bass possible. For March Madness, there's little better. This soundbar can be delivered the next day with Amazon Prime." data-dimension48="This Samsung soundbar is loud and in charge. There are a pair of surround speakers that come in the box for a much wider soundstage, and then a massive sub to make sure you get the most bass possible. For March Madness, there's little better. This soundbar can be delivered the next day with Amazon Prime." data-dimension25="$1597" href="https://www.amazon.com/dp/B0DY1XTF77/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="hiTceUPoM2UngEXRiyR2YW" name="Q990F" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hiTceUPoM2UngEXRiyR2YW.png" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This Samsung soundbar is loud and in charge. There are a pair of surround speakers that come in the box for a much wider soundstage, and then a massive sub to make sure you get the most bass possible. For March Madness, there's little better. This soundbar can be delivered the next day with Amazon Prime.<a class="view-deal button" href="https://www.amazon.com/dp/B0DY1XTF77/" target="_blank" rel="nofollow" data-dimension112="df316ce6-9f28-4b31-ba96-a93a8cad0253" data-action="Deal Block" data-label="This Samsung soundbar is loud and in charge. There are a pair of surround speakers that come in the box for a much wider soundstage, and then a massive sub to make sure you get the most bass possible. For March Madness, there's little better. This soundbar can be delivered the next day with Amazon Prime." data-dimension48="This Samsung soundbar is loud and in charge. There are a pair of surround speakers that come in the box for a much wider soundstage, and then a massive sub to make sure you get the most bass possible. For March Madness, there's little better. This soundbar can be delivered the next day with Amazon Prime." data-dimension25="$1597">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested everything from a $100 Bluetooth speaker to a $6,000 Hi-Fi setup — and the results surprised me ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/speakers/i-tested-everything-from-a-usd100-bluetooth-speaker-to-a-usd6-000-hi-fi-setup-and-the-results-surprised-me</link>
                                                                            <description>
                            <![CDATA[ I've always wondered — when compared one after the other, how do the many different ways to listen to music at home sound? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JQxiBtUxyWQNxwkBX26vVZ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7teXGcTNGA62gziXJV2qPa-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 28 Feb 2026 10:30:00 +0000</pubDate>                                                                                                                                <updated>Wed, 29 Apr 2026 13:24:24 +0000</updated>
                                                                                                                                            <category><![CDATA[Speakers]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/7teXGcTNGA62gziXJV2qPa-1280-80.jpg">
                                                            <media:credit><![CDATA[Ultimate Ears]]></media:credit>
                                                                                                                                                                                                                                                                                                                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7teXGcTNGA62gziXJV2qPa-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Audio can be cheap. Audio can also be <em>extremely expensive. </em>Thankfully its possible to spend more for incremental improvements in your audio quality. But I've always wanted to compare them all side by side — how much better does spending more sound?</p><p>So I've lined up 5 different "tiers" of audio: a cheap Bluetooth speaker, a more expensive option, a pair of Wi-Fi speakers, a budget HiFi system, and then a fairly expensive system. </p><p>I've listened to them all and now I can say which one might be worth your hard-earned money... and which ones are not. So let's get<em> </em>listening<em>.</em></p><h2 id="tier-one-cheap-bluetooth-speaker">Tier one — cheap Bluetooth speaker</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6N95XkqCaksFC2Ftw9VpiD" name="UE Wonderboom 4" alt="UE Wonderboom product shot" src="https://cdn.mos.cms.futurecdn.net/6N95XkqCaksFC2Ftw9VpiD.jpg" mos="" align="middle" fullscreen="" width="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>This lil' guy is the <a href="https://www.tomsguide.com/audio/bluetooth-speakers/ue-wonderboom-4-review">Wonderboom 4</a>, and it's one of the best ways to listen to music outdoors or in your bedroom without spending too much money. It only comes in at around $100, making it one of the cheaper Bluetooth speakers. </p><p>Can you expect the best sound? Of course not. But if you're on a budget or want a throwaway speaker for some outdoor trips, it's great.</p><p>You can listen to your music, as I did, and you won't find a huge amount to complain about. It would be nice to have some more bass, a bit more detail, and a wider soundstage, but you can't expect much from something that you can palm with one hand.</p><p>It marks the start of my audio journey, and it shows you don't have to spend loads of money to get something that sounds good. Still, I'm excited for my next speaker to see how things improve.</p><div class="product"><a data-dimension112="f44920e8-f655-416e-8c0b-dffdc541997a" data-action="Deal Block" data-label="This little speaker is a perfect portable companion that doesn't break the bank. It's got plenty of volume for your camping trips, and it's waterproof should it start to rain. It's no endgame audio experience, but it's a great way to listen to music without using headphones." data-dimension48="This little speaker is a perfect portable companion that doesn't break the bank. It's got plenty of volume for your camping trips, and it's waterproof should it start to rain. It's no endgame audio experience, but it's a great way to listen to music without using headphones." data-dimension25="$79" href="https://www.amazon.com/dp/B0BRXJ9WTD/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:138.14%;"><img id="ktGMqcBpQXhRvo5RbGM7aV" name="Wonder boom" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ktGMqcBpQXhRvo5RbGM7aV.jpg" mos="" align="middle" fullscreen="" width="679" height="938" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This little speaker is a perfect portable companion that doesn't break the bank. It's got plenty of volume for your camping trips, and it's waterproof should it start to rain. It's no endgame audio experience, but it's a great way to listen to music without using headphones.<a class="view-deal button" href="https://www.amazon.com/dp/B0BRXJ9WTD/" target="_blank" rel="nofollow" data-dimension112="f44920e8-f655-416e-8c0b-dffdc541997a" data-action="Deal Block" data-label="This little speaker is a perfect portable companion that doesn't break the bank. It's got plenty of volume for your camping trips, and it's waterproof should it start to rain. It's no endgame audio experience, but it's a great way to listen to music without using headphones." data-dimension48="This little speaker is a perfect portable companion that doesn't break the bank. It's got plenty of volume for your camping trips, and it's waterproof should it start to rain. It's no endgame audio experience, but it's a great way to listen to music without using headphones." data-dimension25="$79">View Deal</a></p></div><h2 id="tier-2-bluetooth-stereo-pair">Tier 2: Bluetooth stereo pair</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="V9kvvCheAR548PVyszfoFd" name="Bose SoundLink Flex 2" alt="Bose SoundLink Flex 2" src="https://cdn.mos.cms.futurecdn.net/V9kvvCheAR548PVyszfoFd.jpg" mos="" align="middle" fullscreen="" width="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>My next port of call was to connect two Bluetooth speakers and see how much better the sound would be. I stepped up to the <a href="https://www.tomsguide.com/audio/bose-soundlink-flex-2-review">Bose SoundLink Flex 2</a>, a solid Bluetooth speaker in its own right, that also lets you double up for twice the sound.</p><p>First off, you won't get more detail or even drastically improved sound when it comes to dynamics or frequency representation. The only thing that might seem enhanced is bass volume, and that's only because there are now two drivers making the low stuff, although even then, it mostly only smooths things out. After all, there's less work for each to do.</p><p>What is on offer, however, is vastly improved soundstage. That's because you can now spread the sound out amongst the two speakers, widening the sound stage. The sound is improved in terms of space and immersion as a result — if you can afford the extra for a pair of speakers, I'd say it's actually worth buying two for stereo mode rather than one more expensive model. This next step has been an interesting one, but now I'm ready for the next step — and we're connecting to the Wi-Fi.</p><div class="product"><a data-dimension112="232dd698-8b14-48b9-9daa-60e24374a5ff" data-action="Deal Block" data-label="This Bluetooth speaker is a hefty sound step up over the WonderBoom 4, but it also offers stereo listening. Connect two for a much better sound that also features a much wider soundstage, more akin to a HiFi system and its seperate speakers." data-dimension48="This Bluetooth speaker is a hefty sound step up over the WonderBoom 4, but it also offers stereo listening. Connect two for a much better sound that also features a much wider soundstage, more akin to a HiFi system and its seperate speakers." data-dimension25="$119" href="https://www.amazon.com/dp/B0D6WB7BV6/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:932px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="CaY2r9G6VHX74UcMmqyGy" name="bose soundlink flex gen 2 deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CaY2r9G6VHX74UcMmqyGy.jpg" mos="" align="middle" fullscreen="" width="932" height="932" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This Bluetooth speaker is a hefty sound step up over the WonderBoom 4, but it also offers stereo listening. Connect two for a much better sound that also features a much wider soundstage, more akin to a HiFi system and its seperate speakers.<a class="view-deal button" href="https://www.amazon.com/dp/B0D6WB7BV6/" target="_blank" rel="nofollow" data-dimension112="232dd698-8b14-48b9-9daa-60e24374a5ff" data-action="Deal Block" data-label="This Bluetooth speaker is a hefty sound step up over the WonderBoom 4, but it also offers stereo listening. Connect two for a much better sound that also features a much wider soundstage, more akin to a HiFi system and its seperate speakers." data-dimension48="This Bluetooth speaker is a hefty sound step up over the WonderBoom 4, but it also offers stereo listening. Connect two for a much better sound that also features a much wider soundstage, more akin to a HiFi system and its seperate speakers." data-dimension25="$119">View Deal</a></p></div><h2 id="tier-3-wi-fi-connected-speaker">Tier 3: Wi-Fi connected speaker</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4031px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="4Uer8g4ZXgHdjjUPTFvZ6a" name="Sonos_Era 300_in white (2).jpg" alt="Sonos Era 300 in white" src="https://cdn.mos.cms.futurecdn.net/4Uer8g4ZXgHdjjUPTFvZ6a.jpg" mos="" align="middle" fullscreen="" width="4031" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This hourglass-shaped wierdo is the Sonos Era 300. It's a Wi-Fi-connected smart speaker that offers something we've not yet seen on the list (and won't see again) — Dolby Atmos and Spatial Audio. That means that compatible streams from Apple Music and Amazon Music sound more spacious, as if you've got multiple speakers dotted around the room.</p><p>That's why I chose this speaker. The Dolby Atmos and Spatial Audio mean that not only does the speaker sound excellent, but it also sounds much larger than similar devices sound on their own.</p><p>This step-up in audio quality does feel like it's worth the extra dollars. Its mighty bass, impressive mids, and massive sound make up for the lacking detail — and its sculpture like design makes sure it fits in no matter where you put it. Now — onto the really good stuff.</p><div class="product"><a data-dimension112="5ea81537-52d7-43df-a8b4-8f021c47bf0d" data-action="Deal Block" data-label="The Era 300 is the best speaker that Sonos makes right now, thanks to its excellent Dolby Atmos experience and top-notch sound quality. You can also use them as surrounds for a Sonos home theater system, which is pretty cool." data-dimension48="The Era 300 is the best speaker that Sonos makes right now, thanks to its excellent Dolby Atmos experience and top-notch sound quality. You can also use them as surrounds for a Sonos home theater system, which is pretty cool." data-dimension25="$479" href="https://www.amazon.com/dp/B0BW2LV57K/" 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:120.00%;"><img id="4Exg4MNuvptKtBpH8vsYfS" name="Sonos Era 300" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4Exg4MNuvptKtBpH8vsYfS.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Era 300 is the best speaker that Sonos makes right now, thanks to its excellent Dolby Atmos experience and top-notch sound quality. You can also use them as surrounds for a Sonos home theater system, which is pretty cool.<a class="view-deal button" href="https://www.amazon.com/dp/B0BW2LV57K/" target="_blank" rel="nofollow" data-dimension112="5ea81537-52d7-43df-a8b4-8f021c47bf0d" data-action="Deal Block" data-label="The Era 300 is the best speaker that Sonos makes right now, thanks to its excellent Dolby Atmos experience and top-notch sound quality. You can also use them as surrounds for a Sonos home theater system, which is pretty cool." data-dimension48="The Era 300 is the best speaker that Sonos makes right now, thanks to its excellent Dolby Atmos experience and top-notch sound quality. You can also use them as surrounds for a Sonos home theater system, which is pretty cool." data-dimension25="$479">View Deal</a></p></div><h2 id="tier-4-entry-level-hifi">Tier 4: Entry level HiFi</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="f9CaqqBuzFKpkE7rXRtBNB" name="Wiim Amp Pro-11" alt="Wiim Amp Pro" src="https://cdn.mos.cms.futurecdn.net/f9CaqqBuzFKpkE7rXRtBNB.jpg" mos="" align="middle" fullscreen="" width="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>HiFi systems this side of the pond are expensive. Where in the likes of the U.K. you can pick up excellent components for relatively cheap, audio equipment in the U.S. often demands a hefty premium. Still, it's possible to spend less than $1,000 and get something that sounds epic. Case in point — the Wiim Amp Pro and a pair of Q Acoustics 3020i.</p><p>So far, this one's the clear winner. The speakers themselves have more drive, more dynamism, and more detail than the other options we've seen so far. They're more articulate as well, so you're in for a more involving musical experience. </p><p>The system is also more flexible. There are loads of inputs on the back of the amplifier, so you can hook up stuff like the <a href="https://www.tomsguide.com/best-picks/best-record-players">best record players</a> and spin some discs, or even pick up a CD player for some '90s throwback headbang sessions.</p><p>This is the happy medium for me — and even better if you can find some components on eBay and save some money. That's how I got my first HiFi system, and I only shelved some of those components when I replaced them last year. My old speakers lasted about 10 years in my care before I upgraded them, and they were older than that when I bought them.</p><p>Still, there's better; let's give it a try.</p><div class="product"><a data-dimension112="d2154a73-f367-4974-900e-2027f756f112" data-action="Deal Block" data-label="This powerful little amp isn't particularly expensive and comes packed with all the streaming stuff you'll need to get started. Just plug in your speakers, and away you go." data-dimension48="This powerful little amp isn't particularly expensive and comes packed with all the streaming stuff you'll need to get started. Just plug in your speakers, and away you go." data-dimension25="$322.15" href="https://www.amazon.com/dp/B0DFPJ91ZX/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="PvLumZqBqe3YCcSvBjgXo7" name="Amp Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PvLumZqBqe3YCcSvBjgXo7.png" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This powerful little amp isn't particularly expensive and comes packed with all the streaming stuff you'll need to get started. Just plug in your speakers, and away you go.<a class="view-deal button" href="https://www.amazon.com/dp/B0DFPJ91ZX/" target="_blank" rel="nofollow" data-dimension112="d2154a73-f367-4974-900e-2027f756f112" data-action="Deal Block" data-label="This powerful little amp isn't particularly expensive and comes packed with all the streaming stuff you'll need to get started. Just plug in your speakers, and away you go." data-dimension48="This powerful little amp isn't particularly expensive and comes packed with all the streaming stuff you'll need to get started. Just plug in your speakers, and away you go." data-dimension25="$322.15">View Deal</a></p></div><div class="product"><a data-dimension112="6e080831-daf2-492f-a912-f7df0c8e1523" data-action="Deal Block" data-label="These bookshelf speakers pack a serious sonic punch, but don't need all that much power to drive. They've got plenty of bass extension, but proper bass heads will want to invest in an extra subwoofer for the really low stuff." data-dimension48="These bookshelf speakers pack a serious sonic punch, but don't need all that much power to drive. They've got plenty of bass extension, but proper bass heads will want to invest in an extra subwoofer for the really low stuff." data-dimension25="$479" href="https://www.amazon.com/dp/B07C4WT392/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1084px;"><p class="vanilla-image-block" style="padding-top:66.61%;"><img id="qehfwabXS9vCZYr4ZrxAAG" name="3020i" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qehfwabXS9vCZYr4ZrxAAG.png" mos="" align="middle" fullscreen="" width="1084" height="722" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These bookshelf speakers pack a serious sonic punch, but don't need all that much power to drive. They've got plenty of bass extension, but proper bass heads will want to invest in an extra subwoofer for the really low stuff.<a class="view-deal button" href="https://www.amazon.com/dp/B07C4WT392/" target="_blank" rel="nofollow" data-dimension112="6e080831-daf2-492f-a912-f7df0c8e1523" data-action="Deal Block" data-label="These bookshelf speakers pack a serious sonic punch, but don't need all that much power to drive. They've got plenty of bass extension, but proper bass heads will want to invest in an extra subwoofer for the really low stuff." data-dimension48="These bookshelf speakers pack a serious sonic punch, but don't need all that much power to drive. They've got plenty of bass extension, but proper bass heads will want to invest in an extra subwoofer for the really low stuff." data-dimension25="$479">View Deal</a></p></div><h2 id="tier-5-premium-hifi">Tier 5: Premium HiFi</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Y5fsurKNtAmuVdVJAMY2dD" name="Cambridge EVO 150 SE" alt="Cambridge EVO 150 SE" src="https://cdn.mos.cms.futurecdn.net/Y5fsurKNtAmuVdVJAMY2dD.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Now we're into the big leagues. I've got here a <a href="https://www.tomsguide.com/audio/speakers/i-just-tested-this-all-in-one-music-streaming-amplifier-and-i-want-to-put-one-in-every-room-in-my-house">Cambridge Evo 150 SE</a>, nearly three-and-a-half grand worth of streaming amplifier. At its core, it's the same idea as the Wiim Amp Pro above, but dials up all its features to eleven. That means 150 watts per channel so that it can drive even the most demanding of speakers, and some seriously impressive internals to make sure the music sent to the speakers sounds epic.</p><p>I've paired it with some monster new floorstanders from Dali, the Sonik 7. They exude special, from their monolith-like design to the massive speaker units that dominate their front fascia. They also happen to sound <em>insane.</em></p><p>As you might expect, the sound fills the living room. There's bass for days, detail for miles, and immersion like nothing else. Is it <em>that </em>much better than the entry-level system? Oh yes, it really is, but I'm not sure I could ever tell anyone to buy it.</p><p>This is an audio system for people with more money than sense. For audiophiles who are seeking the best sound possible, who have lots of money but not the tens of thousands of dollars for the <em>really </em>expensive stuff.</p><p>This is the point when things get trickier. The sound is much better than anything else on the list, but spending more becomes a case of diminishing returns. For some, this is an endgame system. Until they experience something even better, and suddenly, nothing is good enough. The path of the audiophile is a slippery, expensive slope.</p><div class="product"><a data-dimension112="5db77349-e38d-4e22-9135-ec216b15930d" data-action="Deal Block" data-label="150 Watts per channel for monster speakers, and a glorious big screen to show you what you're listening to. It sounds amazing and gets the best out of some of the most impressive speakers around — there's little more you could ask for." data-dimension48="150 Watts per channel for monster speakers, and a glorious big screen to show you what you're listening to. It sounds amazing and gets the best out of some of the most impressive speakers around — there's little more you could ask for." data-dimension25="$3299" href="https://www.amazon.com/dp/B0FCG3KD8G/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1484px;"><p class="vanilla-image-block" style="padding-top:29.51%;"><img id="hibqBFfik36dSXF4Cuj4fH" name="Evo 150 SE" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hibqBFfik36dSXF4Cuj4fH.png" mos="" align="middle" fullscreen="" width="1484" height="438" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>150 Watts per channel for monster speakers, and a glorious big screen to show you what you're listening to. It sounds amazing and gets the best out of some of the most impressive speakers around — there's little more you could ask for.<a class="view-deal button" href="https://www.amazon.com/dp/B0FCG3KD8G/" target="_blank" rel="nofollow" data-dimension112="5db77349-e38d-4e22-9135-ec216b15930d" data-action="Deal Block" data-label="150 Watts per channel for monster speakers, and a glorious big screen to show you what you're listening to. It sounds amazing and gets the best out of some of the most impressive speakers around — there's little more you could ask for." data-dimension48="150 Watts per channel for monster speakers, and a glorious big screen to show you what you're listening to. It sounds amazing and gets the best out of some of the most impressive speakers around — there's little more you could ask for." data-dimension25="$3299">View Deal</a></p></div><div class="product"><a data-dimension112="26b21cb7-8e0e-41d3-aecd-7fc7de0e4404" data-action="Deal Block" data-label="These brand new speakers from Dali are superb. They sound monumental thanks to their impressive driver array and their hybrid tweeter setup. Yes, some speakers cost even more — but these are some seriously good pieces of audio equipment." data-dimension48="These brand new speakers from Dali are superb. They sound monumental thanks to their impressive driver array and their hybrid tweeter setup. Yes, some speakers cost even more — but these are some seriously good pieces of audio equipment." data-dimension25="$2800" href="https://www.crutchfield.com/S-uVSFmNIEHMm/p_700SNK7WN/DALI-SONIK-7-Walnut.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:65.00%;"><img id="GLNi4nWRRFHfVYsyNpUzrb" name="Sonik 7" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GLNi4nWRRFHfVYsyNpUzrb.png" mos="" align="middle" fullscreen="" width="3000" height="1950" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These brand new speakers from Dali are superb. They sound monumental thanks to their impressive driver array and their hybrid tweeter setup. Yes, some speakers cost even more — but these are some seriously good pieces of audio equipment.<a class="view-deal button" href="https://www.crutchfield.com/S-uVSFmNIEHMm/p_700SNK7WN/DALI-SONIK-7-Walnut.html" target="_blank" rel="nofollow" data-dimension112="26b21cb7-8e0e-41d3-aecd-7fc7de0e4404" data-action="Deal Block" data-label="These brand new speakers from Dali are superb. They sound monumental thanks to their impressive driver array and their hybrid tweeter setup. Yes, some speakers cost even more — but these are some seriously good pieces of audio equipment." data-dimension48="These brand new speakers from Dali are superb. They sound monumental thanks to their impressive driver array and their hybrid tweeter setup. Yes, some speakers cost even more — but these are some seriously good pieces of audio equipment." data-dimension25="$2800">View Deal</a></p></div><h2 id="which-should-you-buy">Which should you buy?</h2><p>Honestly? Buy what you can afford, or save up for that which you can't. Not everyone is going to the need the sonic prowess of even the entry level HiFi system, and will be more than happy with the $100 Bluetooth speaker.</p><p>As for what provides the best bang for your buck, I'd say the entry level HiFi system. It sounds much better than the other options towards the cheaper end of the list. You'll be left with space to upgrade in the future, and have something to show off when friends come to visit. Some of them, like the system I've built here, can be plugged into a TV to improve your movie and TV show sound.</p><p>Most important of all is to have fun — the important thing is the music you're listening to, not the equipment you're playing it through.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/home/kitchen-dining/i-put-my-ikeas-new-usd35-cast-iron-pan-head-to-head-with-my-lodge-skillet-there-was-a-clear-winner">I put IKEA's new $35 cast iron pan head-to-head with my Lodge skillet — there was a clear winner</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-spent-24-hours-with-the-galaxy-s26-ultra-what-i-like-and-dont-so-far">I spent 24 hours with the Galaxy S26 Ultra — what I like (and don’t) so far</a></li><li><a href="https://www.tomsguide.com/sales-events/pokemon-fans-everywhere-these-are-the-pokemon-30th-anniversary-deals-you-cant-miss">41 Pokémon deals to celebrate Pokémon Day, picked by a lifelong fan</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ These wired headphones blow wireless headphones out of the water — here's why you need a pair ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/headphones/these-wired-headphones-blow-wireless-headphones-out-of-the-water-heres-why-you-need-a-pair</link>
                                                                            <description>
                            <![CDATA[ Why buy wireless headphones when you could buy the excellent Sivga Peng instead? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Koe2fa52dDh8GsuCRHc4Na</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/YLVBnqQnUdECWsnV3Ykhdb-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 22 Feb 2026 08:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/YLVBnqQnUdECWsnV3Ykhdb-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Sivga Peng]]></media:description>                                                            <media:text><![CDATA[Sivga Peng]]></media:text>
                                <media:title type="plain"><![CDATA[Sivga Peng]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/YLVBnqQnUdECWsnV3Ykhdb-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There's part of me that feels like I'm repeating myself. A new pair of wired headphones lands on my desk from a name you've never heard of, and they sonically eviscerate all the wireless options you can buy for a similar price. Cue me acting "surprised," penning my "surprise," and then everyone continuing to buy the same ANC cans they always have.</p><p>But seriously, you have to give some of these wired options a chance. Sure, you won't be wearing them on a train to block out the sounds of angry sports fans, but you <em>will </em>appreciate everything your music has to offer when you sit at your work desk, or at home after a long day at work. Or something.</p><p>The Sivga Peng are just that. They're not outdoor headphones, although their leather carrying case will do a great job at keeping them safe from harm. No, they're sitting in front of the fire with a glass of something delicious and a spare hour to listen to your favorite albums. And my goodness, I'd take these any day of the week over the similarly priced wireless options from Sony or Bose.</p><div class="product"><a data-dimension112="e36aa3f5-1468-447a-8ded-0254dde3c95a" data-action="Deal Block" data-label="Would you believe that Sivga is the "budget" arm of a premium brand? $449 is still a lot of money, but if you're looking for some incredible sound for the same price as the flagship wireless options, look no further. These cans are comfortable, light, and sound stunning." data-dimension48="Would you believe that Sivga is the "budget" arm of a premium brand? $449 is still a lot of money, but if you're looking for some incredible sound for the same price as the flagship wireless options, look no further. These cans are comfortable, light, and sound stunning." data-dimension25="$449" href="https://www.amazon.com/dp/B0F9KPT5RQ/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1509px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="BLbwksJjshiLNXiYdifvxn" name="Sivga Peng.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BLbwksJjshiLNXiYdifvxn.jpg" mos="" align="middle" fullscreen="" width="1509" height="1509" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Would you believe that Sivga is the "budget" arm of a premium brand? $449 is still a lot of money, but if you're looking for some incredible sound for the same price as the flagship wireless options, look no further. These cans are comfortable, light, and sound stunning.<a class="view-deal button" href="https://www.amazon.com/dp/B0F9KPT5RQ/" target="_blank" rel="nofollow" data-dimension112="e36aa3f5-1468-447a-8ded-0254dde3c95a" data-action="Deal Block" data-label="Would you believe that Sivga is the "budget" arm of a premium brand? $449 is still a lot of money, but if you're looking for some incredible sound for the same price as the flagship wireless options, look no further. These cans are comfortable, light, and sound stunning." data-dimension48="Would you believe that Sivga is the "budget" arm of a premium brand? $449 is still a lot of money, but if you're looking for some incredible sound for the same price as the flagship wireless options, look no further. These cans are comfortable, light, and sound stunning." data-dimension25="$449">View Deal</a></p></div><h2 id="connect-to-disconnect">Connect to disconnect</h2><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="ooB9tuhCUy57HQadX2uQeb" name="Sivga Peng" alt="Sivga Peng" src="https://cdn.mos.cms.futurecdn.net/ooB9tuhCUy57HQadX2uQeb.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 modern world is too filled with "beeps" and "boops." My car bings at me when I go slightly over the speed limit to overtake your Mom in her station wagon, my nightstand light squawks at me when it's disconnected from the Wi-Fi, and trash cans say "thanks!" when I throw away my empty Monster can.</p><p>I <em>hate</em> beeps and boops. They're annoying. The fact that wireless headphones beep and boop more than just about anything else I own is the icing on top of a disgusting cake. "Oh, I've disconnected," say my headphones. "BEEP, I've got some battery left." "BEEP, I've got even less battery left." Please. Stop.</p><p>You know what doesn't beep at me? The Sivga Peng, and just about any other wired headphones you might have. Plug them into a device that doesn't see the outside world for anything other than music streaming, and you'll find a peaceful world where nothing wants for your attention with a piezo buzzer or a synthetic beep. Or boop.</p><h2 id="battery-life-never-heard-of-her">Battery life? Never heard of her</h2><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="KB3GDWAGgGa5vHiX9tj7eb" name="Sivga Peng" alt="Sivga Peng" src="https://cdn.mos.cms.futurecdn.net/KB3GDWAGgGa5vHiX9tj7eb.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 headphones last for 30 hours!" <br>"Oh yeah? Well, mine last for 50!"<br>"I've got you both trumped — mine go on for 100 hours!"</p><p>How about <em>all of the hours? </em>The only thing you have to worry about is how long the connected device will last. The Sivga Peng? No charging needed. Pub friends bragging rights won, perpetual music gained. </p><h2 id="seriously-impressive-sound">Seriously impressive sound</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jyshHWPPWWpHn6oMHQd5eb" name="Sivga Peng" alt="Sivga Peng" src="https://cdn.mos.cms.futurecdn.net/jyshHWPPWWpHn6oMHQd5eb.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>Bluetooth has improved in leaps and bounds. You can listen to far higher-quality audio than the first pairs of wireless headphones could ever have hoped of reproducing. But it's still limited, either by the device you're listening to, the codecs your headphones support, or both. Wireless is an imperfect listening solution, a compromise of convenience over just about everything else.</p><p>My Sivga Peng and their wonderful, braided cable, however, are different. They take wonderful hi-res tracks from my digital audio player (or my laptop, or even my phone), and then feed them directly into my earholes as if they were love letters delivered on the backs of cherubim.</p><p>There's detail for days, mids that give you a warm, welcoming hug, and their closed-back design keeps the bass in for weighty, thick sound. The soundstage is slightly more intimate as a result, but you won't mind as you're surrounded by your favorite tunes.</p><h2 id="you-might-miss-some-amenities">You might miss some amenities</h2><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="R2p9H4EqyLrSEnTxdDoGeb" name="Sivga Peng" alt="Sivga Peng" src="https://cdn.mos.cms.futurecdn.net/R2p9H4EqyLrSEnTxdDoGeb.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>Wireless headphones do, of course, have some pros. ANC that keeps the noise of irritating people at bay, and no cable to get all tangled. But if you want something that sounds incredible, and don't want to start looking at headphones that cost over $599, then wired headphones are the only way to go.</p><p>The Sivga Peng are just one pair of wireless headphones — but they are a spectacular option if you've got $449 spare and you were thinking of picking up something with a Sony or a Bose logo. Don't. Buy these. They sound so much better. And you'll never have to worry about the battery running out.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/sleep-tech/6-apple-watch-settings-you-should-change-now-for-more-accurate-sleep-tracking">6 Apple Watch settings you should change now for more accurate sleep tracking</a></li><li><a href="https://www.tomsguide.com/computing/macbooks/ive-been-using-macbooks-for-10-years-heres-15-must-have-accessories-id-buy-for-an-instant-upgrade">I've been using MacBooks for 10 years — here's 15 must-have accessories I'd buy for an instant upgrade</a></li><li><a href="https://www.tomsguide.com/phones/iphones/after-using-the-iphone-16e-for-about-a-year-the-iphone-17e-shouldnt-launch-without-these-3-upgrades">I've used the iPhone 16e for a year — and the iPhone 17e shouldn’t launch without these 3 upgrades</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Ditching your headphones for speakers might be best for your health as a new study claims they contain toxic forever chemicals ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/headphones/new-study-claims-most-headphones-contain-toxic-forever-chemicals-that-might-be-leaching-into-your-body</link>
                                                                            <description>
                            <![CDATA[ A new study claims most headphones it tested contain "toxic chemicals" that are "migrating" into our bodies. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">9Bo7fS9MPqFGkKLoFNWVHj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Le9hxtoYEFmJ3mTfLc66jS-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 18 Feb 2026 19:57:17 +0000</pubDate>                                                                                                                                <updated>Thu, 19 Feb 2026 17:30:45 +0000</updated>
                                                                                                                                            <category><![CDATA[Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Le9hxtoYEFmJ3mTfLc66jS-1280-80.jpg">
                                                            <media:credit><![CDATA[Nikita Achanta / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Meze 105 AER headphones]]></media:description>                                                            <media:text><![CDATA[Meze 105 AER headphones]]></media:text>
                                <media:title type="plain"><![CDATA[Meze 105 AER headphones]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Le9hxtoYEFmJ3mTfLc66jS-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you don't want something else to worry about in today's world, perhaps stop reading. Otherwise, a new study finds that most headphones contain toxic chemicals that may be "migrating" into our bodies.</p><p>Reported by <a href="https://www.theguardian.com/technology/2026/feb/18/hazardous-substances-headphones" target="_blank">the Guardian</a>, the study comes from the activist group <a href="https://tesztek.tudatosvasarlo.hu/" target="_blank">ToxFree LIFE for All</a>, a Hungarian research and campaigning group. If it helps, they're like the Eastern European version of Consumer Reports.</p><p>ToxFree found that a multitude of headphones contain chemicals that can "cause cancer, neuro-development problems and the feminisation of males." That includes ones from major brands like Apple, Bose, Panasonic and Sony, makers of some of the <a href="https://www.tomsguide.com/us/best-headphones,review-1988.html">best headphones</a>.</p><p>According to their website, ToxFree has tested over 81 headphones, from earbuds to over-the-ear cans. Apparently, the primary source of chemicals in the headphones comes from the "formulation of the plastics from which they are made." </p><p>These dangerous chemicals include bisphenols, phthalates and poly- and perfluoroalkyl (Pfas). PFAs are known as forever chemicals, which other studies have found to have terrible biological effects. </p><p>ToxFree apparently started testing for the chemicals because headphones have "transitioned from occasional accessories to essential tools." They purchased readily available headphones that can be found in Austria, the Czech Republic, Hungary, Slovakia, Slovenia and online marketplaces like Shein and Temu.</p><p>“Hazardous substances were detected in every product tested,” they said.</p><p>Reportedly, synthetic chemicals used to stiffen plastic can migrate into sweat that can then be absorbed through your skin.</p><p>From what we can tell, the study only tested for the presence of the chemicals, but it doesn't reveal how much exposure is required for chemicals to reach toxic levels. It also emphasizes that the chemicals were found in "trace" quantities. </p><h2 id="how-to-avoid-the-chemicals">How to avoid the chemicals</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZH2ZN42NzQAJurdXEZCg5H" name="earbuds ANC" alt="Sony Wf-1000XM6, Sony WF-1000XM5, Apple Airpods Pro 3" src="https://cdn.mos.cms.futurecdn.net/ZH2ZN42NzQAJurdXEZCg5H.jpg" mos="" align="middle" fullscreen="" width="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>ToxFree notes that "highest concentrations of harmful substances were found in the hard plastic parts of the headphones. These chemicals can be released into the environment through heat, mechanical stress or sweating and then absorbed through the skin."</p><p>Which means you'll want to avoid wearing headphones while sleeping, and unfortunately, when doing strenuous activity that causes you to sweat.</p><p>“Daily use – especially during exercise when heat and sweat are present – accelerates this migration directly to the skin," ToxFree said.</p><p>This makes sense for earbuds where the plastic is more likely to come into contact with your skin on a more consistent basis. What we can't tell is what the study found regarding over-the-ear and on-ear cans. </p><p>In general, those headphones feature softer materials, including cloth, pseudo or real leather in the cups and the headbands. Higher-end models might be made out of metal. </p><p>ToxFree has released previous studies that found Pfas in <a href="https://www.theguardian.com/society/2025/oct/18/chemical-linked-impaired-sexual-development-found-dummies-tests" target="_blank">baby pacifiers</a> and <a href="https://tudatosvasarlo.hu/toxic-chemicals-in-underwear-read-the-label/" target="_blank">women's underwear</a>, two products that have even more contact with skin and orifices. </p><p>Mayhap this isn't as dire an issue as Toxfree asserts. However, it may be a good time to consider how much time you spend wearing headphones and finding ways to mitigate it for your general health.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XkV5MO"></div>                            </div>                            <script src="https://kwizly.com/embed/XkV5MO.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/best-picks/best-over-ear-headphones">Best over-ear headphones: Top picks tested by experts</a></li><li><a href="https://www.tomsguide.com/audio/headphones/this-usd70-usb-c-iphone-dongle-makes-my-wireless-headphones-sound-amazing-and-i-dont-think-i-could-live-without-it-anymore">This $70 USB-C iPhone dongle makes my wireless headphones sound amazing — and I don't think I could live without it anymore</a></li><li><a href="https://www.tomsguide.com/audio/speakers/cambridge-audios-new-desk-speakers-are-some-of-the-best-ive-ever-tested-they-punch-far-above-their-weight-class">Cambridge Audio's new desk speakers are some of the best I've ever tested — they punch far above their weight class</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Rare Bose deals are still live on Amazon after Presidents’ Day — save up to 35% for a limited time ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/rare-bose-deals-are-still-live-on-amazon-after-presidents-day-save-up-to-35-percent-while-you-still-can</link>
                                                                            <description>
                            <![CDATA[ Amazon is knocking up to 35% off Bose speakers and headphones. Check out my favorite picks from the sale. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gWpEcW6bGLG2MEf6xRVRtQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/tbMexKt7gP327pPkHBiMSL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 17 Feb 2026 15:46:27 +0000</pubDate>                                                                                                                                <updated>Tue, 17 Feb 2026 16:14:00 +0000</updated>
                                                                                                                                            <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Olivia Halevy ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/YAg7Fmh9dGKbg3hULBMWiU.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Olivia is a Deals Writer at Tom’s Guide. She loves all things lifestyle, shopping and sourcing the best deals from some of the top brands, retailers and websites around. From fashion and beauty to smart home and tech, she has an eye for finding practical, stylish, and reasonably-priced items that help make life simpler (and a little more aesthetically-pleasing).&amp;nbsp;Olivia has over five years of experience writing lifestyle, commerce, and branded content for &lt;a href=&quot;http://patch.com/&quot;&gt;Patch.com&lt;/a&gt;. She&#039;s covered major shopping holidays like Amazon Prime Day, Black Friday and Cyber Monday. In her free time, she enjoys trying out new exercise classes, binge-watching the latest viral TV shows, cooking, spending time with family and taking long walks with her dog, Gus.&amp;nbsp;&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/tbMexKt7gP327pPkHBiMSL-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose]]></media:description>                                                            <media:text><![CDATA[Bose]]></media:text>
                                <media:title type="plain"><![CDATA[Bose]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/tbMexKt7gP327pPkHBiMSL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Presidents' Day has come and gone, but we're still seeing some great savings sticking around — and Bose is no exception! The audio brand makes some of the <a href="https://www.tomsguide.com/us/best-headphones,review-1988.html">best headphones</a> and <a href="https://www.tomsguide.com/audio/i-test-bluetooth-speakers-for-a-living-and-heres-the-best-9-black-friday-deals-right-now">best Bluetooth speakers</a> on the market, and right now <a href="https://www.amazon.com/stores/page/234E7793-592C-4A01-82BC-444C9E05010C?" target="_blank" rel="nofollow">Amazon is slashing select devices by up to 35%</a>. </p><p>If you're in the market for a speaker, I recommend <a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DPN69X2V?" target="_blank" rel="nofollow">the Bose SoundLink Flex (Gen 2) for just $119</a>. When it comes to headphones, you can't go wrong with the <a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" target="_blank" rel="nofollow">Bose QuietComfort Headphones, which are now sporting a discount of 35%</a>. And if earbuds are what you're after, <a href="https://www.amazon.com/dp/B0FDKR4RVP/?" target="_blank" rel="nofollow">the Bose Ultra Open Earbuds are now $100 off</a>. </p><p>We don't know how long these rare Bose deals will last, so we recommending adding to cart ASAP. Keep scrolling to check out the rest of my favorite picks from the sale. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links </span></h3><ul><li><a href="https://www.amazon.com/stores/page/234E7793-592C-4A01-82BC-444C9E05010C?" target="_blank" rel="nofollow"><strong>shop all Bose deals on Amazon</strong></a></li><li><strong>Bose SoundLink Micro: </strong><a href="https://www.amazon.com/Bose-SoundLink-Micro-Bluetooth-speaker/dp/B0748N1BZD" target="_blank" rel="nofollow"><strong>was $119 now $89</strong></a></li><li><strong>Bose SoundLink Flex (Gen 2): </strong><a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DPN69X2V?" target="_blank" rel="nofollow"><strong>was $149 now $119</strong></a></li><li><strong>Bose QuietComfort Bluetooth Earbud: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Lifestyle-Cancellation/dp/B0FC6KNK6X?" target="_blank" rel="nofollow"><strong>was $179 now $149</strong></a></li><li><strong>Bose Ultra Open Earbuds: </strong><a href="https://www.amazon.com/dp/B0CPFV77W4/" target="_blank" rel="nofollow"><strong>was $299 now $199</strong></a></li><li><strong>Bose QuietComfort Headphones: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0FGYDGJ3H?th=1" target="_blank" rel="nofollow"><strong>was $349 now $229</strong></a></li><li><strong>Bose SoundLink Max: </strong><a href="https://www.amazon.com/dp/B0CVLD42PD?" target="_blank" rel="nofollow"><strong>was $399 now $329</strong></a></li></ul><h3 class="article-body__section" id="section-best-bose-deals"><span>Best Bose Deals</span></h3><div class="product"><a data-dimension112="86c2f2f7-8b67-49da-845f-0e9193d8a89c" data-action="Deal Block" data-label="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension48="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension25="$89" href="https://www.amazon.com/Bose-SoundLink-Micro-Bluetooth-speaker/dp/B0748N1BZD" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:102.21%;"><img id="GVe8YkR2UVdNf2zDVP9t27" name="Bose Soundlink.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GVe8YkR2UVdNf2zDVP9t27.jpg" mos="" align="middle" fullscreen="" width="679" height="694" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode.<a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Micro-Bluetooth-speaker/dp/B0748N1BZD" target="_blank" rel="nofollow" data-dimension112="86c2f2f7-8b67-49da-845f-0e9193d8a89c" data-action="Deal Block" data-label="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension48="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension25="$89">View Deal</a></p></div><div class="product"><a data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$119" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DPN69X2V?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:75.11%;"><img id="fexRzMYRvYZTHGfbcUbFf8" name="Bose speaker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/fexRzMYRvYZTHGfbcUbFf8.jpg" mos="" align="middle" fullscreen="" width="679" height="510" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The new Bose SoundLink (2nd gen) is a compact and powerful Bluetooth speaker with a durable design. This 1.2-pound speaker is water and dust proof and delivered great sound quality in our <a href="https://www.tomsguide.com/audio/bose-soundlink-flex-2-review" target="_blank" data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$119">SoundLink Flex gen 2 review</a>. With 12 hours of battery life and $30 off, you have yourself a great deal.<a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DPN69X2V?" target="_blank" rel="nofollow" data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$119">View Deal</a></p></div><div class="product"><a data-dimension112="530ab1fc-7bcf-4b2b-9ce1-226b47a27fdd" data-action="Deal Block" data-label="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $149." data-dimension48="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $149." data-dimension25="$149" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Lifestyle-Cancellation/dp/B0FC6KNK6X?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:95.55%;"><img id="gng2pmSiBsvdSJEfE2mEde" name="Bose QuietComfort Earbuds" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/gng2pmSiBsvdSJEfE2mEde.png" mos="" align="middle" fullscreen="" width="1280" height="1223" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $149.<a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Lifestyle-Cancellation/dp/B0FC6KNK6X?" target="_blank" rel="nofollow" data-dimension112="530ab1fc-7bcf-4b2b-9ce1-226b47a27fdd" data-action="Deal Block" data-label="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $149." data-dimension48="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $149." data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$229" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0D4Z9C562" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1082px;"><p class="vanilla-image-block" style="padding-top:97.23%;"><img id="G8nmk5kRrjkWCjQKS3fJVL" name="Bosie QuietComfort headphones" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/G8nmk5kRrjkWCjQKS3fJVL.png" mos="" align="middle" fullscreen="" width="1082" height="1052" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>In our <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-headphones" data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$229">Bose QuietComfort Headphones review</a>, we said these are "excellent always-on noise-cancelers with enhanced sound and battery life." They're missing spatial audio mode and touch controls, but at 35% off, these are nearly perfect. <a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0D4Z9C562" target="_blank" rel="nofollow" data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$229">View Deal</a></p></div><div class="product"><a data-dimension112="ab6c08e5-4727-4716-af07-3f6609dbf0ff" data-action="Deal Block" data-label="Our Audio Editor loves her pair of Soundlink Home speakers thanks to their handsome looks and solid sound profile. You can connect them together for stereo mode as well. More than 9 hours of battery would be nice, though. Still, this is an excellent deal price on a lovely speaker." data-dimension48="Our Audio Editor loves her pair of Soundlink Home speakers thanks to their handsome looks and solid sound profile. You can connect them together for stereo mode as well. More than 9 hours of battery would be nice, though. Still, this is an excellent deal price on a lovely speaker." data-dimension25="$197" href="https://www.amazon.com/dp/B0DT7FT7BC/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:827px;"><p class="vanilla-image-block" style="padding-top:58.65%;"><img id="b9zi7aAFzqby3DuaeGuEKX" name="SoundLink Home Speaker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/b9zi7aAFzqby3DuaeGuEKX.png" mos="" align="middle" fullscreen="" width="827" height="485" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Our Audio Editor loves her pair of Soundlink Home speakers thanks to their handsome looks and solid sound profile. You can connect them together for stereo mode as well. More than 9 hours of battery would be nice, though. Still, this is an excellent deal price on a lovely speaker.<a class="view-deal button" href="https://www.amazon.com/dp/B0DT7FT7BC/" target="_blank" rel="nofollow" data-dimension112="ab6c08e5-4727-4716-af07-3f6609dbf0ff" data-action="Deal Block" data-label="Our Audio Editor loves her pair of Soundlink Home speakers thanks to their handsome looks and solid sound profile. You can connect them together for stereo mode as well. More than 9 hours of battery would be nice, though. Still, this is an excellent deal price on a lovely speaker." data-dimension48="Our Audio Editor loves her pair of Soundlink Home speakers thanks to their handsome looks and solid sound profile. You can connect them together for stereo mode as well. More than 9 hours of battery would be nice, though. Still, this is an excellent deal price on a lovely speaker." data-dimension25="$197">View Deal</a></p></div><div class="product"><a data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$199" href="https://www.amazon.com/dp/B0FDKR4RVP/?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:62.59%;"><img id="wjSgGFFpyDJzdztK3MZ64S" name="Bose ultra open" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wjSgGFFpyDJzdztK3MZ64S.jpg" mos="" align="middle" fullscreen="" width="679" height="425" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose Ultra Open perfected the open earbud formula. They have a comfortable, non-invasive fit, solid battery life, and they sound better than you might expect from open buds. They got <a href="https://www.tomsguide.com/audio/earbuds/bose-ultra-open-earbuds" data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$199">4 stars in our review</a>, where we loved their simple controls and surprising lack of sound leakage. <a class="view-deal button" href="https://www.amazon.com/dp/B0FDKR4RVP/?" target="_blank" rel="nofollow" data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="95cb839a-276d-430e-a0a8-3ce83a1d2dc0" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension25="$249" href="https://www.amazon.com/dp/B0F7M3HPBD?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:934px;"><p class="vanilla-image-block" style="padding-top:124.20%;"><img id="a9jV9Xm3AhpGwNWnqABVVP" name="Bose QuietComfort Ultra Earbuds gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/a9jV9Xm3AhpGwNWnqABVVP.png" mos="" align="middle" fullscreen="" width="934" height="1160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly.<a class="view-deal button" href="https://www.amazon.com/dp/B0F7M3HPBD?" target="_blank" rel="nofollow" data-dimension112="95cb839a-276d-430e-a0a8-3ce83a1d2dc0" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly." data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="62651099-3d29-49e4-b22d-e0f44917f1e5" data-action="Deal Block" data-label="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension48="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension25="$329" href="https://www.amazon.com/dp/B0CVLD42PD?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:83.65%;"><img id="MVjLikCXrKRNZTADxgezp3" name="bose" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/MVjLikCXrKRNZTADxgezp3.jpg" mos="" align="middle" fullscreen="" width="679" height="568" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time. <a class="view-deal button" href="https://www.amazon.com/dp/B0CVLD42PD?" target="_blank" rel="nofollow" data-dimension112="62651099-3d29-49e4-b22d-e0f44917f1e5" data-action="Deal Block" data-label="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension48="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension25="$329">View Deal</a></p></div><div class="product"><a data-dimension112="5eff563c-c4b7-40f0-9b5e-8384f166009f" data-action="Deal Block" data-label="This deal on the QuietComfort Ultra Headphones brings them down to their lowest price ever. They're the best headphones at blocking out noise at this price, and deliver excellent sound and 24 hours of battery. In terms of comfort, they can't be beat." data-dimension48="This deal on the QuietComfort Ultra Headphones brings them down to their lowest price ever. They're the best headphones at blocking out noise at this price, and deliver excellent sound and 24 hours of battery. In terms of comfort, they can't be beat." data-dimension25="$379" href="https://www.amazon.com/dp/B0CCZ1HQ39?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:123.86%;"><img id="xEtrp3G3VkDhs6w72BpCs4" name="Bose Quietcomfort ultra" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xEtrp3G3VkDhs6w72BpCs4.jpg" mos="" align="middle" fullscreen="" width="679" height="841" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This deal on the QuietComfort Ultra Headphones brings them down to their lowest price ever. They're the best headphones at blocking out noise at this price, and deliver excellent sound and 24 hours of battery. In terms of comfort, they can't be beat.<a class="view-deal button" href="https://www.amazon.com/dp/B0CCZ1HQ39?" target="_blank" rel="nofollow" data-dimension112="5eff563c-c4b7-40f0-9b5e-8384f166009f" data-action="Deal Block" data-label="This deal on the QuietComfort Ultra Headphones brings them down to their lowest price ever. They're the best headphones at blocking out noise at this price, and deliver excellent sound and 24 hours of battery. In terms of comfort, they can't be beat." data-dimension48="This deal on the QuietComfort Ultra Headphones brings them down to their lowest price ever. They're the best headphones at blocking out noise at this price, and deliver excellent sound and 24 hours of battery. In terms of comfort, they can't be beat." data-dimension25="$379">View Deal</a></p></div><div class="product"><a data-dimension112="a882aa22-04c7-4401-8155-38daa505d289" data-action="Deal Block" data-label="The QuietComfort Ultra Gen 2 are a spectacular pair of headphones, with great ANC that defeats everything else around. They're comfortable, handsome, and they sound pretty good to boot. The 30 battery life makes them more tempting than the old model as well." data-dimension48="The QuietComfort Ultra Gen 2 are a spectacular pair of headphones, with great ANC that defeats everything else around. They're comfortable, handsome, and they sound pretty good to boot. The 30 battery life makes them more tempting than the old model as well." data-dimension25="$399" href="https://www.amazon.com/dp/B0FDKR293G/" 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="iPfpWwrQeGYvMmxuZPCecS" name="Bose QC Ultra gen 2 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/iPfpWwrQeGYvMmxuZPCecS.jpg" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The QuietComfort Ultra Gen 2 are a spectacular pair of headphones, with great ANC that defeats everything else around. They're comfortable, handsome, and they sound pretty good to boot. The 30 battery life makes them more tempting than the old model as well.<a class="view-deal button" href="https://www.amazon.com/dp/B0FDKR293G/" target="_blank" rel="nofollow" data-dimension112="a882aa22-04c7-4401-8155-38daa505d289" data-action="Deal Block" data-label="The QuietComfort Ultra Gen 2 are a spectacular pair of headphones, with great ANC that defeats everything else around. They're comfortable, handsome, and they sound pretty good to boot. The 30 battery life makes them more tempting than the old model as well." data-dimension48="The QuietComfort Ultra Gen 2 are a spectacular pair of headphones, with great ANC that defeats everything else around. They're comfortable, handsome, and they sound pretty good to boot. The 30 battery life makes them more tempting than the old model as well." data-dimension25="$399">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I survived a 15-hour coach journey thanks to these Bose headphones — now you can get $50 off the QuiteComfort Ultra Gen 2 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/over-ear-headphones/i-survived-a-15-hour-coach-journey-thanks-to-these-bose-headphones-now-you-can-get-usd50-off-the-quitecomfort-ultra-gen-2</link>
                                                                            <description>
                            <![CDATA[ The Bose QuietComfort Ultra Headphones gen 2 helped me through a long, long car journey — and now they're a whole load cheaper at Amazon. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ZL3a4SpA8xvswpfGGuPv33</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/bFrbxLZU5WhCuUhgYmDicV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 12 Feb 2026 11:35:03 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Over-Ear Headphones]]></category>
                                                    <category><![CDATA[Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/bFrbxLZU5WhCuUhgYmDicV-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose QuietComfort Ultra Headphones gen 2]]></media:description>                                                            <media:text><![CDATA[Bose QuietComfort Ultra Headphones gen 2]]></media:text>
                                <media:title type="plain"><![CDATA[Bose QuietComfort Ultra Headphones gen 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/bFrbxLZU5WhCuUhgYmDicV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I am a big fan of long journeys. Watching the scenery rush past, the quiet hum of an engine, the woosh of the tires. I prefer those journeys in a car, however. That way, I'm not disturbed by a socially inept person blasting their favorite drum and bass tracks at full volume out of their phone speakers.</p><p>Recently, I was doing some traveling across the country, and found that a coach would be the cheapest way to do it. It would not be the calmest, however, so I was very thankful that I remembered to pack my bag with the QuietComfort Ultra Headphones Gen 2. Drum and bass be gone.</p><p>Now my saviors can be yours for less — <a href="https://www.amazon.com/dp/B0FDKR293G/" target="_blank" rel="nofollow">they're currently $399 at Amazon</a>, thanks to a $50 discount.</p><div class="product"><a data-dimension112="945739ff-30f4-41df-8d6e-3356caa3bc13" data-action="Deal Block" data-label="The QuietComfort Ultra Gen 2 are a spectacular pair of headphones, with great ANC that defeats everything else around. They're comfortable, handsome, and they sound pretty good to boot. The 30 battery life makes them more tempting than the old model as well." data-dimension48="The QuietComfort Ultra Gen 2 are a spectacular pair of headphones, with great ANC that defeats everything else around. They're comfortable, handsome, and they sound pretty good to boot. The 30 battery life makes them more tempting than the old model as well." data-dimension25="$399" href="https://www.amazon.com/dp/B0FDKR293G/" 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="iPfpWwrQeGYvMmxuZPCecS" name="Bose QC Ultra gen 2 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/iPfpWwrQeGYvMmxuZPCecS.jpg" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The QuietComfort Ultra Gen 2 are a spectacular pair of headphones, with great ANC that defeats everything else around. They're comfortable, handsome, and they sound pretty good to boot. The 30 battery life makes them more tempting than the old model as well.<a class="view-deal button" href="https://www.amazon.com/dp/B0FDKR293G/" target="_blank" rel="nofollow" data-dimension112="945739ff-30f4-41df-8d6e-3356caa3bc13" data-action="Deal Block" data-label="The QuietComfort Ultra Gen 2 are a spectacular pair of headphones, with great ANC that defeats everything else around. They're comfortable, handsome, and they sound pretty good to boot. The 30 battery life makes them more tempting than the old model as well." data-dimension48="The QuietComfort Ultra Gen 2 are a spectacular pair of headphones, with great ANC that defeats everything else around. They're comfortable, handsome, and they sound pretty good to boot. The 30 battery life makes them more tempting than the old model as well." data-dimension25="$399">View Deal</a></p></div><p>I love drum and bass, don't get me wrong. Pounding low notes, massive drops, the heady delights of a darkened room at 3am as revelers try to dodge police attention. I don't love drum and bass when it's 9pm, and i'm trying to get some sleep on a bumpy coach ride with 12 hours to go.</p><p>Unluckily, they were sat just behind me, blasting an ungodly mix of Jungle, Jump Up, and goodness knows what else. If those words mean nothing to you, just imagine a wall of noise played through an ancient phone speaker. That was to be my sonic fate, as far as I could tell, for 15 hours.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vPkNbWYWPGMsPLVmRQbSu4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/vPkNbWYWPGMsPLVmRQbSu4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I don't usually wear headphones when I try to sleep, but my erstwhile cabin mate forced my hand. I pulled my QC Ultra Gen 2 over my head and turned on the ANC. Normally, I'd expect the noise of the tires to go, the sound of the engine to melt away — but my d&b loving friend was also silenced.</p><p>I didn't even play any music while I got some sleep. I just left the ANC on, blocking out the rave playlist blasting away behind me. Then, when I woke up, I left them on and played my own music. Not a drum or a bass in sight. Well, some bass. and some drums. But not those drums or basses.</p><p>The 30 hour battery life was more than enough to get me through the night and the rest of my journey, and the comfortable padding made sure I didn't get uncomfortable. At least my ears were comfortable — I don't want to spend too long thinking about that coach seat.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NZSaQVTjyyQAUhvWeRw8u4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/NZSaQVTjyyQAUhvWeRw8u4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I'm hoping I don't have to take another coach, given my long experience with this one. But, if I do, I know what headphones I'm packing in my bag to make sure I can't hear the music taste of the people sitting around me.</p><p>The first thing going in my luggage are the <a href="https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review">QuietComfort Ultra Headphones Gen 2</a> — the <a href="https://www.tomsguide.com/us/best-noise-cancelling-headphones,review-5566.html">best ANC headphones</a> that let me choose when I want to listen to drum and bass.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Need a last minute Super Bowl sound upgrade? Grab one of these five soundbars and it'll arrive before the big game ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/soundbars/need-a-last-minute-super-bowl-sound-upgrade-grab-one-of-these-five-soundbars-and-itll-arrive-before-the-big-game</link>
                                                                            <description>
                            <![CDATA[ Need a new soundbar for the big game? One of these is going to sound great, and arrive just in the nick of time. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">iwh6nVM5BwhHGxUBzif5r6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/JNB4Yd759BxDGWmKBep9oJ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 05 Feb 2026 11:24:59 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Soundbars]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Speakers]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/JNB4Yd759BxDGWmKBep9oJ-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Sonos Beam Gen 2 soundbar under Samsung Q80T QLED TV]]></media:description>                                                            <media:text><![CDATA[Sonos Beam Gen 2 soundbar under Samsung Q80T QLED TV]]></media:text>
                                <media:title type="plain"><![CDATA[Sonos Beam Gen 2 soundbar under Samsung Q80T QLED TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/JNB4Yd759BxDGWmKBep9oJ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The big game is just around the corner — a couple of days at the time of writing. If you're thinking of getting a new soundbar to put under the TV to make sure you're getting the best sound possible, you've almost run out of time. </p><p>Thankfully, you've only <em>almost </em>run out of time. Thanks to the wonders of next-day shipping, you can grab one of the <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbars</a> and have it at your door within a day. Perfect for making sure that your TV sounds the best it can to watch the biggest football game of the year.</p><p>There's a bar here for every budget, and some even come with special surround speakers for even larger sound. So let's get you sorted for Super Bowl 2026 with a brand new soundbar. Need a new TV as well? We've counted down the <a href="https://www.tomsguide.com/tvs/dont-get-sidelined-these-are-the-super-bowl-tv-deals-you-need-to-know-about-before-sundays-big-game">best Super Bowl TVs</a> as well.</p><p><em>While many people will receive their soundbars the next day, some locations may offer a different delivery time. These delivery times are correct at the time of publishing, based on a New York address. Next-day delivery requires an Amazon Prime Account.</em></p><div class="product"><a data-dimension112="ca844a84-ce15-4db3-a017-3693647c58ab" data-action="Deal Block" data-label="This budget soundbar will bring extra dialogue clarity to make sure you can hear every word of commentary throughout the game. It's also louder than your TV speakers, so you can crank it up and get hyped as the ball flies down the field. This soundbar has next-day delivery for Prime Members." data-dimension48="This budget soundbar will bring extra dialogue clarity to make sure you can hear every word of commentary throughout the game. It's also louder than your TV speakers, so you can crank it up and get hyped as the ball flies down the field. This soundbar has next-day delivery for Prime Members." data-dimension25="$199" href="https://www.amazon.com/dp/B088KRPCQJ/" 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:39.47%;"><img id="AHTTmLHs5odVXSuSHG9SB9" name="TV speaker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AHTTmLHs5odVXSuSHG9SB9.png" mos="" align="middle" fullscreen="" width="1500" height="592" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This budget soundbar will bring extra dialogue clarity to make sure you can hear every word of commentary throughout the game. It's also louder than your TV speakers, so you can crank it up and get hyped as the ball flies down the field. This soundbar has next-day delivery for Prime Members.<a class="view-deal button" href="https://www.amazon.com/dp/B088KRPCQJ/" target="_blank" rel="nofollow" data-dimension112="ca844a84-ce15-4db3-a017-3693647c58ab" data-action="Deal Block" data-label="This budget soundbar will bring extra dialogue clarity to make sure you can hear every word of commentary throughout the game. It's also louder than your TV speakers, so you can crank it up and get hyped as the ball flies down the field. This soundbar has next-day delivery for Prime Members." data-dimension48="This budget soundbar will bring extra dialogue clarity to make sure you can hear every word of commentary throughout the game. It's also louder than your TV speakers, so you can crank it up and get hyped as the ball flies down the field. This soundbar has next-day delivery for Prime Members." data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="15d03a0e-7102-43b3-81ca-659e901b4ea2" data-action="Deal Block" data-label="This is a smarter soundbar, so you can connect it to the WiFi and use it to listen to music. It features Dolby Atmos, so the game is going to sound absolutely massive — and come from all around the room. This soundbar has next day delivery at Amazon if you've got an Amazon Prime account." data-dimension48="This is a smarter soundbar, so you can connect it to the WiFi and use it to listen to music. It features Dolby Atmos, so the game is going to sound absolutely massive — and come from all around the room. This soundbar has next day delivery at Amazon if you've got an Amazon Prime account." data-dimension25="$369" href="https://www.amazon.com/dp/B09GPYL7BJ/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1123px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="wdcVazH8tGcigJums9or9e" name="Sonos_Beam_deal (2).jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wdcVazH8tGcigJums9or9e.jpg" mos="" align="middle" fullscreen="" width="1123" height="1123" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is a smarter soundbar, so you can connect it to the WiFi and use it to listen to music. It features Dolby Atmos, so the game is going to sound absolutely massive — and come from all around the room. This soundbar has next day delivery at Amazon if you've got an Amazon Prime account.<a class="view-deal button" href="https://www.amazon.com/dp/B09GPYL7BJ/" target="_blank" rel="nofollow" data-dimension112="15d03a0e-7102-43b3-81ca-659e901b4ea2" data-action="Deal Block" data-label="This is a smarter soundbar, so you can connect it to the WiFi and use it to listen to music. It features Dolby Atmos, so the game is going to sound absolutely massive — and come from all around the room. This soundbar has next day delivery at Amazon if you've got an Amazon Prime account." data-dimension48="This is a smarter soundbar, so you can connect it to the WiFi and use it to listen to music. It features Dolby Atmos, so the game is going to sound absolutely massive — and come from all around the room. This soundbar has next day delivery at Amazon if you've got an Amazon Prime account." data-dimension25="$369">View Deal</a></p></div><div class="product"><a data-dimension112="2699d377-ed87-464b-b46a-246e31900864" data-action="Deal Block" data-label="This large soundbar is packed with epic features, along with some great bass reproduction for that epic feel. You can expect great spoken word clarity as well, so you'll hear every word of commentary over the sound of screaming crowds. This soundbar has next-day delivery with an Amazon Prime account." data-dimension48="This large soundbar is packed with epic features, along with some great bass reproduction for that epic feel. You can expect great spoken word clarity as well, so you'll hear every word of commentary over the sound of screaming crowds. This soundbar has next-day delivery with an Amazon Prime account." data-dimension25="$474" href="https://www.amazon.com/dp/B0CV6439SR/" 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:57.47%;"><img id="GfGDka5SJCEW3bGzphkXGm" name="Flexus CORE 200" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GfGDka5SJCEW3bGzphkXGm.png" mos="" align="middle" fullscreen="" width="1500" height="862" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This large soundbar is packed with epic features, along with some great bass reproduction for that epic feel. You can expect great spoken word clarity as well, so you'll hear every word of commentary over the sound of screaming crowds. This soundbar has next-day delivery with an Amazon Prime account.<a class="view-deal button" href="https://www.amazon.com/dp/B0CV6439SR/" target="_blank" rel="nofollow" data-dimension112="2699d377-ed87-464b-b46a-246e31900864" data-action="Deal Block" data-label="This large soundbar is packed with epic features, along with some great bass reproduction for that epic feel. You can expect great spoken word clarity as well, so you'll hear every word of commentary over the sound of screaming crowds. This soundbar has next-day delivery with an Amazon Prime account." data-dimension48="This large soundbar is packed with epic features, along with some great bass reproduction for that epic feel. You can expect great spoken word clarity as well, so you'll hear every word of commentary over the sound of screaming crowds. This soundbar has next-day delivery with an Amazon Prime account." data-dimension25="$474">View Deal</a></p></div><div class="product"><a data-dimension112="a4a09ecc-15a8-485b-9dc8-bae655b863b8" data-action="Deal Block" data-label="This monster soundbar doesn't just have a standard bar — it's also packing some physical surround speakers for extra soundstage. The subwoofer will bring the bass; you're in for the best Super Bowl sound you've ever heard. This soundbar package will be delivered next day with an Amazon Prime account." data-dimension48="This monster soundbar doesn't just have a standard bar — it's also packing some physical surround speakers for extra soundstage. The subwoofer will bring the bass; you're in for the best Super Bowl sound you've ever heard. This soundbar package will be delivered next day with an Amazon Prime account." data-dimension25="$796" href="https://www.amazon.com/dp/B0CX41212N/" 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:60.40%;"><img id="fJwsKp5Lwq6Vwso7xxHKz9" name="LG290TR.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/fJwsKp5Lwq6Vwso7xxHKz9.jpg" mos="" align="middle" fullscreen="" width="1500" height="906" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This monster soundbar doesn't just have a standard bar — it's also packing some physical surround speakers for extra soundstage. The subwoofer will bring the bass; you're in for the best Super Bowl sound you've ever heard. This soundbar package will be delivered next day with an Amazon Prime account.<a class="view-deal button" href="https://www.amazon.com/dp/B0CX41212N/" target="_blank" rel="nofollow" data-dimension112="a4a09ecc-15a8-485b-9dc8-bae655b863b8" data-action="Deal Block" data-label="This monster soundbar doesn't just have a standard bar — it's also packing some physical surround speakers for extra soundstage. The subwoofer will bring the bass; you're in for the best Super Bowl sound you've ever heard. This soundbar package will be delivered next day with an Amazon Prime account." data-dimension48="This monster soundbar doesn't just have a standard bar — it's also packing some physical surround speakers for extra soundstage. The subwoofer will bring the bass; you're in for the best Super Bowl sound you've ever heard. This soundbar package will be delivered next day with an Amazon Prime account." data-dimension25="$796">View Deal</a></p></div><div class="product"><a data-dimension112="df316ce6-9f28-4b31-ba96-a93a8cad0253" data-action="Deal Block" data-label="This Samsung soundbar is loud and in charge. There are a pair of surround speakers that come in the box for a much wider soundstage, and then a massive sub to make sure you get the most bass possible. For the Super Bowl, there's little better. This soundbar can be delivered the next day with Amazon Prime." data-dimension48="This Samsung soundbar is loud and in charge. There are a pair of surround speakers that come in the box for a much wider soundstage, and then a massive sub to make sure you get the most bass possible. For the Super Bowl, there's little better. This soundbar can be delivered the next day with Amazon Prime." data-dimension25="$1697" href="https://www.amazon.com/dp/B0DY1XTF77/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="hiTceUPoM2UngEXRiyR2YW" name="Q990F" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hiTceUPoM2UngEXRiyR2YW.png" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This Samsung soundbar is loud and in charge. There are a pair of surround speakers that come in the box for a much wider soundstage, and then a massive sub to make sure you get the most bass possible. For the Super Bowl, there's little better. This soundbar can be delivered the next day with Amazon Prime.<a class="view-deal button" href="https://www.amazon.com/dp/B0DY1XTF77/" target="_blank" rel="nofollow" data-dimension112="df316ce6-9f28-4b31-ba96-a93a8cad0253" data-action="Deal Block" data-label="This Samsung soundbar is loud and in charge. There are a pair of surround speakers that come in the box for a much wider soundstage, and then a massive sub to make sure you get the most bass possible. For the Super Bowl, there's little better. This soundbar can be delivered the next day with Amazon Prime." data-dimension48="This Samsung soundbar is loud and in charge. There are a pair of surround speakers that come in the box for a much wider soundstage, and then a massive sub to make sure you get the most bass possible. For the Super Bowl, there's little better. This soundbar can be delivered the next day with Amazon Prime." data-dimension25="$1697">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Audio gear in the US is more expensive than ever — here's how to land a mega deal ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/audio-gear-in-the-us-is-more-expensive-than-ever-heres-how-to-land-a-mega-deal</link>
                                                                            <description>
                            <![CDATA[ Everything is getting too expensive — here's how to save some money on headphones, earbuds, and speakers. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">WbsB52ZSCqEVcB5gcD7TfT</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/E4JgAsK4wGtTMEejcnQ2td-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 02 Feb 2026 11:51:52 +0000</pubDate>                                                                                                                                <updated>Tue, 28 Apr 2026 18:16:11 +0000</updated>
                                                                                                                                            <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/E4JgAsK4wGtTMEejcnQ2td-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[the nothing cmf buds pro 2 cmf by nothing buds pro 2 in bright orange shown in the smart dial charging case against a blue tom&#039;s guide background]]></media:description>                                                            <media:text><![CDATA[the nothing cmf buds pro 2 cmf by nothing buds pro 2 in bright orange shown in the smart dial charging case against a blue tom&#039;s guide background]]></media:text>
                                <media:title type="plain"><![CDATA[the nothing cmf buds pro 2 cmf by nothing buds pro 2 in bright orange shown in the smart dial charging case against a blue tom&#039;s guide background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/E4JgAsK4wGtTMEejcnQ2td-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>At the moment, I'm working on an article that shows you how to get better sound for the same price as a Sonos soundbar setup. I've had just one problem in my sonic journey — the price of audio things is feeling pretty dire in the U.S. at the moment.</p><p>The speakers I want for the system are $2,800 Stateside, and the amp is $200 more than it would be where I live. Audio gear has never been more expensive, I've realised, and it's even true of the headphones and earbuds that everyone needs for day-to-day listening.</p><p>Sony's latest headphones, the <a href="https://www.tomsguide.com/audio/over-ear-headphones/sony-wh-1000xm6-review">WH-1000XM6</a>, cost $50 more than the previous model. The <a href="https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review">Bose QuietComfort Ultra Headphones Gen 2</a> came with a price hike. The <a href="https://www.tomsguide.com/audio/over-ear-headphones/nothing-headphone-1-review">Nothing Headphone 1</a> are more expensive in the U.S. than just about anywhere else. So how do you solve it? Here are my 5 tips for saving money when buying new audio stuff.</p><h2 id="1-buy-the-older-model">1. Buy the older model</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.20%;"><img id="TZKMvVBZCvEeGUr7RbhHaD" name="SOny Xm5 wireless charging" alt="Sony XM5 in hand" src="https://cdn.mos.cms.futurecdn.net/TZKMvVBZCvEeGUr7RbhHaD.jpg" mos="" align="middle" fullscreen="" width="2000" height="1124" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Look, I know how nice it is to get the newest thing from the biggest brands. It comes with an irresistible luster that's almost impossible to ignore, with all those fancy new features and clever design changes. But it's not a good way of saving money, especially with the price hikes that have made themselves known in the most recent flagships.</p><p>If you go with the previous model, you'll save buckets while getting flagship features. The <a href="https://www.tomsguide.com/reviews/sony-wh-1000xm5">WH-1000XM5</a> might not have the same folding design or fancy magnetic case, but they're about $120 cheaper (on average) than the newer model. That's a massive saving.</p><p>Bose is the same. The older first-generation <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-ultra-headphones">QuietComfort Ultra Headphones</a> can still be found for around $200 less than the second-generation version. That's another massive saving.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1190px;"><p class="vanilla-image-block" style="padding-top:53.95%;"><img id="Xx34oEgwkfX84R7D34usmL" name="Sony3.jpg" alt="The Editor's Choice Sony WH-1000XM4" src="https://cdn.mos.cms.futurecdn.net/Xx34oEgwkfX84R7D34usmL.jpg" mos="" align="middle" fullscreen="" width="1190" height="642" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Still want flagship cans, but you're reluctant to pay for the XM5? Go and grab some of the even older (and still just as excellent) WH-1000XM4. Those come in upwards of $150 cheaper than the current flagships.</p><p>Yes, the XM6 and the QuietComfort Ultra Gen 2 are some of the <a href="https://www.tomsguide.com/us/best-headphones,review-1988.html">best headphones</a> you can buy today — but so are their predecessors, and those savings should be impossible to resist.</p><div class="product"><a data-dimension112="b20fdf67-4819-4ab9-95d6-66533ed79949" data-action="Deal Block" data-label="They're not as fancy as the brand new XM6, but they're still great headphones. The same 30 hours of battery, bigger, more immersive sound and a hard case that ruled the roost for many years. All this for $150 less than the brand new model." data-dimension48="They're not as fancy as the brand new XM6, but they're still great headphones. The same 30 hours of battery, bigger, more immersive sound and a hard case that ruled the roost for many years. All this for $150 less than the brand new model." data-dimension25="$299" href="https://www.amazon.com/dp/B0CFT4N7T9/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:903px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="uHRcGsbDJRRXBfSf9vB7mT" name="sony-xm4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/uHRcGsbDJRRXBfSf9vB7mT.jpg" mos="" align="middle" fullscreen="" width="903" height="903" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>They're not as fancy as the brand new XM6, but they're still great headphones. The same 30 hours of battery, bigger, more immersive sound and a hard case that ruled the roost for many years. All this for $150 less than the brand new model.<a class="view-deal button" href="https://www.amazon.com/dp/B0CFT4N7T9/" target="_blank" rel="nofollow" data-dimension112="b20fdf67-4819-4ab9-95d6-66533ed79949" data-action="Deal Block" data-label="They're not as fancy as the brand new XM6, but they're still great headphones. The same 30 hours of battery, bigger, more immersive sound and a hard case that ruled the roost for many years. All this for $150 less than the brand new model." data-dimension48="They're not as fancy as the brand new XM6, but they're still great headphones. The same 30 hours of battery, bigger, more immersive sound and a hard case that ruled the roost for many years. All this for $150 less than the brand new model." data-dimension25="$299">View Deal</a></p></div><div class="product"><a data-dimension112="d985f7e4-58b7-4521-8b6c-e18a2fa3e1a3" data-action="Deal Block" data-label="The Bose QuietComfort Ultra headphones might not always be as cheap as this deal, but they're on average about $120 less over the course of the year. Similar sound, same fit and design — the only one who's going to know they're the older model is you." data-dimension48="The Bose QuietComfort Ultra headphones might not always be as cheap as this deal, but they're on average about $120 less over the course of the year. Similar sound, same fit and design — the only one who's going to know they're the older model is you." data-dimension25="$279" href="https://www.amazon.com/dp/B0DX2LNZ68/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1488px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="WyS7huPKh43LifbuScxtig" name="QuietComfort Ultra Headphones" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WyS7huPKh43LifbuScxtig.png" mos="" align="middle" fullscreen="" width="1488" height="1488" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Ultra headphones might not always be as cheap as this deal, but they're on average about $120 less over the course of the year. Similar sound, same fit and design — the only one who's going to know they're the older model is you. <a class="view-deal button" href="https://www.amazon.com/dp/B0DX2LNZ68/" target="_blank" rel="nofollow" data-dimension112="d985f7e4-58b7-4521-8b6c-e18a2fa3e1a3" data-action="Deal Block" data-label="The Bose QuietComfort Ultra headphones might not always be as cheap as this deal, but they're on average about $120 less over the course of the year. Similar sound, same fit and design — the only one who's going to know they're the older model is you." data-dimension48="The Bose QuietComfort Ultra headphones might not always be as cheap as this deal, but they're on average about $120 less over the course of the year. Similar sound, same fit and design — the only one who's going to know they're the older model is you." data-dimension25="$279">View Deal</a></p></div><h2 id="2-go-off-the-beaten-track">2. Go off the beaten track</h2><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="h6mvrd8sx3Pu2iPVsL92sd" name="Nothing_Dirac_CMF_Buds_2_ 3.JPG" alt="the nothing cmf buds pro 2 cmf by nothing buds pro 2 in bright orange shown in the smart dial charging case against a blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/h6mvrd8sx3Pu2iPVsL92sd.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>Having a pair of AirPods hanging out of your ears has become in recent years something of a status symbol — although it's one you don't have to make if you want to save money. Sure, the <a href="https://www.tomsguide.com/audio/airpods/apple-airpods-pro-3-review">AirPods Pro 3</a> and even the <a href="https://www.tomsguide.com/reviews/airpods-pro-2-review">AirPods Pro 2</a> are excellent earbuds, but you can get similar performance if you're willing to go for brands that you might not have heard of before.</p><p>The <a href="https://www.tomsguide.com/audio/earbuds/cmf-by-nothing-buds-pro-2-review">CMF Buds Pro 2</a> are some of our favorite earbuds, offering spectacular battery life, stellar sound and a standout colorful design. We've stacked them up against the AirPods models, and they come out on top when it comes to staying power; 11 hours to the AirPods Pro 3's 8. </p><p>The best bit? They cost $70. <em>$70. </em>You could get three pairs of the CMF Buds Pro 2 and have some change left over for a very nice meal out before you've spent the same as Apple's buds. </p><div class="product"><a data-dimension112="b609a6b3-9e80-4591-81fe-42f712266275" data-action="Deal Block" data-label="They rival the AirPods Pro 3 when it comes to features and sound quality, and then cost less than a third of the price. 43 hours of case battery, Spatial Audio, excellent noise canceling — there's little more you could ask for." data-dimension48="They rival the AirPods Pro 3 when it comes to features and sound quality, and then cost less than a third of the price. 43 hours of case battery, Spatial Audio, excellent noise canceling — there's little more you could ask for." data-dimension25="$59" href="https://www.amazon.com/dp/B0D83J6JJ9/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:978px;"><p class="vanilla-image-block" style="padding-top:122.09%;"><img id="7wasxPqe5698hiHYZvXn9W" name="61YeKJu7oML._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7wasxPqe5698hiHYZvXn9W.jpg" mos="" align="middle" fullscreen="" width="978" height="1194" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>They rival the AirPods Pro 3 when it comes to features and sound quality, and then cost less than a third of the price. 43 hours of case battery, Spatial Audio, excellent noise canceling — there's little more you could ask for.<a class="view-deal button" href="https://www.amazon.com/dp/B0D83J6JJ9/" target="_blank" rel="nofollow" data-dimension112="b609a6b3-9e80-4591-81fe-42f712266275" data-action="Deal Block" data-label="They rival the AirPods Pro 3 when it comes to features and sound quality, and then cost less than a third of the price. 43 hours of case battery, Spatial Audio, excellent noise canceling — there's little more you could ask for." data-dimension48="They rival the AirPods Pro 3 when it comes to features and sound quality, and then cost less than a third of the price. 43 hours of case battery, Spatial Audio, excellent noise canceling — there's little more you could ask for." data-dimension25="$59">View Deal</a></p></div><h2 id="3-wait-for-deals-events">3. Wait for deals events</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2053px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="tTh5TCMhMAc9UeyD8848nV" name="Bose QC Headphones-13.jpg" alt="Testing call quality on the Bose QuietComfort Headphones" src="https://cdn.mos.cms.futurecdn.net/tTh5TCMhMAc9UeyD8848nV.jpg" mos="" align="middle" fullscreen="" width="2053" height="1155" attribution="" endorsement="" class="inline"></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 is said that you're never more than a few feet away from a spider, no matter where you are. The same can be said of deals events. No matter where in the year you find yourself, you're almost certainly only a couple of months away from Black Friday or one of the many (many) Prime Day events.</p><p>That's good for you — they're the perfect time to get a new pair of headphones, some earbuds, or a new Bluetooth speaker. I've seen prices on even the newest products dip to hitherto unseen depths, making them more affordable than ever.</p><p>Apply the two tips above to the deals event and you'll save even more money. Watch out for these events throughout the year to save as much as possible. Or, just keep coming back to Tom's Guide because we'll regularly point out the deals worth your time — and the ones to avoid.</p><h2 id="4-buy-second-hand">4. Buy second hand</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NrQjfEYNTVhJVdV66kdND9" name="Marshall Emberton III listing 1" alt="Marshall Emberton III bluetooth speaker" src="https://cdn.mos.cms.futurecdn.net/NrQjfEYNTVhJVdV66kdND9.jpg" mos="" align="middle" fullscreen="" width="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>First things first — I wouldn't recommend buying earbuds or headphones second-hand. You'll likely find plenty of unwanted grease and goo all over them, and cleaning them out is a fool's errand. And <em>gross. </em>They might be cheaper, but I'd wager it's not worth it.</p><p>Instead, go second-hand for the <a href="https://www.tomsguide.com/us/best-bluetooth-speakers,review-1982.html">best Bluetooth speakers</a> and HiFi components. I built an entire HiFi rack during college for the price of a few large pizzas from Domino's, thanks to second-hand stores (and eBay), and I had very few issues over the course of my ownership. I still use the speakers, in fact.</p><p>You do have to be careful, however. Only buy from highly rated sellers, or go to your local second-hand store so that you can return it if it's not working (depending on whether the store offers such a service). I'd avoid Craigslist like the plague, for example. </p><h2 id="5-make-your-old-pair-last-longer">5. Make your old pair last longer</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:970px;"><p class="vanilla-image-block" style="padding-top:56.19%;"><img id="oEfkMSTW8ScYN9yfNpCVP" name="Sony WH-1000XM4 (5).jpg" alt="Sony WH-1000XM4" src="https://cdn.mos.cms.futurecdn.net/oEfkMSTW8ScYN9yfNpCVP.jpg" mos="" align="middle" fullscreen="" width="970" height="545" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Regan Coule/Tom's Guide)</span></figcaption></figure><p>I know that getting something new feels great. Opening the box, the "new thing smell" — it's all wonderful. But if you're trying to save money, you're better off looking after what you've got or troubleshooting issues so that you don't have to spend money on something new.</p><p>If your earpads are starting to wear out, don't put the whole headset in the garbage. Go and find some replacements instead, and get another few years on the clock. If your earbuds sound muffled, give them a clean with some cotton buds or a cleaning kit. </p><p>And if they still work and you just fancy a change, see if you can find the settings menu in case there's something you're missing. You don't need to have the latest thing, especially if you're looking to spend less.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eGV19X"></div>                            </div>                            <script src="https://kwizly.com/embed/eGV19X.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/patagonia-is-slashing-the-prices-on-winter-jackets-fleeces-and-more-heres-21-apparel-deals-starting-at-usd11">Patagonia is slashing the prices on winter jackets, fleeces and more — here's 21 apparel deals starting at $11</a></li><li><a href="https://www.tomsguide.com/audio/5-of-the-greatest-live-performances-to-test-your-headphones-with">5 of the greatest live performances to test your headphones with</a></li><li><a href="https://www.tomsguide.com/home/ikeas-adorable-new-portable-lamp-looks-like-a-sad-giraffe-and-i-want-to-give-it-a-big-hug">IKEA's adorable new portable lamp looks like a sad giraffe, and I want to give it a big hug</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ My highest-rated soundbars are on sale right now before the Super Bowl — yes, including Bose, Samsung, and Klipsch ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/soundbars/my-highest-rated-soundbars-are-randomly-on-sale-right-now-yes-including-bose-samsung-and-klipsch</link>
                                                                            <description>
                            <![CDATA[ I reviewed 16 soundbars last year, and five of my favorites are discounted right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">XoLrFynfkf8h4NZbfbiwL5</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/t5ys6eFvzQhQNNF2w3dNs4-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 30 Jan 2026 15:30:29 +0000</pubDate>                                                                                                                                <updated>Sat, 31 Jan 2026 19:11:25 +0000</updated>
                                                                                                                                            <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.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>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/t5ys6eFvzQhQNNF2w3dNs4-1280-80.jpg">
                                                            <media:credit><![CDATA[Bose / Samsung / Klipsch / Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[the bose smart soundbar, samsung q600f, klipsch flexus core 100 soundbars on a peach background with a blue tom&#039;s guide price drop badge]]></media:description>                                                            <media:text><![CDATA[the bose smart soundbar, samsung q600f, klipsch flexus core 100 soundbars on a peach background with a blue tom&#039;s guide price drop badge]]></media:text>
                                <media:title type="plain"><![CDATA[the bose smart soundbar, samsung q600f, klipsch flexus core 100 soundbars on a peach background with a blue tom&#039;s guide price drop badge]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/t5ys6eFvzQhQNNF2w3dNs4-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Last year, I reviewed more soundbars than anyone else at Tom's Guide, which means I get to spend my afternoons watching Top Gun: Maverick, The Wild Robot, and The Batman, and calling it work. Yeah, I know. It's a hard life, eh? </p><p>Jokes aside, this means I know exactly which soundbars are worth your money, especially as we gear up for Super Bowl LX. I've reviewed the <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbars</a> that'll run you back $3k — and also super-affordable $99 models. My advice? If you've got $3k to spend on your home theater, don't bother with soundbars. I'd recommend getting floor-standing speakers and a proper hi-fi setup. </p><p>But, if you're short on space or, like most of us mere mortals, you <em>don't</em> have a fortune to spend, I've got you. I've reviewed affordable soundbars from Bose, Samsung, Sony, Klipsch, Yamaha, Polk Audio, Ultimea, Majority, and even more. Right now, some of my highest-rated soundbars from Bose, Samsung, Polk Audio, and Klipsch are randomly discounted right now, so there's never been a better time to buy. Also be sure to check out our roundup of the <a href="https://www.tomsguide.com/tvs/4k-tvs/best-super-bowl-tv-deals-my-top-picks-from-usd59-to-oled-luxury">25 best Super Bowl TV deals</a>.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong>Klipsch Flexus Core 100: </strong><a href="https://www.bestbuy.com/product/klipsch-flexus-core-100-2-1-soundbar-black/JX44FCZP6Z" target="_blank" rel="nofollow"><strong>was $349 now $279 @ Best Buy</strong></a></li><li><strong>Polk Audio Signa S4: </strong><a href="https://www.amazon.com/Polk-Audio-Signa-S4-Ultra-Slim/dp/B09J753M18" target="_blank" rel="nofollow"><strong>was $449 now $379 @ Amazon</strong></a><strong></strong></li><li><strong>Bose Smart Soundbar: </strong><a href="https://www.bestbuy.com/product/bose-smart-soundbar-with-dolby-atmos-and-voice-control-black/J7C5V6TK56/sku/6590419" target="_blank" rel="nofollow"><strong>was $549 now $399 @ Best Buy</strong></a></li><li><strong>Samsung Q600F: </strong><a href="https://www.bestbuy.com/product/samsung-q-series-hw-q600f-atmos-3-1-2-ch-soundbar-with-subwoofer-titan-black/J3ZYG2FV7Z/sku/6619392" target="_blank" rel="nofollow"><strong>was $699 now $449 @ Best Buy</strong></a><strong></strong></li><li><strong>Samsung QS750F: </strong><a href="https://www.bestbuy.com/product/samsung-q-series-hw-qs750f-5-1-2-ch-soundbar-with-subwoofer-and-rear-speakers-titan-black/J3ZYGX7CYL/sku/6610063" target="_blank" rel="nofollow"><strong>was $899 now $699 @ Best Buy</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-my-favorite-soundbar-deals-right-now"><span>My favorite soundbar deals right now</span></h3><div class="product"><a data-dimension112="d2f0c9ef-e047-4c00-8069-84a025901ce1" data-action="Deal Block" data-label="Klipsch Flexus Core 100" data-dimension48="Klipsch Flexus Core 100" data-dimension25="$279" href="https://www.bestbuy.com/product/klipsch-flexus-core-100-2-1-soundbar-black/JX44FCZP6Z" 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="Kst3T7bzZk2GeVeyZe7e5j" name="klipsch flexus core 100 deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Kst3T7bzZk2GeVeyZe7e5j.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/soundbars/klipsch-flexus-core-100-review" data-dimension112="d2f0c9ef-e047-4c00-8069-84a025901ce1" data-action="Deal Block" data-label="Klipsch Flexus Core 100" data-dimension48="Klipsch Flexus Core 100" data-dimension25="$279">Klipsch Flexus Core 100</a> is an ideal first soundbar. As it's part of Klipsch's "Flexus" collection, it's buildable into a multi-device home hi-fi system. You can get rears and a subwoofer whenever you want. As for the soundbar itself, it's compact, bassy, and very affordable. The only major downside is that it has no Wi-Fi, but if you only want a soundbar for great sound, this isn't an issue. <a class="view-deal button" href="https://www.bestbuy.com/product/klipsch-flexus-core-100-2-1-soundbar-black/JX44FCZP6Z" target="_blank" rel="nofollow" data-dimension112="d2f0c9ef-e047-4c00-8069-84a025901ce1" data-action="Deal Block" data-label="Klipsch Flexus Core 100" data-dimension48="Klipsch Flexus Core 100" data-dimension25="$279">View Deal</a></p></div><div class="product"><a data-dimension112="a40d21e6-cbd6-406b-9638-135ca7d2e9b3" data-action="Deal Block" data-label="Polk Audio Signa S4" data-dimension48="Polk Audio Signa S4" data-dimension25="$379" href="https://www.amazon.com/Polk-Audio-Signa-S4-Ultra-Slim/dp/B09J753M18" 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:120.00%;"><img id="MQA2fDw3TZNB6m5sYLUUcQ" name="Polk Signa S4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/MQA2fDw3TZNB6m5sYLUUcQ.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/soundbars/polk-audio-signa-s4-review" data-dimension112="a40d21e6-cbd6-406b-9638-135ca7d2e9b3" data-action="Deal Block" data-label="Polk Audio Signa S4" data-dimension48="Polk Audio Signa S4" data-dimension25="$379">Polk Audio Signa S4 </a>is my go-to recommendation for Dolby Atmos sound on a budget. This soundbar has a fantastic 3.1.2 channel configuration with a wireless subwoofer for extra floor-shaking bass. When I tested this soundbar, I couldn't believe how advanced its Dolby Atmos was. During swimming scenes, I genuinely felt like I was underwater. <a class="view-deal button" href="https://www.amazon.com/Polk-Audio-Signa-S4-Ultra-Slim/dp/B09J753M18" target="_blank" rel="nofollow" data-dimension112="a40d21e6-cbd6-406b-9638-135ca7d2e9b3" data-action="Deal Block" data-label="Polk Audio Signa S4" data-dimension48="Polk Audio Signa S4" data-dimension25="$379">View Deal</a></p></div><div class="product"><a data-dimension112="e6866cad-1d34-450a-892f-fc482683b15c" data-action="Deal Block" data-label="Bose Smart Soundbar" data-dimension48="Bose Smart Soundbar" data-dimension25="$399" href="https://www.bestbuy.com/product/bose-smart-soundbar-with-dolby-atmos-and-voice-control-black/J7C5V6TK56/sku/6590419" 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:120.00%;"><img id="rJbLARrb3giTtDi2jTiuGE" name="Bose Smart Soundbar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rJbLARrb3giTtDi2jTiuGE.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/soundbars/bose-smart-soundbar-review" data-dimension112="e6866cad-1d34-450a-892f-fc482683b15c" data-action="Deal Block" data-label="Bose Smart Soundbar" data-dimension48="Bose Smart Soundbar" data-dimension25="$399">Bose Smart Soundbar</a> is a great beginner soundbar. With a 3.0.2 channel setup, it has great surround sound, even in shows and movies you least expect it. The soundbar can even upcode non-Atmos content into "fake" suround sound. The dialogue is crisp thanks to Bose's AI dialogue mode, and the bass is surprisingly great when listening to music via AirPlay. Although it's not as room-filling as pricier alternatives, it's a fantastic option. You can even add <a href="https://www.amazon.com/Bose-Bass-Module-700-Black/dp/B07F39ZRCQ" target="_blank" rel="nofollow">Bose's Sub 700</a> ($899) as an extra. <a class="view-deal button" href="https://www.bestbuy.com/product/bose-smart-soundbar-with-dolby-atmos-and-voice-control-black/J7C5V6TK56/sku/6590419" target="_blank" rel="nofollow" data-dimension112="e6866cad-1d34-450a-892f-fc482683b15c" data-action="Deal Block" data-label="Bose Smart Soundbar" data-dimension48="Bose Smart Soundbar" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="54dcb255-b338-4f83-8f81-f2c5f6a6d0f4" data-action="Deal Block" data-label="Samsung Q600F" data-dimension48="Samsung Q600F" data-dimension25="$499" href="https://www.bestbuy.com/product/samsung-q-series-hw-q600f-atmos-3-1-2-ch-soundbar-with-subwoofer-titan-black/J3ZYG2FV7Z/sku/6619392" 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:120.00%;"><img id="ExfR2TSGT2maYw6G6JSFS5" name="Samsung Q600F" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ExfR2TSGT2maYw6G6JSFS5.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/soundbars/samsung-q600f-review" data-dimension112="54dcb255-b338-4f83-8f81-f2c5f6a6d0f4" data-action="Deal Block" data-label="Samsung Q600F" data-dimension48="Samsung Q600F" data-dimension25="$499">Samsung Q600F</a> is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it. <a class="view-deal button" href="https://www.bestbuy.com/product/samsung-q-series-hw-q600f-atmos-3-1-2-ch-soundbar-with-subwoofer-titan-black/J3ZYG2FV7Z/sku/6619392" target="_blank" rel="nofollow" data-dimension112="54dcb255-b338-4f83-8f81-f2c5f6a6d0f4" data-action="Deal Block" data-label="Samsung Q600F" data-dimension48="Samsung Q600F" data-dimension25="$499">View Deal</a></p></div><div class="product"><a data-dimension112="67708e75-d5bc-4915-85e8-5fdbc636a082" data-action="Deal Block" data-label="Samsung QS750F" data-dimension48="Samsung QS750F" data-dimension25="$699" href="https://www.bestbuy.com/product/samsung-q-series-hw-qs750f-5-1-2-ch-soundbar-with-subwoofer-and-rear-speakers-titan-black/J3ZYGX7CYL/sku/6610063" 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="TjpQTnAYrWC6KVhSH67Cf6" name="samsung qs750f" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/TjpQTnAYrWC6KVhSH67Cf6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/soundbars/samsung-qs750f-review" data-dimension112="67708e75-d5bc-4915-85e8-5fdbc636a082" data-action="Deal Block" data-label="Samsung QS750F" data-dimension48="Samsung QS750F" data-dimension25="$699">Samsung QS750F</a> is a marvel. You get two rear speakers, a subwoofer, and a 5-channel soundbar for under $1,000 — even at full price. At this discount, this is a major steal. The sound quality is utterly fantastic, with powerful, room-shaking bass, and crystal-clear dialogue. The only main downside is that the rear speakers need to be plugged into power, but this isn't a huge issue. <a class="view-deal button" href="https://www.bestbuy.com/product/samsung-q-series-hw-qs750f-5-1-2-ch-soundbar-with-subwoofer-and-rear-speakers-titan-black/J3ZYGX7CYL/sku/6610063" target="_blank" rel="nofollow" data-dimension112="67708e75-d5bc-4915-85e8-5fdbc636a082" data-action="Deal Block" data-label="Samsung QS750F" data-dimension48="Samsung QS750F" data-dimension25="$699">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested the Sony WH-1000XM6 vs Bose QuietComfort Ultra 2 for 6 months — and there's a clear winner ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/headphones/i-tested-the-sony-wh-1000xm6-vs-bose-quietcomfort-ultra-2-for-6-months-and-theres-a-clear-winner</link>
                                                                            <description>
                            <![CDATA[ Both headphones have now been out for a while — but which ones are the best? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">vrYttSGpzGcTGZTSsxYxpJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/JgyhmNZRrs96YRPdeV2RZS-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 28 Jan 2026 05:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/JgyhmNZRrs96YRPdeV2RZS-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose QuietComfort Ultra headphones gen 2 vs Sony WH-1000XM6]]></media:description>                                                            <media:text><![CDATA[Bose QuietComfort Ultra headphones gen 2 vs Sony WH-1000XM6]]></media:text>
                                <media:title type="plain"><![CDATA[Bose QuietComfort Ultra headphones gen 2 vs Sony WH-1000XM6]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/JgyhmNZRrs96YRPdeV2RZS-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>So I've had the <a href="https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review">Bose QuietComfort Ultra Headphones Gen 2</a> and the <a href="https://www.tomsguide.com/audio/over-ear-headphones/sony-wh-1000xm6-review">Sony WH-1000XM6</a> for about half a year. I've thoroughly put both through their paces, and they've each taken a turn as my primary pair of headphones. </p><p>I started off preferring the noise canceling of the Bose headphones — it really does block <em>everything. </em>But time makes fools of us all (or so I'm told), and the 1000XM6 have slowly crept their way into my heart. So much so that I'd say they're my pick of the two — if you're looking for buying advice, that's about as good as you're going to get.</p><p>But what's my journey been like, and why has it taken this long to make a final decision? Let me tell you all about it.</p><div class="product"><a data-dimension112="893ba61d-c7af-4141-8d49-bccca6f60ed6" data-action="Deal Block" data-label="The Sony WH-1000XM6 sit at the top of the Sony headphones hierarchy with excellent noise canceling, supremely customizable sound, and 30 hours of battery life." data-dimension48="The Sony WH-1000XM6 sit at the top of the Sony headphones hierarchy with excellent noise canceling, supremely customizable sound, and 30 hours of battery life." data-dimension25="$398" href="https://www.amazon.com/dp/B0F3PQHWTZ/" 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:120.00%;"><img id="x3hpHUb8bPXUJsBkoevKDN" name="Sony WH-1000XM6" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/x3hpHUb8bPXUJsBkoevKDN.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Sony WH-1000XM6 sit at the top of the Sony headphones hierarchy with excellent noise canceling, supremely customizable sound, and 30 hours of battery life. <a class="view-deal button" href="https://www.amazon.com/dp/B0F3PQHWTZ/" target="_blank" rel="nofollow" data-dimension112="893ba61d-c7af-4141-8d49-bccca6f60ed6" data-action="Deal Block" data-label="The Sony WH-1000XM6 sit at the top of the Sony headphones hierarchy with excellent noise canceling, supremely customizable sound, and 30 hours of battery life." data-dimension48="The Sony WH-1000XM6 sit at the top of the Sony headphones hierarchy with excellent noise canceling, supremely customizable sound, and 30 hours of battery life." data-dimension25="$398">View Deal</a></p></div><div class="product"><a data-dimension112="84333434-6682-41c9-922d-c98667b33d22" data-action="Deal Block" data-label="The Bose QuietComfort Headphones gen 2 offer best-in-class noise cancellation along with a new spatial audio mode and 24 hours of battery life." data-dimension48="The Bose QuietComfort Headphones gen 2 offer best-in-class noise cancellation along with a new spatial audio mode and 24 hours of battery life." data-dimension25="$329" href="https://www.amazon.com/dp/B0CCZ1L489?th=1" 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="iPfpWwrQeGYvMmxuZPCecS" name="Bose QC Ultra gen 2 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/iPfpWwrQeGYvMmxuZPCecS.jpg" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Headphones gen 2 offer best-in-class noise cancellation along with a new spatial audio mode and 24 hours of battery life. <a class="view-deal button" href="https://www.amazon.com/dp/B0CCZ1L489?th=1" target="_blank" rel="nofollow" data-dimension112="84333434-6682-41c9-922d-c98667b33d22" data-action="Deal Block" data-label="The Bose QuietComfort Headphones gen 2 offer best-in-class noise cancellation along with a new spatial audio mode and 24 hours of battery life." data-dimension48="The Bose QuietComfort Headphones gen 2 offer best-in-class noise cancellation along with a new spatial audio mode and 24 hours of battery life." data-dimension25="$329">View Deal</a></p></div><h2 id="a-matter-of-style">A matter of style</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vPkNbWYWPGMsPLVmRQbSu4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/vPkNbWYWPGMsPLVmRQbSu4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You're going to be wearing your headphones a whole lot, so I still think that the way that they look is very important. Both the Sony and the Bose headphones look pretty good from any distance — but I've managed to come to a conclusion on which I prefer.</p><p>First and foremost, if you're going to buy some QuietComfort Ultra Headphones, make sure you go for one of the colors without shiny armatures: The chrome covered metal ones are nice to look at for all of three seconds before you accidentally cover them in greasy fingerprints. Your hair (if you've got enough, or any for that matter) will add some extra grease too. They quickly look gross.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-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="FP8ouWYoG2nhsxPHVnRArb" name="Sony WH-1000XM6" alt="Sony WH-1000XM6" src="https://cdn.mos.cms.futurecdn.net/FP8ouWYoG2nhsxPHVnRArb.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 Sony headphones, in my eyes at least, look better. They're a simpler affair, with a more pleasingly minimal design. Build is similar between both, with lightweight construction that can make them feel cheap.</p><p>They've held up well with months of wear and tear, and the more I use them, the less I'm concerned about the glaring weak point of the WH-1000XM6's folding hinge. The XM5 felt a whole lot more flimsy, so I'm glad these are more confidence-inspiring.</p><p>Both are about as comfortable as the other, although Sony's headband starts to dig in a little after many hours of listening. It does take <em>many </em>hours, though — like, tens. I felt it after wearing them nonstop during a particularly long work day. </p><p>For a pair of headphones that people are going to see me wearing, the XM6 have my vote.</p><h2 id="a-matter-of-noise-canceling">A matter of noise canceling</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-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="T6iqZJfBZfWdj8ovUg2erb" name="Sony WH-1000XM6" alt="Sony WH-1000XM6" src="https://cdn.mos.cms.futurecdn.net/T6iqZJfBZfWdj8ovUg2erb.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>Sony's noise canceling is very good, make no doubt about it. The firm popularized the idea with the X mark series, and the XM6 follow a very solid legacy indeed. They do a great job at blocking just about anything you could hope for, with little sound getting through.</p><p>The transparency mode is great for hearing what's going on around you, making it easier to chat to shop clerks and bus drivers without them sounding like a robot. It's good — but it's still not <em>the best.</em></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kqx5zRCDhnfa7o79Z8cru4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/kqx5zRCDhnfa7o79Z8cru4.jpg" mos="" align="middle" fullscreen="" width="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 Bose QuietComfort Ultra Headphones gen 2 <em>are</em> the best. They block out everything, bar none. Play some music, and you're in a world of your own making, filled with your favorite tunes and just about nothing else. If you want the best noise canceling? Buy these, no question. Nothing comes close. Apart from the WH-1000XM6. Which don't come close enough.</p><p>If it were just down to their ability to cancel noise, I'd be using the Bose. But it's not. </p><h2 id="sound-quality-battery-life-and-features">Sound quality, battery life and 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="BjvHbu9p7xWe3936HniTt4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/BjvHbu9p7xWe3936HniTt4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There's only so much that noise canceling and build can make turn you towards a pair of headphones — you've also got to actually live with them. And the Sony headphones are just nicer to live with. There's more sound customization with a superior 10-band EQ to Bose's measly 3 bands. </p><p>There are more noise-canceling modes, and the spatial audio, while slightly more restricted, sounds better. There's more battery life, so you don't have to charge them as much. The case and its magnetic flap are a genuine game-changer for daily usability. </p><p>In our review, Tom's Guide's Managing Editor of TVs and AV said the XM6 trades a wide soundstage for better clarity. They may not have the fullest sound, but they are exceptionally clear, especially in the mid-range.  </p><p>The Bose QuietComfort Ultra Headphones gen 2 are good, but not great in terms of sound quality. In my review, I said they're "perfect for some background listening, but not quite as good if you want to sit down and get involved with your music," and I stand by that sentiment. They're fine. Mostly. But, when it comes down to the meat and potatoes of things, the Sony WH-1000XM6 are the better pair of headphones. </p><p>In short, buy the XM6 — if you can afford their hiked prices.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OdB0Qe"></div>                            </div>                            <script src="https://kwizly.com/embed/OdB0Qe.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/entertainment/netflix/skyscraper-live-backlash-heres-why-viewers-have-labeled-netflixs-live-event-a-total-joke">‘Skyscraper Live’ backlash — here’s why viewers have labeled Netflix’s live event a ‘total joke’</a></li><li><a href="https://www.tomsguide.com/ai/the-glitch-prompt-instantly-makes-chatgpt-smarter-i-use-it-every-day">The ‘glitch’ prompt instantly makes ChatGPT smarter — I use it every day</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-february-2026">Everything new on Apple TV in February 2026</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 Bose headphone and earbuds settings you need to change right now for better sound and more features ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/over-ear-headphones/5-bose-headphone-and-earbuds-settings-you-need-to-change-right-now-for-better-sound-and-more-features</link>
                                                                            <description>
                            <![CDATA[ Unlock the full potential of your Bose headphones to make them sound (and work) better. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">fh5VJgBuPjJSjPCnGcwQzL</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MrMZCAm5VaGopn5CKLU9v4-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 16 Jan 2026 11:22:44 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Over-Ear Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Headphones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/MrMZCAm5VaGopn5CKLU9v4-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose QuietComfort Ultra Gen 2]]></media:description>                                                            <media:text><![CDATA[Bose QuietComfort Ultra Gen 2]]></media:text>
                                <media:title type="plain"><![CDATA[Bose QuietComfort Ultra Gen 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MrMZCAm5VaGopn5CKLU9v4-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Straight out of the box, Bose headphones are great. Their ANC ranks amongst the very <a href="https://www.tomsguide.com/us/best-noise-cancelling-headphones,review-5566.html">best noise canceling headphones</a> available, blocking out more sound than just about anything else. But they can get even better thanks to some slight tweaks in their settings menu.</p><p>We can improve their sound quality with a quick dip into a sub-menu, extend their sound stage with an extra feature and even improve their useability. There's only one thing that you need (well, two, including the headphones): The Bose app. It's available <a href="https://play.google.com/store/apps/details/Bose_Music?id=com.bose.bosemusic&hl=en_IE" target="_blank">for Android</a> and <a href="https://apps.apple.com/us/app/bose/id1364986984" target="_blank">iOS</a>, so you have no excuse.</p><h2 id="1-improve-the-sound-quality">1. Improve the sound 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:2053px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="tTh5TCMhMAc9UeyD8848nV" name="Bose QC Headphones-13.jpg" alt="Testing call quality on the Bose QuietComfort Headphones" src="https://cdn.mos.cms.futurecdn.net/tTh5TCMhMAc9UeyD8848nV.jpg" mos="" align="middle" fullscreen="" width="2053" height="1155" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Bose headphones sound good. They've got plenty of detail and a powerful low end. But they can sound even better. With a just a quick trip to the EQ section in the Bose app, we can dial in the Quietcomfort lines sound to something even more sonically pleasing.</p><p>They all suffer from the same problem — over reliance on the low end. Well, lets take some of that crutch away from them by dialling down the bass slider a couple of notches. I like to leave it around -2. We leave the mids alone, and then we turn our attention to the highs. I like to bring it up around +2, to bring some extra dimension to the sound.</p><p>You'd be surprised how much of a difference it makes. It's one of the first things I do to Bose headphones when they arrive on my desk, once I've had a try with the out-of-box sound.</p><h2 id="2-add-a-multipoint-device">2. Add a multipoint device</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NZSaQVTjyyQAUhvWeRw8u4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/NZSaQVTjyyQAUhvWeRw8u4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you've ever become irritated endlessly connecting and reconnecting your headphones to different devices, then the multiconnect built into certain Bose models is going to be a lifesaver. Pause your media on your phone, and then instantly connect to your laptop for a work call.</p><p>To initialize the system, head to the "multipoint" tab in the app. From there, initiate a connection and find the headphones in the Bluetooth menu of the second source device. Et voilà — done!</p><p>You can only connect to two or three things at once, mind you. This works with most Bose headphones and earbuds. Check the Bose app how many devices your headphones support.</p><h2 id="3-change-the-shortcut">3. Change the shortcut</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vPkNbWYWPGMsPLVmRQbSu4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/vPkNbWYWPGMsPLVmRQbSu4.jpg" mos="" align="middle" fullscreen="" width="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>This feature is only compatible with the <a href="https://www.tomsguide.com/audio/ive-used-the-bose-quietcomfort-ultra-headphones-for-6-months-heres-what-i-like-and-dont-like">QuietComfort Ultra Headphones</a> line. Using the touch-sensitive panel on the right earcup, you can activate various features in your headphones. Press and hold to activate.</p><p>Find the Shortcut menu in the Bose app, and then choose one of four different options. You can hear the battery level, change the Immersive Audio mode, Access your voice assistant, or start a Spotify listening session.</p><p>Or, you can turn it off completely.</p><h2 id="4-create-some-modes">4. Create some modes</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2UnitkoVDmAGyPdJs4yo3R" name="Bose QuietComfort Ultra Earbuds 2" alt="Bose QuietComfort Ultra Earbuds 2" src="https://cdn.mos.cms.futurecdn.net/2UnitkoVDmAGyPdJs4yo3R.jpg" mos="" align="middle" fullscreen="" width="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>This feature is unique to the QuietComfort Ultra line of headphones and earbuds. Changing both the ANC and the Immersive Audio settings of your headphones separately can be annoying, so Bose has allowed you to make different "modes" that change both simultaneously.</p><p>Perhaps you want max ANC when you're out and about, but the static Immersive Audio mode so that it doesn't sound strange when you're walking around. You can make a mode that instantly sets both to your desired settings. Perhaps you want slightly less ANC and head-tracked spatial audio. You can make a mode that does that too.</p><p>Head to the modes tab of the Bose app, and press the "+" button. From there, you can add and change modes.</p><h2 id="5-change-how-much-of-yourself-you-can-hear-on-a-call">5. Change how much of yourself you can hear on a call</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3768px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="W6yeJmxK6L9sCbtBeYh5df" name="IMG_7288.jpg" alt="Bose QuietComfort Ultra Headphones" src="https://cdn.mos.cms.futurecdn.net/W6yeJmxK6L9sCbtBeYh5df.jpg" mos="" align="middle" fullscreen="" width="3768" height="2119" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>When you take a call with your Bose headphones, there's a certain amount of your voice that the headphones feed you so that it doesn't sound unnatural. To some people it's either too much or not enough, so you'll want to change the level.</p><p>Head to the Bose app, and select the little settings wheel in the top right hand corner of the screen. Scroll down until you see the "Self Voice" setting. From here, choose your preferred level, and back out of the menu.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WQAjnW"></div>                            </div>                            <script src="https://kwizly.com/embed/WQAjnW.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/airpods/your-airpods-have-a-hidden-camera-feature-heres-how-to-use-it">I had no idea my AirPods could do this — and it's perfect for group photos</a></li><li><a href="https://www.tomsguide.com/audio/soundbars/change-these-sonos-soundbar-settings-immediately-to-get-the-best-performance-out-of-your-tv-and-movie-watching">Change these Sonos soundbar settings immediately to get the best performance out of your TV and movie watching</a></li><li><a href="https://www.tomsguide.com/audio/headphones/hundreds-of-millions-of-earbuds-headphones-and-speakers-vulnerable-to-tracking-and-eavesdropping-what-to-do-right-now">'Hundreds of millions' of Bluetooth earbuds, headphones, and speakers vulnerable to tracking and eavesdropping — what to do right now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I'm an audio editor — here are the headphones, earbuds and speakers that I actually use ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/headphones/im-an-audio-editor-here-are-the-headphones-earbuds-and-speakers-that-i-actually-use</link>
                                                                            <description>
                            <![CDATA[ Out of the dozens of headphones, earbuds and speakers each year, these are the ones that I keep using. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Vnb54H5baBHL5hSpno6vNF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DmU5wxnSaaqUgcr3BYGfAn-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 13 Jan 2026 06:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/DmU5wxnSaaqUgcr3BYGfAn-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[My audio gear]]></media:description>                                                            <media:text><![CDATA[My audio gear]]></media:text>
                                <media:title type="plain"><![CDATA[My audio gear]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DmU5wxnSaaqUgcr3BYGfAn-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I'm very lucky in my line of work. I get to try out all kinds of different audio gear, from gorgeous wireless headphones that cost more than I could ever hope to afford to cheap earbuds that everyone can put in their pockets. </p><p>And yet, I have a life outside of work. When I'm not helping readers figure out how to get the best audio gear for their budgets, I'm chilling at home, listening to music and watching movies... or I'm gaming.  That's when I break into my home stash of audio gear. </p><p>So which of the <a href="https://www.tomsguide.com/us/best-headphones,review-1988.html">best headphones</a> accompany me on long trips, and which speakers power my HiFi? Well, here they are: my actual audio devices. I'm not sure any will surprise you, but I love every single one for different reasons.</p><h2 id="my-wireless-headphones-bowers-wilkins-px8-s2">My wireless headphones: Bowers & Wilkins PX8 S2</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8FQdgwTghY24Fbpdoh9gPf" name="Bowers & Wilkins PX8 S2" alt="Bowers & Wilkins PX8 S2" src="https://cdn.mos.cms.futurecdn.net/8FQdgwTghY24Fbpdoh9gPf.jpg" mos="" align="middle" fullscreen="" width="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>Last year, the <a href="https://www.tomsguide.com/audio/bowers-and-wilkins-px7-s3-review">Bowers & Wilkins PX7 S3</a> became my pick for the best headphones you can buy in 2026, and then my heart was captured by the more expensive <a href="https://www.tomsguide.com/audio/over-ear-headphones/i-just-tested-these-impeccable-hi-res-headphones-and-they-blow-away-the-airpods-max">PX8 S2</a>. (Get them on your head and you'll very quickly discover why; they're a wonderful piece of on-ear wireless goodness.)</p><p>They're super comfortable thanks to their leather-covered cushioning and well-judged clamping force. They're stunningly well built with metal armatures and earcups. The protective case ensures they stay shiny and premium, no matter how many times you toss them in your bag.</p><p>And then there's the way that they sound. They're warm, enveloping, and lovely, and then stretch the soundstage further than most with a similar sonic signature. Picked guitars shimmer, bass notes rumble and cymbals ring with crystalline energy. They're some of the best-sounding wireless headphones that money can buy — and I love them. They're sure to be my wireless companions for some time.</p><div class="product"><a data-dimension112="59a7739e-4ce5-487c-8326-8ddc78b832b8" data-action="Deal Block" data-label="The PX8 S2 are undoubtedly expensive, but you get more than what you pay for. They're very comfortable, feature AptX adaptive for better sound quality with compatible devices, and some of the best sound around. I love my pair, and I think anyone else who picks up a pair will too." data-dimension48="The PX8 S2 are undoubtedly expensive, but you get more than what you pay for. They're very comfortable, feature AptX adaptive for better sound quality with compatible devices, and some of the best sound around. I love my pair, and I think anyone else who picks up a pair will too." data-dimension25="$799" href="https://www.amazon.com/dp/B0FH5QDTBQ/" 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:120.00%;"><img id="o8sH4w7bcbuUXtPwckc9yn" name="Bowers & Wilkins Px8 S2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/o8sH4w7bcbuUXtPwckc9yn.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The PX8 S2 are undoubtedly expensive, but you get more than what you pay for. They're very comfortable, feature AptX adaptive for better sound quality with compatible devices, and some of the best sound around. I love my pair, and I think anyone else who picks up a pair will too.<a class="view-deal button" href="https://www.amazon.com/dp/B0FH5QDTBQ/" target="_blank" rel="nofollow" data-dimension112="59a7739e-4ce5-487c-8326-8ddc78b832b8" data-action="Deal Block" data-label="The PX8 S2 are undoubtedly expensive, but you get more than what you pay for. They're very comfortable, feature AptX adaptive for better sound quality with compatible devices, and some of the best sound around. I love my pair, and I think anyone else who picks up a pair will too." data-dimension48="The PX8 S2 are undoubtedly expensive, but you get more than what you pay for. They're very comfortable, feature AptX adaptive for better sound quality with compatible devices, and some of the best sound around. I love my pair, and I think anyone else who picks up a pair will too." data-dimension25="$799">View Deal</a></p></div><h2 id="my-wireless-earbuds-bose-quietcomfort-ultra-earbuds-gen-2">My wireless earbuds: Bose QuietComfort Ultra Earbuds Gen 2</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2UnitkoVDmAGyPdJs4yo3R" name="Bose QuietComfort Ultra Earbuds 2" alt="Bose QuietComfort Ultra Earbuds 2" src="https://cdn.mos.cms.futurecdn.net/2UnitkoVDmAGyPdJs4yo3R.jpg" mos="" align="middle" fullscreen="" width="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 like to meditate. It's my time to mull over the world and everything around me, finding new connections with the ground that I sit on; listen to the birds I can hear calling, the wind that brushes through my hair. At times, though, I want no distractions while I think over important decisions or other things that life throws at me.</p><p>The <a href="https://www.tomsguide.com/audio/earbuds/bose-quietcomfort-ultra-earbuds-2-review">QuietComfort Ultra Earbuds Gen 2</a> are my faithful "mulling over" headphones. They block everything out, acting almost like earplugs when not listening to music. Sometimes I'll play nature sounds around me, sometimes I'll leave the sound off. Whatever I choose, they're blocking the noise.</p><p>I've been able to wear them for hours and hours on end. It's not just their epic noise canceling that keeps them close at hand, but their impressive comfort as well. They might not play much music, but they're a vital part of my audio arsenal.</p><div class="product"><a data-dimension112="54724389-414b-4d43-b996-a840e3799a5b" data-action="Deal Block" data-label="They might not sound as good as other options, but when I want to block all the noise, there's really nothing better. The battery life is good and they're comfortable to boot — what more could you want? Oh, wireless charging; well, they've got that too." data-dimension48="They might not sound as good as other options, but when I want to block all the noise, there's really nothing better. The battery life is good and they're comfortable to boot — what more could you want? Oh, wireless charging; well, they've got that too." data-dimension25="$249" href="https://www.amazon.com/dp/B0F7M3HPBD/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1488px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="YH3dSXEfyLjZutaYJnnCFR" name="QuietComfort Ultra Earbuds gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YH3dSXEfyLjZutaYJnnCFR.png" mos="" align="middle" fullscreen="" width="1488" height="1488" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>They might not sound as good as other options, but when I want to block <em>all </em>the noise, there's really nothing better. The battery life is good and they're comfortable to boot — what more could you want? Oh, wireless charging; well, they've got that too.<a class="view-deal button" href="https://www.amazon.com/dp/B0F7M3HPBD/" target="_blank" rel="nofollow" data-dimension112="54724389-414b-4d43-b996-a840e3799a5b" data-action="Deal Block" data-label="They might not sound as good as other options, but when I want to block all the noise, there's really nothing better. The battery life is good and they're comfortable to boot — what more could you want? Oh, wireless charging; well, they've got that too." data-dimension48="They might not sound as good as other options, but when I want to block all the noise, there's really nothing better. The battery life is good and they're comfortable to boot — what more could you want? Oh, wireless charging; well, they've got that too." data-dimension25="$249">View Deal</a></p></div><h2 id="my-wired-headphones-various">My wired headphones: Various</h2><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="XJGs2HWRKULfoRWPaGYtBM" name="Sendy Audio Aiva 2" alt="Sendy Audio Aiva 2" src="https://cdn.mos.cms.futurecdn.net/XJGs2HWRKULfoRWPaGYtBM.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 is where things become a little trickier. See, I have managed to cultivate an impressive collection of wired headphones as a hobby, not just thanks to work, but my own wallet. I like to have different headphones for different genres, or I might want to listen to the sound profile of one pair over another on a particular day.</p><p>I can say that there have become some mainstays in recent months. I remain extremely impressed with the Sendy Audio Aiva 2. They look stunning, and sound excellent. I've also been using my Sennheiser HD800S a lot recently, in part due to their unbelievable detail. </p><p>I don't have a pair of favorite headphones, but at the moment, the pair I'd recommend are the Aiva 2. They're not cheap, but they're a welcoming pair of cans in a sea of inpenetrable nerdiness.</p><div class="product"><a data-dimension112="6e926b0a-01e6-42c8-aad3-66501beac415" data-action="Deal Block" data-label="The Aiva 2 aren't cheap, but they sound stunning. They're incredibly clear and revealing, letting you pick out elements of your music you've never heard before. They've earned a permanent place on my desk." data-dimension48="The Aiva 2 aren't cheap, but they sound stunning. They're incredibly clear and revealing, letting you pick out elements of your music you've never heard before. They've earned a permanent place on my desk." data-dimension25="$599" href="https://www.amazon.com/dp/B0F1FQZR24/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:640px;"><p class="vanilla-image-block" style="padding-top:157.97%;"><img id="iGHbdsag9yxMaQgTC8P7UJ" name="Sendy Audio Aiva 2.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/iGHbdsag9yxMaQgTC8P7UJ.jpg" mos="" align="middle" fullscreen="" width="640" height="1011" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Aiva 2 aren't cheap, but they sound stunning. They're incredibly clear and revealing, letting you pick out elements of your music you've never heard before. They've earned a permanent place on my desk.<a class="view-deal button" href="https://www.amazon.com/dp/B0F1FQZR24/" target="_blank" rel="nofollow" data-dimension112="6e926b0a-01e6-42c8-aad3-66501beac415" data-action="Deal Block" data-label="The Aiva 2 aren't cheap, but they sound stunning. They're incredibly clear and revealing, letting you pick out elements of your music you've never heard before. They've earned a permanent place on my desk." data-dimension48="The Aiva 2 aren't cheap, but they sound stunning. They're incredibly clear and revealing, letting you pick out elements of your music you've never heard before. They've earned a permanent place on my desk." data-dimension25="$599">View Deal</a></p></div><h2 id="my-soundbar-sonos-arc-ultra-surround-setup">My Soundbar: Sonos Arc Ultra surround setup</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DSrDWQZRHNMcoHdNE5HMZn" name="" alt="Sonos Arc Ultra under a TV" src="https://cdn.mos.cms.futurecdn.net/DSrDWQZRHNMcoHdNE5HMZn.jpg" mos="" align="middle" fullscreen="" width="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/audio/soundbars/sonos-arc-ultra-review">Sonos Arc Ultra</a> has graced my TV stand since it was first released, and for very good reason. It sounds excellent, and powers a very impressive Atmos experience before you've even considered adding in some surround speakers or a subwoofer. And then you do, and suddenly you wonder where it's been your whole life.</p><p>Sounds that whizz past your head with surprising accuracy, stirring movie soundtracks that fill your room, explosions that shake the windows. The Sonos surround experience is something I've become accustomed to now, and I don't think I could pull myself away from it for any other soundbar system.</p><p>That, and it was really easy to get past my parents — they weren't particularly enthused by the idea of a seperates system taking up loads of space. Oh well. One day.</p><div class="product"><a data-dimension112="35a8b674-7e59-48f2-8cd7-a9d62036ecef" data-action="Deal Block" data-label="The Sonos Arc Ultra and accompanying surround speakers are extremely expensive, but they're well worth it. I love the Dolby Atmos sound that gets pumped out of the other side, and I'm a particular fan of the dialog clarity. Setting it up is a massive pain, though." data-dimension48="The Sonos Arc Ultra and accompanying surround speakers are extremely expensive, but they're well worth it. I love the Dolby Atmos sound that gets pumped out of the other side, and I'm a particular fan of the dialog clarity. Setting it up is a massive pain, though." data-dimension25="$2806" href="https://www.sonos.com/en-us/shop/ultimate-immersive-set-arc-ultra-sub-era-300-pair-black" 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:100.00%;"><img id="hYdZgToXv9D2CwJeMJk9yG" name="Arc Ultra Immersive set" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hYdZgToXv9D2CwJeMJk9yG.png" mos="" align="middle" fullscreen="" width="1920" height="1920" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Sonos Arc Ultra and accompanying surround speakers are extremely expensive, but they're well worth it. I love the Dolby Atmos sound that gets pumped out of the other side, and I'm a particular fan of the dialog clarity. Setting it up is a <em>massive </em>pain, though.<a class="view-deal button" href="https://www.sonos.com/en-us/shop/ultimate-immersive-set-arc-ultra-sub-era-300-pair-black" target="_blank" rel="nofollow" data-dimension112="35a8b674-7e59-48f2-8cd7-a9d62036ecef" data-action="Deal Block" data-label="The Sonos Arc Ultra and accompanying surround speakers are extremely expensive, but they're well worth it. I love the Dolby Atmos sound that gets pumped out of the other side, and I'm a particular fan of the dialog clarity. Setting it up is a massive pain, though." data-dimension48="The Sonos Arc Ultra and accompanying surround speakers are extremely expensive, but they're well worth it. I love the Dolby Atmos sound that gets pumped out of the other side, and I'm a particular fan of the dialog clarity. Setting it up is a massive pain, though." data-dimension25="$2806">View Deal</a></p></div><h2 id="my-smart-speaker-wiim-sound">My smart speaker: Wiim Sound</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jAvu6mgnkhS857fTATNvRb" name="Wiim Sound" alt="Wiim Sound" src="https://cdn.mos.cms.futurecdn.net/jAvu6mgnkhS857fTATNvRb.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 is a recent addition to my every day tech list. The Wiim Sound is a speaker that had me waiting for a long time before I was able to place it on my nightstand. Now that it's here, I can't see it going anywhere quickly. I love it and its funky little screen that shows spinning album artwork, and I really like the excellent Wiim Home app that outperforms the competition in just about any metric (Sonos, ahem).</p><p>It also sounds great, with loads of detail and a surprisingly large soundstage for something so small. I've been listening to all my favorite music as I get ready in the morning and as I do some reading before I go to bed.</p><p>It might just rank amongst the best smart speakers, although I do wish it had a built-in microphone as opposed to one built into the remote control. Still, it's a great speaker and I love having it next to my bed.</p><div class="product"><a data-dimension112="0fb817a9-6818-49a6-9049-0943196b85aa" data-action="Deal Block" data-label="The Wiim Sound has one thing that no other smart speaker like it has: a tiny little screen for now playing and clock duties. It also happens to sound really good, with loads of detail and great expansive soundstage." data-dimension48="The Wiim Sound has one thing that no other smart speaker like it has: a tiny little screen for now playing and clock duties. It also happens to sound really good, with loads of detail and great expansive soundstage." data-dimension25="$299" href="https://www.amazon.com/dp/B0FPCQM66H/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1354px;"><p class="vanilla-image-block" style="padding-top:107.31%;"><img id="E7w8UaH6aS6veT4PBhJWdK" name="Sound" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/E7w8UaH6aS6veT4PBhJWdK.png" mos="" align="middle" fullscreen="" width="1354" height="1453" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Wiim Sound has one thing that no other smart speaker like it has: a tiny little screen for now playing and clock duties. It also happens to sound really good, with loads of detail and great expansive soundstage. <a class="view-deal button" href="https://www.amazon.com/dp/B0FPCQM66H/" target="_blank" rel="nofollow" data-dimension112="0fb817a9-6818-49a6-9049-0943196b85aa" data-action="Deal Block" data-label="The Wiim Sound has one thing that no other smart speaker like it has: a tiny little screen for now playing and clock duties. It also happens to sound really good, with loads of detail and great expansive soundstage." data-dimension48="The Wiim Sound has one thing that no other smart speaker like it has: a tiny little screen for now playing and clock duties. It also happens to sound really good, with loads of detail and great expansive soundstage." data-dimension25="$299">View Deal</a></p></div><h2 id="the-state-of-the-hifi">The state of the HiFi</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.13%;"><img id="fMfYWtLBmP8HbZpuXiqcx4" name="Cambridge Audio EXA100" alt="Cambridge Audio EXA100" src="https://cdn.mos.cms.futurecdn.net/fMfYWtLBmP8HbZpuXiqcx4.jpg" mos="" align="middle" fullscreen="" width="6000" height="3368" attribution="" endorsement="" class="inline"></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 HiFi system is my pride and joy. The thing in life that keeps me going, playing my music and powering my TV room like nothing else ever could. It's <em>not </em>cheap, I should say, but I don't care. I love it.</p><p>But it's not finished yet. HiFi systems never are. You want to get every ounce of performance out of the whole ensemble, and then when you do, you wonder what's possible with something even more expensive. My current system is as follows:</p><ul><li>Cambridge Audio EXA100</li><li>KEF LS50 Meta</li><li>Qacoustics QSub80</li><li>Rega Planar 3 RS</li><li>iFi Zen Phono 3</li><li>Wiim Ultra streamer</li><li>Cambridge Audio AX35 CD player</li></ul><p>That's a whole stack of devices, and that's not to mention the mad number of cables that connect the whole thing together, or the special power sockets that make sure the power is clean. Is it a bunch of audiophile hogwash that likely makes little difference in the end?</p><p>Almost certainly. But then I turn it on, place a Bloodbath record on my turntable, and settle in for a listening session, and suddenly nothing matters anymore.</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/your-old-ipad-is-more-useful-than-you-think-5-ways-to-give-it-new-life">Your old iPad is more useful than you think — 5 ways to give it new life</a></li><li><a href="https://www.tomsguide.com/wellness/sleep/why-do-i-keep-waking-up-at-3am">For months I've been waking up at 3am, unable to fall back asleep — two doctors have finally explained why and how to stop it</a></li><li><a href="https://www.tomsguide.com/phones/iphones/i-discovered-this-hidden-camera-mode-on-my-iphone-and-its-a-game-changer-for-night-photography">I discovered this hidden camera mode on my iPhone — and it's a game-changer for night photography</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested these 5 great last-minute audio gift ideas to take the stress out of choosing ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/i-tested-these-5-great-last-minute-audio-gift-ideas-to-take-the-stress-out-of-choosing</link>
                                                                            <description>
                            <![CDATA[ What do you get your music-obsessed family for Christmas? One of these excellent devices, all tested by yours truly. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gySRvyQoK7CArkqjJNQu25</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/SaeHxC3byCZr7GY422wEvA-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 20 Dec 2025 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/SaeHxC3byCZr7GY422wEvA-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[audio holiday gift ideas]]></media:description>                                                            <media:text><![CDATA[audio holiday gift ideas]]></media:text>
                                <media:title type="plain"><![CDATA[audio holiday gift ideas]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/SaeHxC3byCZr7GY422wEvA-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Gift giving is <em>fun. </em>It's also really tricky — what do you get for who? I can't help you with your fashion-conscious sibling (I exclusively wear black band t-shirts), and I definitely wouldn't have any clue what your mom would want, but I <em>can</em> help you with your audio-obsessed nearest and dearest.</p><p>I test loads of cool devices over the course of the year, and some of them make excellent gifts. Here are five of my favorites, all of them at reasonable prices. I know if I was to find any of these under the tree, I'd be happy!</p><h3 class="article-body__section" id="section-ifi-go-link-max"><span>iFi Go Link Max</span></h3><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/hb4AEf2NPks9BvfngR2f9i.jpg" alt="iFi Go Link Max" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/jGv5mT3rTitcwMYCnxGDAi.jpg" alt="iFi Go Link Max" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/whVwAFVtP4QFQ6HwAaNabF.jpg" alt="iFi Go Link Max" /><figcaption><small role="credit">iFi</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/qw576MRZPrdwQAfNRsjd9i.jpg" alt="iFi Go Link Max" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><p>It's a dongle that you can use to plug your headphones into your phone! But it's <em>more. </em>Inside that larger end, some very clever bits of audio wizardry do a better job of translating high-quality audio tracks than your phone's internals, for, you guessed it, much better sound.</p><p>I won't go into too much detail, but it's called a "dongle DAC," and they're a great way of getting increased audio fidelity to a pair of wired headphones without breaking the bank on a completely new device. This one only costs about 80 bucks, for example.</p><p><a href="https://www.tomsguide.com/audio/i-dont-think-i-could-live-without-this-usb-c-dongle-that-gives-my-phone-a-headphone-jack-heres-how-it-makes-my-music-sound-amazing">I love the iFi Go Link Max</a>. It's my preferred way to take wired headphones on the go, and it does a fabulous job of making my music sound excellent over my favorite wired cans. The perfect Christmas gift for the music fan in your life.</p><div class="product"><a data-dimension112="15fb3aaf-bf1f-481f-a3a7-9ab31eb99e01" data-action="Deal Block" data-label="This little USB-C dongle (don't worry, there's a Lightning adapter in the box) takes the tunes from your streaming service of choice and makes them sound epic. That's it. That's the sales pitch. Oh! And there's a balanced connector for some truly great sound for compatible headphones." data-dimension48="This little USB-C dongle (don't worry, there's a Lightning adapter in the box) takes the tunes from your streaming service of choice and makes them sound epic. That's it. That's the sales pitch. Oh! And there's a balanced connector for some truly great sound for compatible headphones." data-dimension25="$69" href="https://www.amazon.com/iFi-Audio-Go-Link-Max/dp/B0DM9M155S/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1051px;"><p class="vanilla-image-block" style="padding-top:99.05%;"><img id="4LJHLAH3X2FXMTQ95pBwWg" name="iFi Go Link Max.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4LJHLAH3X2FXMTQ95pBwWg.jpg" mos="" align="middle" fullscreen="" width="1051" height="1041" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This little USB-C dongle (don't worry, there's a Lightning adapter in the box) takes the tunes from your streaming service of choice and makes them sound epic. That's it. That's the sales pitch. Oh! And there's a balanced connector for some truly great sound for compatible headphones.<a class="view-deal button" href="https://www.amazon.com/iFi-Audio-Go-Link-Max/dp/B0DM9M155S/" target="_blank" rel="nofollow" data-dimension112="15fb3aaf-bf1f-481f-a3a7-9ab31eb99e01" data-action="Deal Block" data-label="This little USB-C dongle (don't worry, there's a Lightning adapter in the box) takes the tunes from your streaming service of choice and makes them sound epic. That's it. That's the sales pitch. Oh! And there's a balanced connector for some truly great sound for compatible headphones." data-dimension48="This little USB-C dongle (don't worry, there's a Lightning adapter in the box) takes the tunes from your streaming service of choice and makes them sound epic. That's it. That's the sales pitch. Oh! And there's a balanced connector for some truly great sound for compatible headphones." data-dimension25="$69">View Deal</a></p></div><h3 class="article-body__section" id="section-pro-ject-record-puck-e"><span>Pro-Ject Record Puck E</span></h3><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/LJ8pTmvnpu8rTtSkqxuYqY.jpg" alt="Pro-ject record Puck E" /><figcaption><small role="credit">Pro-ject</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/iQ63R3GWD3Pe2qEXDTUvpY.jpg" alt="Pro-ject record Puck E" /><figcaption><small role="credit">Pro-ject</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/mPf8tAhuz4mHnDkYcmYZqY.jpg" alt="Pro-ject record Puck E" /><figcaption><small role="credit">Pro-ject</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/deeNnDCzSQbkifxya24MpY.jpg" alt="Pro-ject record Puck E" /><figcaption><small role="credit">Pro-ject</small></figcaption></figure></figure><p>I can hear you from here: "What on earth is a record puck, and why would my record fanatic family member need one?" It's one of the greatest record accessories ever developed, that's what it is — and I don't think I could live without mine.</p><p>Records can be a pain. They have a habit of getting warped and even moving about during playback. Both ruin the experience, making your music sound straight-up bad. That's where a record puck steps in. It flattens lightly warped records and stops vinyl from moving about on the platter while spinning. </p><p>The Record Puck E is a great option, and doesn't cost very much. It's a lump of metal with a hole for the spindle to sit in and a soft surface so that the bottom doesn't ruin your record labels. A great gift for a vinyl listener — or a festive treat for yourself.</p><div class="product"><a data-dimension112="0b4fc448-f4f1-45ff-ab87-dba798217bc8" data-action="Deal Block" data-label="It's a big weight that sits on top of your records when playing to even them out and avoid slippage on the mat. It works very well — and looks pretty cool as it does it." data-dimension48="It's a big weight that sits on top of your records when playing to even them out and avoid slippage on the mat. It works very well — and looks pretty cool as it does it." data-dimension25="$49" href="https://www.amazon.com/dp/B09NM8HL3Z/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1107px;"><p class="vanilla-image-block" style="padding-top:91.24%;"><img id="A8AtWWBYLmkFqVQPY7rAtc" name="Pro-ject record Puck E" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/A8AtWWBYLmkFqVQPY7rAtc.png" mos="" align="middle" fullscreen="" width="1107" height="1010" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>It's a big weight that sits on top of your records when playing to even them out and avoid slippage on the mat. It works very well — and looks pretty cool as it does it.<a class="view-deal button" href="https://www.amazon.com/dp/B09NM8HL3Z/" target="_blank" rel="nofollow" data-dimension112="0b4fc448-f4f1-45ff-ab87-dba798217bc8" data-action="Deal Block" data-label="It's a big weight that sits on top of your records when playing to even them out and avoid slippage on the mat. It works very well — and looks pretty cool as it does it." data-dimension48="It's a big weight that sits on top of your records when playing to even them out and avoid slippage on the mat. It works very well — and looks pretty cool as it does it." data-dimension25="$49">View Deal</a></p></div><h3 class="article-body__section" id="section-fiio-jm21"><span>Fiio JM21</span></h3><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/qXDabuCHUY4mdDqWY7cgMm.jpg" alt="Fiio JM21" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/2K8M6ghsuKNdtaBYz7Fvcm.jpg" alt="Fiio JM21" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Z58U7dvCiPULVPhbAKdCWm.jpg" alt="Fiio JM21" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Dn37zmZtwqP5WMBieei8bm.jpg" alt="Fiio JM21" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><p>A DAP (or Digital Audio Player — audio nerds certainly do love an acronym) is essentially a high-end MP3 player. Remember those? Well, the <a href="https://www.tomsguide.com/audio/i-just-tested-this-usd199-portable-music-player-and-it-blew-me-away-with-audiophile-sound">JM21</a> is of the very best, and it costs less than $200.</p><p>It's a great-sounding device that I had a fantastic time testing earlier this year. There's enough space on board for plenty of high-resolution, uncompressed audio files, and you can even connect it to the internet to stream from one of the <a href="https://www.tomsguide.com/buying-guide/best-music-streaming-services">best music streaming services</a>.</p><p>There are ample headphone connections on top, and its amplifier is powerful enough to make even very thirsty headphones sound great. Perfect for the audio fan who's on the go and wants something separate from their phone to listen to music.</p><div class="product"><a data-dimension112="8d6c3b0c-d36f-437e-bf91-5d601dac981b" data-action="Deal Block" data-label="This little audio player sounds great, looks cool, and makes your music sound great when you connect up the right headphones. It's not too expensive either, so you can grab one for the holidays without breaking the bank." data-dimension48="This little audio player sounds great, looks cool, and makes your music sound great when you connect up the right headphones. It's not too expensive either, so you can grab one for the holidays without breaking the bank." data-dimension25="$179" href="https://www.amazon.com/dp/B0DRYJ9FCG/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:705px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="PDKea473CRUUCCZVTcnrLC" name="Fiio JM21.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PDKea473CRUUCCZVTcnrLC.jpg" mos="" align="middle" fullscreen="" width="705" height="705" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This little audio player sounds great, looks cool, and makes your music sound great when you connect up the right headphones. It's not too expensive either, so you can grab one for the holidays without breaking the bank.<a class="view-deal button" href="https://www.amazon.com/dp/B0DRYJ9FCG/" target="_blank" rel="nofollow" data-dimension112="8d6c3b0c-d36f-437e-bf91-5d601dac981b" data-action="Deal Block" data-label="This little audio player sounds great, looks cool, and makes your music sound great when you connect up the right headphones. It's not too expensive either, so you can grab one for the holidays without breaking the bank." data-dimension48="This little audio player sounds great, looks cool, and makes your music sound great when you connect up the right headphones. It's not too expensive either, so you can grab one for the holidays without breaking the bank." data-dimension25="$179">View Deal</a></p></div><h3 class="article-body__section" id="section-meze-alba"><span>Meze Alba</span></h3><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/8dteA5wamzcsBXZMhaEtNf.jpg" alt="Meze Alba" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/2tBAu6E3fKcmktFaa2XqNf.jpg" alt="Meze Alba" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/q6HYtv6ZzKTDdt3hG5ZbNf.jpg" alt="Meze Alba" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Goqi7J8ihPDXyKNFWfFpNf.jpg" alt="Meze Alba" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><p>If you're still not sure what to buy, then some excellent in-ears are the way to go. The <a href="https://www.tomsguide.com/audio/meze-alba-review-comfortable-great-sounding-wired-in-ear-buds">Meze Alba</a> are some of my favorite wired earbuds that you can grab these days, thanks to a lovely design and some excellent sound quality.</p><p>They're also plug-and-play with most devices. They're easy to drive, so you can hook them up to your phone with the included dongle to listen to your favorite tunes in the best quality possible.</p><p>They're a great gift for the audio-conscious family member you're shopping for — and maybe even something for yourself...</p><div class="product"><a data-dimension112="d753334b-94af-46ac-8e7e-7ecf964a199d" data-action="Deal Block" data-label="The Meze Alba are a comfortable, attractive pair of in-ear buds. They come with an adapter so that you can plug them into your phone, and a leather case so that you can more easily transport them around." data-dimension48="The Meze Alba are a comfortable, attractive pair of in-ear buds. They come with an adapter so that you can plug them into your phone, and a leather case so that you can more easily transport them around." data-dimension25="$159" href="https://www.amazon.com/dp/B0CXPVF7SR/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1507px;"><p class="vanilla-image-block" style="padding-top:99.34%;"><img id="P8UuASkzJhKUAQb8D8FgPZ" name="Meze Alba.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/P8UuASkzJhKUAQb8D8FgPZ.jpg" mos="" align="middle" fullscreen="" width="1507" height="1497" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Meze Alba are a comfortable, attractive pair of in-ear buds. They come with an adapter so that you can plug them into your phone, and a leather case so that you can more easily transport them around.<a class="view-deal button" href="https://www.amazon.com/dp/B0CXPVF7SR/" target="_blank" rel="nofollow" data-dimension112="d753334b-94af-46ac-8e7e-7ecf964a199d" data-action="Deal Block" data-label="The Meze Alba are a comfortable, attractive pair of in-ear buds. They come with an adapter so that you can plug them into your phone, and a leather case so that you can more easily transport them around." data-dimension48="The Meze Alba are a comfortable, attractive pair of in-ear buds. They come with an adapter so that you can plug them into your phone, and a leather case so that you can more easily transport them around." data-dimension25="$159">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/audio/headphones/i-gave-up-my-quietcomfort-ultra-headphones-for-no-headphones-and-after-3-months-ive-never-felt-better">I gave up my QuietComfort Ultra Headphones for no headphones — and after 3 months I've never felt better</a></li><li><a href="https://www.tomsguide.com/ai/this-is-the-no-1-chatgpt-prompt-i-use-to-get-expert-level-advice-heres-how-to-use-it">This is the No. 1 ChatGPT prompt I use to get expert-level advice — here's how to use it</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/avatar-fire-and-ash-review-pushing-technical-boundaries-and-the-limits-of-human-endurance">Avatar: Fire and Ash’ review: A technical marvel that's also a tedious watch</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I gave up my QuietComfort Ultra Headphones for no headphones — and after 3 months I've never felt better  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/headphones/i-gave-up-my-quietcomfort-ultra-headphones-for-no-headphones-and-after-3-months-ive-never-felt-better</link>
                                                                            <description>
                            <![CDATA[ I gave up wearing headphones outside 3 months ago — and I don't think I'll go back. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">MTBJXfhF4MxsX2DKEzcaqN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/kqx5zRCDhnfa7o79Z8cru4-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 19 Dec 2025 10:00:55 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Headphones]]></category>
                                                    <category><![CDATA[Over-Ear Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/kqx5zRCDhnfa7o79Z8cru4-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose QuietComfort Ultra Gen 2]]></media:description>                                                            <media:text><![CDATA[Bose QuietComfort Ultra Gen 2]]></media:text>
                                <media:title type="plain"><![CDATA[Bose QuietComfort Ultra Gen 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/kqx5zRCDhnfa7o79Z8cru4-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It was about 3 months ago that I first left my <a href="https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review">Bose QuietComfort Ultra Headphones</a> in my rucksack during a trip in London. Since then, <a href="https://www.tomsguide.com/audio/over-ear-headphones/i-ditched-my-quietcomfort-ultra-headphones-and-went-anc-free-and-ive-never-felt-safer">I've not used a pair of ANC headphones at all while walking around outside</a>, so that I can feel safer and more aware of my surroundings.</p><p>But there's been more to it, in the long run. It's opened me up to the wider world, the people that live alongside me, and the sounds of everyday life that I had missed for so, so many years.</p><p>Am I a better, more rounded person because of it? Perhaps not. But I now have a deeper understanding of my environment and how being more aware of it can make even life's noisier moments more engaging and enjoyable.</p><h3 class="article-body__section" id="section-i-am-safer"><span>I am safer</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vPkNbWYWPGMsPLVmRQbSu4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/vPkNbWYWPGMsPLVmRQbSu4.jpg" mos="" align="middle" fullscreen="" width="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 primary reasons I stopped wearing my ANC headphones while out and about was so that I could feel safer while walking around cities and other busy environments. </p><p>I immediately found that I was much safer while crossing the street, and I could more easily guess what the people around me were going to do. People no longer "appeared out of nowhere," and I noticed more in my peripheral vision as I was able to focus more on my surroundings and not my music.</p><p>I can hear cars better as they approach crosswalks and other pedestrian crossings. I can tell if a car is going to stop for me instead of guessing, based on the sound that its engine is making. I'm no longer taken by surprise by quiet electric cars as they stealthily approach.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NZSaQVTjyyQAUhvWeRw8u4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/NZSaQVTjyyQAUhvWeRw8u4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I've heard people trying to get my attention as well. I dropped my wallet at a train station the other day, and I would never have heard the kind lady trying to get my attention with ANC headphones on. Neither would I have been able to help her find the platform that she needed for her speedy connection.</p><p>Without ANC, my vision feels more rounded, and my awareness has increased. It's also shown me just how blind we can be when locked into musical cocoons of our own making — the number of people I've seen buried into their headphones step out in front of cars is <em>mind-boggling.</em></p><h3 class="article-body__section" id="section-i-m-more-confident"><span>I'm more confident</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vPkNbWYWPGMsPLVmRQbSu4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/vPkNbWYWPGMsPLVmRQbSu4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When I wore my ANC headphones to keep out the outside world, I was hesitant in pretty much everything I did. I would hold myself back from getting involved with things on the street, and I hated talking with shop staff.</p><div><blockquote><p>I no longer live permanently cemented in my own personal bubble. I am more approachable by people who need help, and I'm able to be more actively engaged in what's going on. </p></blockquote></div><p>I think now it's because I had become so used to being in my own world that I didn't enjoy having to let other people into it, even for a moment. While I shared a physical space with these people, I was living in my head — somewhere I like to keep for myself.</p><p>Taking off my headphones — and I mean taking them off, not just activating transparency mode — allowed me to become not just a physical part of the world, but an engaged participant within it. Suddenly I had to take stock of the people around me, and how I might have to interact with them.</p><p>Sure, sometimes it's annoying. The people that hand out pamphlets on street corners, noisy sports fans. </p><p>But it makes it much easier for me to handle sudden social interactions. I can make more decisive decisions when I'm grabbing coffee at a cafe, and I don't stutter when ordering a sandwich. I have brief chats with the people making my lunch.</p><p>I no longer live permanently cemented in my own personal bubble. I can take a more active role in what's going on around me. I am more approachable by people who need help, and I'm able to be more actively engaged in what's going on. </p><h3 class="article-body__section" id="section-i-made-a-new-friend"><span>I made a new friend</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BjvHbu9p7xWe3936HniTt4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/BjvHbu9p7xWe3936HniTt4.jpg" mos="" align="middle" fullscreen="" width="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 like to go to gigs. I go on my own sometimes, so that I can really get involved in the music. Previously, while walking to the gig and in the queue to go in, I'd wear ANC headphones so that I can immerse myself in the music before I get sweaty and half deaf.</p><p>But, as you might have guessed, when I ditched ANC while out and about, I had to ditch it when going to gigs. Now I had to interact with the people around me — turns out, the people you go to gigs with actually share a lot in common with you. Who'd have guessed?</p><p>I've even made a new friend. We met while I was waiting to go in for a death metal gig, and got chatting about our favorite pasta sauces. We continue to chat now, and go to gigs together. I'd have never met my new friend if not for my ANC experiment — and it goes to show why it's so important to be more aware of what's going on around you.</p><h3 class="article-body__section" id="section-it-s-not-for-everyone"><span>It's not for everyone</span></h3><p>I understand that this is not for everyone. Some neurodiverse people value ANC and how it can isolate them from an otherwise overwhelming world. I'm not saying that <em>everyone </em>should go ANC-free at all — only that I've seen benefits in my experience.</p><p>I have had people question parts of my method, understandably. The most common is "why not just turn on transparency mode?" I've gone completely headphone free because it's not <em>just </em>the ANC that keeps me distracted while out and about, but music as well.</p><p>If nothing else, I want people to consider how they react to the world while they're wearing their headphones. As loneliness becomes a bigger issue, I can't help but wonder if part of the reason is down to how we lock ourselves away from our fellow humans. Perhaps it's time we untethered ourselves from our noise-canceling headphones.</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/audio/over-ear-headphones/i-test-headphones-for-a-living-and-heres-what-id-buy-instead-of-the-sony-wh-1000xm6-and-the-bose-quietcomfort-ultra-headphones-gen-2">I test headphones for a living — here's what I'd buy instead of the Sony WH-1000XM6 and Bose QuietComfort Ultra</a></li><li><a href="https://www.tomsguide.com/tech/value-awards">Tom’s Guide Value Awards: The 43 Best Tech Bargains of the Year</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/i-saw-40-new-movies-in-2025-and-these-are-my-10-favorites-to-watch-right-now">I saw 40 new movies in 2025 and these are my 10 favorites to watch right now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I wish my AirPods would steal these 3 features from other headphones and earbuds ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/airpods/i-wish-my-airpods-would-steal-these-3-features-from-other-headphones-and-earbuds</link>
                                                                            <description>
                            <![CDATA[ The AirPods Pro 3 are very, very good — but they're missing some of the best features of the competition. I'd like to see these three features come to AirPods. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">rVeqZNJNRbWAHU3EmHU5Lg</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Q7LZEeQj46Hd3tBS5MiM2b-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 18 Dec 2025 12:13:58 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Airpods]]></category>
                                                    <category><![CDATA[Earbuds]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Headphones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Q7LZEeQj46Hd3tBS5MiM2b-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A pair of Apple AirPods Pro 3]]></media:description>                                                            <media:text><![CDATA[A pair of Apple AirPods Pro 3]]></media:text>
                                <media:title type="plain"><![CDATA[A pair of Apple AirPods Pro 3]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Q7LZEeQj46Hd3tBS5MiM2b-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I love the <a href="https://www.tomsguide.com/audio/airpods/apple-airpods-pro-3-review">AirPods Pro 3</a>, I really do. They're some of the <a href="https://www.tomsguide.com/us/best-wireless-earbuds,review-6160.html">best wireless earbuds</a> that you can buy today, thanks to their comfortable fit, excellent sound and stellar noise canceling.</p><p>But I can't help but feel left wanting, occasionally, when I look at the competition. There are features out there that I feel would fit very well with the AirPods line, from a personalizable custom EQ to even more fitting options.</p><p>These features, found in the likes of the <a href="https://www.tomsguide.com/audio/earbuds/bose-quietcomfort-ultra-earbuds-2-review">Bose QuietComfort Ultra Earbuds</a>, would make the AirPods Pro 3 even better. Let's dive in and see what Apple should be adding to its AirPods sack before it brings a new pair to store shelves.</p><h3 class="article-body__section" id="section-fitting-wings"><span>Fitting wings</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-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="BdCNRUedryKnQKvQmK8C4R" name="Bose QuietComfort Ultra Earbuds 2" alt="Bose QuietComfort Ultra Earbuds 2" src="https://cdn.mos.cms.futurecdn.net/BdCNRUedryKnQKvQmK8C4R.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 most comfortable buds I've ever tried, hands down, are the QuietComfort Ultra Earbuds gen 2. They're also the most secure, and I'd wager that is down to the extra-fitting wings and assorted silicon 'bud bit' that ensure they stay in your ears.</p><p>I have particularly large ears, so fitting wings are a boon anyway. But even then, they stop tight buds from pushing their way out, and loose ones from shaking away. They needn't be particularly invasive — see how subtle the wings are above — but I'd love to see some on the AirPods.</p><p>Even better, they could be removable. Given that the AirPods are sweat and dust-proof, making them even more runner-friendly would be a massive positive to notch on their impressive belt.</p><p>Is it likely? Probably not. But we can always dream of AirPods that fit <em>even better</em>.</p><h3 class="article-body__section" id="section-customizable-eq"><span>Customizable EQ</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NLdedP98Uju82cvkrWUSTW" name="Sony WF-1000XM5-11.jpg" alt="Sony WF-1000XM5 hero shot with earbuds in white charging case" src="https://cdn.mos.cms.futurecdn.net/NLdedP98Uju82cvkrWUSTW.jpg" mos="" align="middle" fullscreen="" width="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 is some customizability built into the AirPods line, thanks to pre-sets that change the sound, but there's no way to change the sound profile more granularly. Compare that to the likes of the <a href="https://www.tomsguide.com/reviews/sony-wf-1000xm5">Sony WF-1000XM5</a>, which you can tune to your heart's content with a comprehensive EQ section, and the AirPods come up wanting.</p><p>I'm not asking for much — just a few channels of adjustment. I'd like to be able to dial in the sound more to my taste, instead of relying on the sound engineers at Apple. They're very good, but you can't please absolutely everbody.</p><p>That would make the AirPods an even more compelling option in my eyes, allowing for more customizability.</p><h3 class="article-body__section" id="section-all-the-features-available-on-android"><span>All the features available on Android</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NCvqKqbM7SPSDJAssB6NMJ" name="TG_B&W-Pi8-3.jpg" alt="Bowers & Wilkins Pi8 wireless headphones" src="https://cdn.mos.cms.futurecdn.net/NCvqKqbM7SPSDJAssB6NMJ.jpg" mos="" align="middle" fullscreen="" width="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>This is about as likely to happen as the second great flood, but a girl can wish. The AirPods line, if you use an iPhone and other Apple devices, are as fully featured as they come. If, however, you happen to also use a Windows laptop, or an Android tablet, many of the features won't work.</p><p>They'll connect, and they'll play music, but you'll lose most of their most useful features. Hearing test won't work, the EQ presets can't be changed, and some of the touch controls might get a bit... funky.</p><p>I know that the Apple walled garden strengthens those that live within it — but one step outside of those glassy walls brings the restriction into stark daylight. Android customers make up swathes of the smartphone-buying public. There's a fresh customer base right there Apple, and some of them might want to buy some AirPods.</p><p>Why not open those gates?</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/audio/soundbars/no-more-cables-dolby-and-lg-are-making-wireless-dolby-atmos-sound-happen-in-2026">No more cables! Dolby and LG are making wireless Dolby Atmos sound happen in 2026</a></li><li><a href="https://www.tomsguide.com/audio/over-ear-headphones/i-test-headphones-for-a-living-and-heres-what-id-buy-instead-of-the-sony-wh-1000xm6-and-the-bose-quietcomfort-ultra-headphones-gen-2">I test headphones for a living — here's what I'd buy instead of the Sony WH-1000XM6 and Bose QuietComfort Ultra</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/the-pixel-watch-4-is-great-but-im-sticking-with-my-galaxy-watch-8-classic-heres-why">The Pixel Watch 4 is great, but I'm sticking with my Galaxy Watch 8 Classic — here's why</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I test headphones for a living — here's what I'd buy instead of the Sony WH-1000XM6 and Bose QuietComfort Ultra  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/over-ear-headphones/i-test-headphones-for-a-living-and-heres-what-id-buy-instead-of-the-sony-wh-1000xm6-and-the-bose-quietcomfort-ultra-headphones-gen-2</link>
                                                                            <description>
                            <![CDATA[ The Bose and Sony headphones are arguably the class leaders — but they're not the headphones that I'd buy. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Hywmh2XWJ8N6v7bYSmvXP6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/LDmkP3MnrE2hB92qohv66m-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 17 Dec 2025 11:48:55 +0000</pubDate>                                                                                                                                <updated>Wed, 17 Dec 2025 12:44:27 +0000</updated>
                                                                                                                                            <category><![CDATA[Over-Ear Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Headphones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/LDmkP3MnrE2hB92qohv66m-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Sony WH-1000XM6 vs Bose QuietComfort Ultra Headphones]]></media:description>                                                            <media:text><![CDATA[Sony WH-1000XM6 vs Bose QuietComfort Ultra Headphones]]></media:text>
                                <media:title type="plain"><![CDATA[Sony WH-1000XM6 vs Bose QuietComfort Ultra Headphones]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/LDmkP3MnrE2hB92qohv66m-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Look, the Sony and Bose entries into our <a href="https://www.tomsguide.com/us/best-headphones,review-1988.html">best headphones</a> guide are good cans. They're both very comfortable, sound good, and offer otherwise unrivalled ANC. But they're very... safe.</p><p>They don't do anything different, barely shaking up the design category, or taking their sound profiles to different and more interesting places. They're the headphones for the everyday person, and that means, in my eyes at least, that they're... kind of boring.</p><p>And here's the thing. There are headphones you can buy for a similar price (and even less) that do more interesting things with the medium. That focus on a particular facet — be that sound, style, or battery life — and stand out from the otherwise identikit sea of similar headphones.</p><p>So, which headphones would I buy instead of the <a href="https://www.tomsguide.com/audio/over-ear-headphones/sony-wh-1000xm6-review">WH-1000XM6</a> or the <a href="https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review">QuietComfort Ultra Headphones gen 2</a>? Let me tell you in about 700 words and some pretty pictures.</p><h3 class="article-body__section" id="section-my-top-pick-bowers-wilkins-px7-s3"><span>My top pick: Bowers & Wilkins PX7 S3</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5Ap3dA3ur48fz66PRyeqwA" name="Bowers & Wilkins PX7 S3-13" alt="Bowers & Wilkins PX7 S3" src="https://cdn.mos.cms.futurecdn.net/5Ap3dA3ur48fz66PRyeqwA.jpg" mos="" align="middle" fullscreen="" width="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>This year has been a weird one for the previous class leaders. We gave both the WH-1000XM6 and the QuietComfort Ultra Headphones gen 2 four stars in their reviews, after years of 4.5 and 5 stars for their predecessors. Which headphones received a better score this year?</p><p>The <a href="https://www.tomsguide.com/audio/bowers-and-wilkins-px7-s3-review">Bowers & Wilkins PX7 S3</a>.</p><p>The competition has finally caught up with Sony and Bose, and the PX7 S3 merely highlight how difficult the job has become. While the noise canceling might not be quite as powerful, they put more focus on other parts of the formula – namely, sounding really, really good.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xzrWQzGSpX7w3U4QPJvazA" name="Bowers & Wilkins PX7 S3-16" alt="Bowers & Wilkins PX7 S3" src="https://cdn.mos.cms.futurecdn.net/xzrWQzGSpX7w3U4QPJvazA.jpg" mos="" align="middle" fullscreen="" width="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>They're a wholly more musical and engaging listen than the Sony and Bose options. They bring more detail to the table, while going even lower into the frequency range. The sound is bigger in almost every direction, even if the soundstage is more intimate than expansive.</p><p>There are other spots where B&W has overtaken the competition. The build of the PX7 S3 is unlike anything at the same price, and they're more comfortable for long periods of time. The protective case is better too. It's sturdier and more protective. The physical controls are clicky and responsive, no matter what weather you're in — something that can't be said of the touch controls on the alternatives.</p><p>The sound focus makes them a far more compelling buy than either the Sony or Bose options in 2026 — and it makes me really excited to see what the future holds for Bowers & Wilkins.</p><div class="product"><a data-dimension112="42c89074-a1fc-4609-8489-287dbd75ecff" data-action="Deal Block" data-label="They're the best headphones of 2025 thanks to their excellent sound, epic build quality and solid battery life. The protective case is one of the best around as well — I use them every day." data-dimension48="They're the best headphones of 2025 thanks to their excellent sound, epic build quality and solid battery life. The protective case is one of the best around as well — I use them every day." data-dimension25="$421" href="https://www.amazon.com/dp/B0F462NHW2/" 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="ywqsSadwSfdgKBxjtwEtNf" name="Bowers and Wilkins Px7 S3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ywqsSadwSfdgKBxjtwEtNf.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>They're the best headphones of 2025 thanks to their excellent sound, epic build quality and solid battery life. The protective case is one of the best around as well — I use them every day.<a class="view-deal button" href="https://www.amazon.com/dp/B0F462NHW2/" target="_blank" rel="nofollow" data-dimension112="42c89074-a1fc-4609-8489-287dbd75ecff" data-action="Deal Block" data-label="They're the best headphones of 2025 thanks to their excellent sound, epic build quality and solid battery life. The protective case is one of the best around as well — I use them every day." data-dimension48="They're the best headphones of 2025 thanks to their excellent sound, epic build quality and solid battery life. The protective case is one of the best around as well — I use them every day." data-dimension25="$421">View Deal</a></p></div><h3 class="article-body__section" id="section-something-a-bit-cheaper-cambridge-melomania-p100-se"><span>Something a bit cheaper: Cambridge Melomania P100 SE</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ah3jcBWWgfzRTmoHCqFWfS" name="Cambridge-Audio-Melomania-P100-SE-01-LIST" alt="Cambridge Audio Melomania P100 SE headphones and case on a table." src="https://cdn.mos.cms.futurecdn.net/ah3jcBWWgfzRTmoHCqFWfS.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you want <em>really </em>good headphones, you gotta spend a few more dollars than something super cheap. But you don't need to spend near $500 to get something that's epic. Case in point: <a href="https://www.tomsguide.com/audio/over-ear-headphones/cambridge-audio-melomania-p100-se-review">Cambridge's Melomania P100 SE</a>. They cost $299, a whole $150 less than the Sony and Bose cans.</p><p>And they beat them in some key areas.</p><p>They're not trying to be the kings of everything like the XM6 and QC Ultra 2, so they make some concessions. The case is big and bulky, their features not as extensive — but that's given Cambridge the opportunity to look at more important things. Like sound. And battery life.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XcLUK8pM8SWWA4UCKGkeUS" name="Cambridge-Audio-Melomania-P100-SE-02" alt="Cambridge Audio Melomania P100 SE headphones and case on a table." src="https://cdn.mos.cms.futurecdn.net/XcLUK8pM8SWWA4UCKGkeUS.jpg" mos="" align="middle" fullscreen="" width="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 Melomania P100 SE last for 60 hours with the ANC turned on. That's double the battery of both the Sony and Bose options, and more than the Bowers & Wilkins above. Turn the ANC off and they'll last for 100 hours, making them some of the longest-lasting headphones you can buy today.</p><p>The sound is extremely clean, but also weighty and meaty. You can really get your teeth into a listening session, savoring each mouthful of delicious music-steak. They're engaging, fun, and revealing all at the same time. For the price, nothing sounds better.</p><p>If I had $300 to buy a new pair of headphones I'm pretty spoilt for choice — but I would go for these. They're different enough to stand out from the crowd physically, and their battery life and sound seal the deal.</p><div class="product"><a data-dimension112="2a037a7d-9491-4573-8002-7bb974e9aefd" data-action="Deal Block" data-label="They sound epic, and they look pretty cool too. It's the battery life that'll really attract you to them though. 60 hours with ANC on, and 100 hours when you turn noise canceling off. That's a lot of battery life to go with their comfortable fit and excellent build." data-dimension48="They sound epic, and they look pretty cool too. It's the battery life that'll really attract you to them though. 60 hours with ANC on, and 100 hours when you turn noise canceling off. That's a lot of battery life to go with their comfortable fit and excellent build." data-dimension25="$249" href="https://www.amazon.com/dp/B0F9LK99KM/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1162px;"><p class="vanilla-image-block" style="padding-top:127.37%;"><img id="HBSqrJCHnMt5MfATTDDDGC" name="Cambridge Audio P100 SE.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HBSqrJCHnMt5MfATTDDDGC.jpg" mos="" align="middle" fullscreen="" width="1162" height="1480" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>They sound epic, and they look pretty cool too. It's the battery life that'll really attract you to them though. 60 hours with ANC on, and 100 hours when you turn noise canceling off. That's a lot of battery life to go with their comfortable fit and excellent build.<a class="view-deal button" href="https://www.amazon.com/dp/B0F9LK99KM/" target="_blank" rel="nofollow" data-dimension112="2a037a7d-9491-4573-8002-7bb974e9aefd" data-action="Deal Block" data-label="They sound epic, and they look pretty cool too. It's the battery life that'll really attract you to them though. 60 hours with ANC on, and 100 hours when you turn noise canceling off. That's a lot of battery life to go with their comfortable fit and excellent build." data-dimension48="They sound epic, and they look pretty cool too. It's the battery life that'll really attract you to them though. 60 hours with ANC on, and 100 hours when you turn noise canceling off. That's a lot of battery life to go with their comfortable fit and excellent build." data-dimension25="$249">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/computing/massive-apple-leak-reveals-over-30-coming-products-iphone-fold-cheap-macbook-smart-glasses-airtag-2-and-more">Massive Apple leak reveals over 30 upcoming products — iPhone Fold, cheap MacBook, smart glasses, AirTag 2 and more</a></li><li><a href="https://www.tomsguide.com/computing/samsung-reportedly-raises-ddr5-ram-prices-by-100-percent-with-no-stock-left">Samsung reportedly raises DDR5 RAM prices by 100% with 'no stock' left</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/push-ups-are-the-exercise-you-can-do-anywhere-3-variations-to-try-if-you-want-to-build-chest-strength">Push-ups are the exercise you can do anywhere — 3 variations to try now if you want to build chest strength</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Epic Bose holiday sale knocks up to 50% off headphones and speakers: 11 audio deals worth shopping now  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/amazons-bose-sale-is-a-holiday-win-heres-11-headphone-and-speaker-deals-up-to-50-percent-off-now</link>
                                                                            <description>
                            <![CDATA[ Amazon is knocking up to 50% off Bose speakers and headphones for the holidays. Check out my favorite picks from the sale. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">yVTFkTAjxWjQWVETafVQSg</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HZbQ6ugUfLUZHW6JrKtnwG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 15 Dec 2025 16:27:13 +0000</pubDate>                                                                                                                                <updated>Tue, 16 Dec 2025 20:50:23 +0000</updated>
                                                                                                                                            <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Olivia Halevy ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/YAg7Fmh9dGKbg3hULBMWiU.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Olivia is a Deals Writer at Tom’s Guide. She loves all things lifestyle, shopping and sourcing the best deals from some of the top brands, retailers and websites around. From fashion and beauty to smart home and tech, she has an eye for finding practical, stylish, and reasonably-priced items that help make life simpler (and a little more aesthetically-pleasing).&amp;nbsp;Olivia has over five years of experience writing lifestyle, commerce, and branded content for &lt;a href=&quot;http://patch.com/&quot;&gt;Patch.com&lt;/a&gt;. She&#039;s covered major shopping holidays like Amazon Prime Day, Black Friday and Cyber Monday. In her free time, she enjoys trying out new exercise classes, binge-watching the latest viral TV shows, cooking, spending time with family and taking long walks with her dog, Gus.&amp;nbsp;&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/HZbQ6ugUfLUZHW6JrKtnwG-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose Deals]]></media:description>                                                            <media:text><![CDATA[Bose Deals]]></media:text>
                                <media:title type="plain"><![CDATA[Bose Deals]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HZbQ6ugUfLUZHW6JrKtnwG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Hoping to score some new audio devices ahead of the holidays? Look no further than Bose — the audio brand that makes some of the <a href="https://www.tomsguide.com/us/best-headphones,review-1988.html">best headphones</a> and <a href="https://www.tomsguide.com/audio/i-test-bluetooth-speakers-for-a-living-and-heres-the-best-9-black-friday-deals-right-now">best Bluetooth speakers</a> on the market. </p><p>In fact, <a href="https://www.amazon.com/stores/page/4532D732-BA71-4CBB-93E2-54AF98057609?" target="_blank" rel="nofollow">Bose is hosting a huge holiday sale on Amazon as we speak </a>— and the deals are up to 50% off. If you're in the market for a speaker, I recommend <a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DPN69X2V?" target="_blank" rel="nofollow">the Bose SoundLink Flex (Gen 2) for just $119</a>. When it comes to headphones, you can't go wrong with the <a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0CCZ26B5V" target="_blank" rel="nofollow">Bose QuietComfort Headphones, which are now sporting a discount of 50%</a>. </p><p>So whether you're hoping to grab a holiday gift for an audiophile or you're just looking to treat yourself to a new device, these Bose deals are the way to go. Keep scrolling to check out the rest of my favorite picks from the sale. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links </span></h3><ul><li><a href="https://www.amazon.com/stores/page/C111A2F4-D35D-411C-A68E-2323FB0624D9?" target="_blank" rel="nofollow"><strong>shop all Bose deals on Amazon</strong></a></li><li><strong>Bose SoundLink Micro: </strong><a href="https://www.amazon.com/Bose-SoundLink-Micro-Bluetooth-speaker/dp/B0748N1BZD" target="_blank" rel="nofollow"><strong>was $119 now $89</strong></a></li><li><strong>Bose SoundLink Flex (Gen 2): </strong><a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DPN69X2V?" target="_blank" rel="nofollow"><strong>was $149 now $119</strong></a></li><li><strong>Bose QuietComfort Bluetooth Earbud: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Lifestyle-Cancellation/dp/B0DZHQHDWR?" target="_blank" rel="nofollow"><strong>was $179 now $129</strong></a></li><li><strong>Bose QuietComfort Earbuds 2: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow"><strong>was $299 now $184</strong></a></li><li><strong>Bose Ultra Open Earbuds: </strong><a href="https://www.amazon.com/dp/B0CPFV77W4/" target="_blank" rel="nofollow"><strong>was $299 now $229</strong></a></li><li><strong>Bose QuietComfort Headphones: </strong><a href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0FGYDGJ3H?th=1" target="_blank" rel="nofollow"><strong>was $349 now $179</strong></a></li><li><strong>Bose SoundLink Max: </strong><a href="https://www.amazon.com/dp/B0CVLD42PD?" target="_blank" rel="nofollow"><strong>was $399 now $279</strong></a></li></ul><h3 class="article-body__section" id="section-best-bose-deals"><span>Best Bose Deals</span></h3><div class="product"><a data-dimension112="86c2f2f7-8b67-49da-845f-0e9193d8a89c" data-action="Deal Block" data-label="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension48="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension25="$89" href="https://www.amazon.com/Bose-SoundLink-Micro-Bluetooth-speaker/dp/B0748N1BZD" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:102.21%;"><img id="GVe8YkR2UVdNf2zDVP9t27" name="Bose Soundlink.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GVe8YkR2UVdNf2zDVP9t27.jpg" mos="" align="middle" fullscreen="" width="679" height="694" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode.<a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Micro-Bluetooth-speaker/dp/B0748N1BZD" target="_blank" rel="nofollow" data-dimension112="86c2f2f7-8b67-49da-845f-0e9193d8a89c" data-action="Deal Block" data-label="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension48="The SoundLink Micro is a compact, portable speaker you can take on the road. The Bluetooth speaker is waterproof (IPX7 certified) and offers up to 6 hours of play time off a single charge. It can also be paired with another SoundLink speaker to create a stereo mode." data-dimension25="$89">View Deal</a></p></div><div class="product"><a data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$119" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DPN69X2V?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:75.11%;"><img id="fexRzMYRvYZTHGfbcUbFf8" name="Bose speaker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/fexRzMYRvYZTHGfbcUbFf8.jpg" mos="" align="middle" fullscreen="" width="679" height="510" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The new Bose SoundLink (2nd gen) is a compact and powerful Bluetooth speaker with a durable design. This 1.2-pound speaker is water and dust proof and delivered great sound quality in our <a href="https://www.tomsguide.com/audio/bose-soundlink-flex-2-review" target="_blank" data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$119">SoundLink Flex gen 2 review</a>. With 12 hours of battery life and $30 off, you have yourself a great deal.<a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DPN69X2V?" target="_blank" rel="nofollow" data-dimension112="250802fe-d568-47b6-891c-88dc404e1161" data-action="Deal Block" data-label="SoundLink Flex gen 2 review" data-dimension48="SoundLink Flex gen 2 review" data-dimension25="$119">View Deal</a></p></div><div class="product"><a data-dimension112="530ab1fc-7bcf-4b2b-9ce1-226b47a27fdd" data-action="Deal Block" data-label="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $129." data-dimension48="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $129." data-dimension25="$129" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Lifestyle-Cancellation/dp/B0DZHQHDWR" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:95.55%;"><img id="gng2pmSiBsvdSJEfE2mEde" name="Bose QuietComfort Earbuds" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/gng2pmSiBsvdSJEfE2mEde.png" mos="" align="middle" fullscreen="" width="1280" height="1223" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $129.<a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Lifestyle-Cancellation/dp/B0DZHQHDWR" target="_blank" rel="nofollow" data-dimension112="530ab1fc-7bcf-4b2b-9ce1-226b47a27fdd" data-action="Deal Block" data-label="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $129." data-dimension48="The Bose QuietComfort Earbuds (2024) are a fantastic pair of noise-canceling earbuds that don’t break the bank. Bose reigns supreme in terms of sound quality and active noise cancellation, and that’s very much the case with these mid-range earbuds too. You’re getting best-in-class sound quality and ANC — all for just $129." data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$170" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0D4Z9C562" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1082px;"><p class="vanilla-image-block" style="padding-top:97.23%;"><img id="G8nmk5kRrjkWCjQKS3fJVL" name="Bosie QuietComfort headphones" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/G8nmk5kRrjkWCjQKS3fJVL.png" mos="" align="middle" fullscreen="" width="1082" height="1052" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>In our <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-headphones" data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$170">Bose QuietComfort Headphones review</a>, we said these are "excellent always-on noise-cancelers with enhanced sound and battery life." They're missing spatial audio mode and touch controls, but at 50% off, these are nearly perfect. <a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Headphones-Bluetooth/dp/B0D4Z9C562" target="_blank" rel="nofollow" data-dimension112="dec3e2a3-cc97-4a52-bd5f-c1ec964e3670" data-action="Deal Block" data-label="Bose QuietComfort Headphones review" data-dimension48="Bose QuietComfort Headphones review" data-dimension25="$170">View Deal</a></p></div><div class="product"><a data-dimension112="b631b9a1-e612-4e33-93fd-ef1aa566e441" data-action="Deal Block" data-label="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension48="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension25="$179" href="https://www.amazon.com/dp/B08VLD15ZL?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:612px;"><p class="vanilla-image-block" style="padding-top:193.14%;"><img id="2jQqXJCjqJ7xi7ch8khBuZ" name="Bose Soundlink" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2jQqXJCjqJ7xi7ch8khBuZ.jpg" mos="" align="middle" fullscreen="" width="612" height="1182" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever.<a class="view-deal button" href="https://www.amazon.com/dp/B08VLD15ZL?" target="_blank" rel="nofollow" data-dimension112="b631b9a1-e612-4e33-93fd-ef1aa566e441" data-action="Deal Block" data-label="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension48="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="ab6c08e5-4727-4716-af07-3f6609dbf0ff" data-action="Deal Block" data-label="Our Audio Editor loves her pair of Soundlink Home speakers thanks to their handsome looks and solid sound profile. You can connect them together for stereo mode as well. More than 9 hours of battery would be nice, though. Still, this is an excellent deal price on a lovely speaker." data-dimension48="Our Audio Editor loves her pair of Soundlink Home speakers thanks to their handsome looks and solid sound profile. You can connect them together for stereo mode as well. More than 9 hours of battery would be nice, though. Still, this is an excellent deal price on a lovely speaker." data-dimension25="$179" href="https://www.amazon.com/dp/B0DT7FT7BC/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:827px;"><p class="vanilla-image-block" style="padding-top:58.65%;"><img id="b9zi7aAFzqby3DuaeGuEKX" name="SoundLink Home Speaker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/b9zi7aAFzqby3DuaeGuEKX.png" mos="" align="middle" fullscreen="" width="827" height="485" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Our Audio Editor loves her pair of Soundlink Home speakers thanks to their handsome looks and solid sound profile. You can connect them together for stereo mode as well. More than 9 hours of battery would be nice, though. Still, this is an excellent deal price on a lovely speaker.<a class="view-deal button" href="https://www.amazon.com/dp/B0DT7FT7BC/" target="_blank" rel="nofollow" data-dimension112="ab6c08e5-4727-4716-af07-3f6609dbf0ff" data-action="Deal Block" data-label="Our Audio Editor loves her pair of Soundlink Home speakers thanks to their handsome looks and solid sound profile. You can connect them together for stereo mode as well. More than 9 hours of battery would be nice, though. Still, this is an excellent deal price on a lovely speaker." data-dimension48="Our Audio Editor loves her pair of Soundlink Home speakers thanks to their handsome looks and solid sound profile. You can connect them together for stereo mode as well. More than 9 hours of battery would be nice, though. Still, this is an excellent deal price on a lovely speaker." data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$184" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:996px;"><p class="vanilla-image-block" style="padding-top:115.06%;"><img id="z2eEQ66QuaM6umZmg8fKoL" name="1715191898.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/z2eEQ66QuaM6umZmg8fKoL.jpg" mos="" align="middle" fullscreen="" width="996" height="1146" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Earbuds 2 take active noise cancellation to the next level. In our <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-earbuds-2" data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$184">Bose QuietComfort Earbuds 2 review</a>, we said these buds are a remarkable follow-up to their predecessors delivering better sound, call quality and unrivaled ANC. Sound balance and noise neutralization work extremely well and the battery life is up to 6 hours, with an extra 24 hours via the charging case.<a class="view-deal button" href="https://www.amazon.com/Bose-QuietComfort-Cancelling-Personalized-Cancellation/dp/B0B7838HH6" target="_blank" rel="nofollow" data-dimension112="ac2a68bb-2d16-46ae-943d-01e30e150eed" data-action="Deal Block" data-label="Bose QuietComfort Earbuds 2 review" data-dimension48="Bose QuietComfort Earbuds 2 review" data-dimension25="$184">View Deal</a></p></div><div class="product"><a data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$229" href="https://www.amazon.com/dp/B0FDKR4RVP/?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:62.59%;"><img id="wjSgGFFpyDJzdztK3MZ64S" name="Bose ultra open" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wjSgGFFpyDJzdztK3MZ64S.jpg" mos="" align="middle" fullscreen="" width="679" height="425" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose Ultra Open perfected the open earbud formula. They have a comfortable, non-invasive fit, solid battery life, and they sound better than you might expect from open buds. They got <a href="https://www.tomsguide.com/audio/earbuds/bose-ultra-open-earbuds" data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$229">4 stars in our review</a>, where we loved their simple controls and surprising lack of sound leakage. <a class="view-deal button" href="https://www.amazon.com/dp/B0FDKR4RVP/?" target="_blank" rel="nofollow" data-dimension112="b1b59cc4-b3b2-4f96-b72f-2b1cab1a96e2" data-action="Deal Block" data-label="4 stars in our review" data-dimension48="4 stars in our review" data-dimension25="$229">View Deal</a></p></div><div class="product"><a data-dimension112="95cb839a-276d-430e-a0a8-3ce83a1d2dc0" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly. This is the bud's lowest price yet." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly. This is the bud's lowest price yet." data-dimension25="$249" href="https://www.amazon.com/dp/B0FDKS5NN7/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:934px;"><p class="vanilla-image-block" style="padding-top:124.20%;"><img id="a9jV9Xm3AhpGwNWnqABVVP" name="Bose QuietComfort Ultra Earbuds gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/a9jV9Xm3AhpGwNWnqABVVP.png" mos="" align="middle" fullscreen="" width="934" height="1160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly. This is the bud's lowest price yet.<a class="view-deal button" href="https://www.amazon.com/dp/B0FDKS5NN7/" target="_blank" rel="nofollow" data-dimension112="95cb839a-276d-430e-a0a8-3ce83a1d2dc0" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly. This is the bud's lowest price yet." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly. This is the bud's lowest price yet." data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="62651099-3d29-49e4-b22d-e0f44917f1e5" data-action="Deal Block" data-label="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension48="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension25="$279" href="https://www.amazon.com/dp/B0CVLD42PD?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:83.65%;"><img id="MVjLikCXrKRNZTADxgezp3" name="bose" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/MVjLikCXrKRNZTADxgezp3.jpg" mos="" align="middle" fullscreen="" width="679" height="568" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time. <a class="view-deal button" href="https://www.amazon.com/dp/B0CVLD42PD?" target="_blank" rel="nofollow" data-dimension112="62651099-3d29-49e4-b22d-e0f44917f1e5" data-action="Deal Block" data-label="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension48="With big sound and a fashionable look, the SoundLink Max is a great portable companion for taking on the go. 20 hours of battery life is a big bonus as well, giving you plenty of listening time." data-dimension25="$279">View Deal</a></p></div><div class="product"><a data-dimension112="5eff563c-c4b7-40f0-9b5e-8384f166009f" data-action="Deal Block" data-label="This deal on the QuietComfort Ultra Headphones brings them down to their lowest price ever. They're the best headphones at blocking out noise at this price, and deliver excellent sound and 24 hours of battery. In terms of comfort, they can't be beat." data-dimension48="This deal on the QuietComfort Ultra Headphones brings them down to their lowest price ever. They're the best headphones at blocking out noise at this price, and deliver excellent sound and 24 hours of battery. In terms of comfort, they can't be beat." data-dimension25="$279" href="https://www.amazon.com/dp/B0DX2LNZ68?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:123.86%;"><img id="xEtrp3G3VkDhs6w72BpCs4" name="Bose Quietcomfort ultra" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xEtrp3G3VkDhs6w72BpCs4.jpg" mos="" align="middle" fullscreen="" width="679" height="841" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This deal on the QuietComfort Ultra Headphones brings them down to their lowest price ever. They're the best headphones at blocking out noise at this price, and deliver excellent sound and 24 hours of battery. In terms of comfort, they can't be beat.<a class="view-deal button" href="https://www.amazon.com/dp/B0DX2LNZ68?" target="_blank" rel="nofollow" data-dimension112="5eff563c-c4b7-40f0-9b5e-8384f166009f" data-action="Deal Block" data-label="This deal on the QuietComfort Ultra Headphones brings them down to their lowest price ever. They're the best headphones at blocking out noise at this price, and deliver excellent sound and 24 hours of battery. In terms of comfort, they can't be beat." data-dimension48="This deal on the QuietComfort Ultra Headphones brings them down to their lowest price ever. They're the best headphones at blocking out noise at this price, and deliver excellent sound and 24 hours of battery. In terms of comfort, they can't be beat." data-dimension25="$279">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just tested the Bose QuietComfort Ultra Headphones gen 2 — I've never experienced ANC this good ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review</link>
                                                                            <description>
                            <![CDATA[ The QuietComfort Ultra Headphones gen 2 are here with better battery life, a new spatial audio mode and improved ANC. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">DB6qTi7YWumb27XJVAjHZi</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/vPkNbWYWPGMsPLVmRQbSu4-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 09 Dec 2025 07:15:00 +0000</pubDate>                                                                                                                                <updated>Thu, 26 Mar 2026 10:31:17 +0000</updated>
                                                                                                                                            <category><![CDATA[Over-Ear Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Headphones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/vPkNbWYWPGMsPLVmRQbSu4-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose QuietComfort Ultra Gen 2]]></media:description>                                                            <media:text><![CDATA[Bose QuietComfort Ultra Gen 2]]></media:text>
                                <media:title type="plain"><![CDATA[Bose QuietComfort Ultra Gen 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/vPkNbWYWPGMsPLVmRQbSu4-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The original <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-ultra-headphones">Bose QuietComfort Ultra Headphones</a> are still some of my favorite headphones. While their battery life left a lot to be desired and their sound wasn’t <em>quite</em> as impressive as more sonically capable rivals, their ANC was the very best you could buy for a price that matched the competition. They were (and still are) excellent headphones.</p><p>The aptly named QuietComfort Ultra Headphones 2nd Generation are now here to carry on the torch. They’re pretty much up to the task — thanks to a very welcome increase in battery life, improved sound profile, and some new spatial audio modes —but they don't surpass the competition in every category. </p><p>They are, without a doubt, the <a href="https://www.tomsguide.com/us/best-noise-cancelling-headphones,review-5566.html">best noise-canceling headphones</a> you can buy right now. But, if you’re looking beyond ANC ability, Sony and Bowers & Wilkins might have them beat. Find out why in my Bose QuietComfort Ultra Headphones Gen 2 review.</p><h3 class="article-body__section" id="section-bose-quietcomfort-ultra-headphones-2nd-generation-specs"><span>Bose QuietComfort Ultra Headphones 2nd Generation: Specs</span></h3><ul><li><strong>Price </strong>£449/$449/AU$699</li><li><strong>Connectivity </strong>Bluetooth 5.4</li><li><strong>ANC </strong>Yes</li><li><strong>Battery </strong>30 hours (ANC on)</li><li><strong>Weight </strong>0.58 pounds</li><li><strong>Dimensions </strong>7.68 x 5.47 x 2 inches</li><li><strong>Colors </strong>Black/ White Smoke/ Midnight Violet/ Driftwood sand/ Desert Gold</li><li><strong>Drivers </strong>35mm</li><li><strong>Compatibility </strong>iOS, Android</li><li><strong>Frequency response </strong>10Hz - 22kHz</li></ul><h3 class="article-body__section" id="section-bose-quietcomfort-ultra-headphones-2nd-generation-review-cheat-sheet"><span>Bose QuietComfort Ultra Headphones 2nd Generation review: Cheat sheet</span></h3><ul><li><strong>What is it? </strong>An update to Bose’s flagship noise-canceling headphones</li><li><strong>Who is it for?</strong> Users who want to block out every single noise ever</li><li><strong>What does it cost? </strong>£449/$449/AU$699</li><li><strong>What do we like? </strong>Epic noise canceling, very comfortable fit, reliable and helpful app</li><li><strong>What don’t we like?</strong> Aging sound profile, identical design</li></ul><h3 class="article-body__section" id="section-bose-quietcomfort-ultra-headphones-2nd-generation-review-price-and-availability"><span>Bose QuietComfort Ultra Headphones 2nd Generation review: Price and availability</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NZSaQVTjyyQAUhvWeRw8u4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/NZSaQVTjyyQAUhvWeRw8u4.jpg" mos="" align="middle" fullscreen="" width="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 with all things Bose, getting yourself a pair of QuietComfort Ultra Headphones gen 2 is going to be a cinch. They’re available at pretty much any big box retailer like Best Buy, Walmart and Amazon. You can also pick up a pair directly from Bose, if that’s what you'd prefer. Either way, adding some to your backpack isn’t going to entail a lengthy search of store shelves or web pages.</p><p>What might make purchasing a pair slightly trickier is the price. The first model cost $429, and this newer model has received a not-insignificant price hike of $30. That makes them about $10 more than the <a href="https://www.tomsguide.com/audio/over-ear-headphones/sony-wh-1000xm6-review">Sony WH-1000XM6</a> and our current pick for the <a href="https://www.tomsguide.com/us/best-headphones,review-1988.html">best headphones</a>, the <a href="https://www.tomsguide.com/audio/bowers-and-wilkins-px7-s3-review">Bowers & Wilkins PX7 S3</a>. It’s an unwelcome price hike, that’s for sure, especially as everyone tightens their belts in a particularly icy financial climate.</p><p>The price wouldn’t sting quite as much if they were a significant update over the previous pair, but they don’t feel like enough of an upgrade to justify the increase. It also makes them an unworthy upgrade for current QuietComfort Ultra Headphones users. My advice? Wait for the next model, you won’t get much extra here.</p><h3 class="article-body__section" id="section-bose-quietcomfort-ultra-headphones-2nd-generation-review-build-and-design"><span>Bose QuietComfort Ultra Headphones 2nd Generation review: Build and design</span></h3><ul><li>Slightly rattly</li><li>There’s nothing new…</li><li>But they’re still handsome</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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BjvHbu9p7xWe3936HniTt4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/BjvHbu9p7xWe3936HniTt4.jpg" mos="" align="middle" fullscreen="" width="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>Look, the QuietComfort Ultra Headphones were a good-looking pair of headphones. Those metal accents in the hinges looked lovely, and they match the pearlescent plastic earcups and headphones nicely. </p><p>They’re certainly more interesting-looking than the Sony XM6-flavored competition, but not quite as stylish or premium-looking as the Bowers & Wilkins PX7 S3 headphones. I like the look of the QuietComfort Ultra, but they’re not the best around.</p><p>It’s good that the 1st gen looked so nice because the new model doesn’t look even one iota different from their forbears. It's the same metallic hinge pieces, the same plastic earcups, and identical cushioning on both headphones. There are new color options to keep things a little fresher, but at their core, no one is going to know that you’re rocking the new version. </p><p>I wasn’t entirely sure I was using the 2nd gen at one point, and had to check in the app to see what they were called. Which perhaps says a lot about just how iterative this update actually is.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MrMZCAm5VaGopn5CKLU9v4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/MrMZCAm5VaGopn5CKLU9v4.jpg" mos="" align="middle" fullscreen="" width="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>Thankfully, that also means the incredible comfort of the old version carries into the second generation. They’re impressively lightweight, and when you combine that with their super soft leatherette pads and ample padding, you end up with one of the most comfortable fits in all of noise-canceling headphone-dom. I had no problem wearing them for hours and hours on end, and I’d wager that neither will you.</p><p>Their identikit build also carries one of the biggest disappointments of the older model with them; they don’t <em>feel </em>premium in the hand. They’re a bit rattly, and they don’t feel as put-together as their key rivals. </p><p>They don’t feel cheap, but neither do they feel like you’ve just dropped nearly half a grand on a pair of noise-canceling headphones.</p><p>The excellent protective case does make it easier to toss them in a busy backpack guilt-free, and my older QuietComfort Ultra Headphones have stood the test of time with no breakages (despite a difficult life). But you’d hope they’d feel more expensive, given that they <em>are </em>expensive.</p><h3 class="article-body__section" id="section-bose-quietcomfort-ultra-headphones-2nd-generation-review-features"><span>Bose QuietComfort Ultra Headphones 2nd Generation review: Features</span></h3><ul><li>Plenty of “immersive” spatial audio modes</li><li>Fairly weak EQ</li><li>AptX adaptive</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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wTXbQGFHJoipVP9x4bY7u4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/wTXbQGFHJoipVP9x4bY7u4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When you’re looking at the spec sheet of the QuietComfort Ultra Headphones 2nd Gen, you have to talk about the “Immersive” Spatial Audio sound modes. There are <em>technically </em>three, and one of them is new. Well, there are four if you consider “off” a mode. I don’t, it’s the default; because I still don’t get why everyone raves about these immersive sound modes.</p><p>There are two Immersive modes for music. One is for when you’re sitting down, and tracks your head movements to sound like your music is in a static place in space, with you looking around in the middle. </p><p>It’s smooth enough, unlike the same feature in the Beats Studio Pro, but I just don’t get it. It thins out the sound, tanking bass response and detail in exchange for an artificially widened soundstage. I don’t even think it sounds that much bigger — I often found my music sounded wider when it was turned off.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pv2JhFoHoBrZBBU3eWvwv4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/pv2JhFoHoBrZBBU3eWvwv4.jpg" mos="" align="middle" fullscreen="" width="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 second is for when you’re walking around, centering the music around your head so that it no longer moves. It’s not as disconcerting, but no less uncomfortable-sounding. </p><p>To be clear, there are two problems here. The first is that it doesn’t use a Spatial Audio mix like Apple headphones do, and has to work with stereo recordings. They only have a certain amount of information to parse out into a 3D space, and what Bose has done is very impressive. The second is me. I simply don’t like it. </p><p>For home-grown musical spatial audio systems, Bose’s Immersive Audio is fine. It works. But the fact remains that standard stereo listening sounds better, and doesn’t use as much battery. </p><div><blockquote><p>TL;DR: Musical Immersive Modes, no thanks. Move Immersive Mode, yes please.</p></blockquote></div><p>The third immersive mode is cinema — and it’s about the only immersive mode I like. It’s designed, as you might have guessed, for movies, and it does a good enough job of making your movies feel more like surround sound when you're on a train, a plane, or, indeed, an automobile.</p><p>TL;DR: Musical Immersive Modes, no thanks. Move Immersive Mode, yes please.</p><p>The “Bose” app at the core of the experience works well enough. It’s where you’ll find all those Immersive sound modes, as well as the other settings. There’s a fairly weak (although essential) 3-band EQ, the ANC ‘noise control’ settings, as well as a customizable control for the touch… thing found on the right earcup.</p><p>There are fewer features here than you’ll find on Sony’s headphones, but it’s about the same as those in the Bowers & Wilkins PX7 S3. About the only thing you’ll really miss out on are the fancy ANC modes that Sony has cooked up for the WH-1000XM6, and I’m not entirely sure they’re actually all that useful.</p><h3 class="article-body__section" id="section-bose-quietcomfort-ultra-headphones-2nd-generation-review-anc"><span>Bose QuietComfort Ultra Headphones 2nd Generation review: ANC</span></h3><ul><li>Just about the best around</li><li>No notes.</li><li>Nothing better.</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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cBY9DLRkcvutsMA2UQVFBT" name="Bose QuietComfort Ultra Headphones gen 2 vs Audio Technica ATH-S300BTBK" alt="Bose QuietComfort Ultra Headphones gen 2 vs Audio Technica ATH-S300BTBK" src="https://cdn.mos.cms.futurecdn.net/cBY9DLRkcvutsMA2UQVFBT.jpg" mos="" align="middle" fullscreen="" width="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>Usually, I’d spend loads of time here waxing lyrical about the ANC of the QuietComfort Ultra Headphones 2nd Generation's ability to block noise. I’d use fancy words like “indomitable” and “unconquerable.” I might throw in an “indefatigable” or two, perhaps even an “unflinching.”</p><p>But I won’t, because I don’t really need to. The ANC that Bose has packed into the Ultra Headphones 2nd gen is somehow even better than the first gen. Press the button, and you’re whisked away into your little noiseless cocoon, your only companion the music or podcast you’re listening to.</p><p>It’s still remarkable, still impressive, and continues to set the benchmark for how much noise a pair of headphones can block.</p><p>Transparency mode is no less excellent. Your conversation partners (or the station announcer) will sound natural, and it avoids the often robotic sound of similar systems. Bose still sets the bar for noise canceling and transparency modes, outdoing similarly priced and more expensive headphones without breaking a sweat.</p><h3 class="article-body__section" id="section-bose-quietcomfort-ultra-headphones-2nd-generation-review-call-quality"><span>Bose QuietComfort Ultra Headphones 2nd Generation review: Call quality</span></h3><ul><li>Solid mics</li><li>Great sound quality</li><li>Noise isolation is very good</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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QLP7SzVbaHA6YG5YGM5ou4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/QLP7SzVbaHA6YG5YGM5ou4.jpg" mos="" align="middle" fullscreen="" width="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>Thanks to all the microphones that Bose has pumped into the QuietComfort Ultra Headphones gen 2, the call quality is excellent. But then the call quality of the previous model was also good — and you’re not going to get much of an upgrade here. </p><p>My call partners, whether I was sitting in my office seat, a train carriage, or walking down a busy street, all reported that I was clearly understandable. Little noise from my environment seemed to trouble the headphones. </p><p>On my end, things were similarly standout. My call partners all sounded good (depending on their source device, of course — the Bose did their best, but a friend's woeful headset still made it sound like he was talking to me from the other end of a massive concrete pipe), and I didn’t have any problem hearing what they had to say.</p><h3 class="article-body__section" id="section-bose-quietcomfort-ultra-headphones-2nd-generation-review-controls"><span>Bose QuietComfort Ultra Headphones 2nd Generation review: Controls</span></h3><ul><li>The power button and noise control button are fine</li><li>But the sliding volume touch thing?</li><li><em>Woeful</em></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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DotViRVTNuwAYv7AnHEkt4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/DotViRVTNuwAYv7AnHEkt4.jpg" mos="" align="middle" fullscreen="" width="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>My experience with the controls on the QuietComfort Ultra Headphones gen 2, much like that with the older model, have been a mixed bag. A mixed bag filled with nails. </p><p>While the physical controls for power and noise controls are very welcome indeed, the imprecise touch slider that Bose has placed in the right earcup is straight up <em>bad.</em></p><div><blockquote><p>While multi-pressing the ANC button changes playback (bad), the touch bar changes the volume (even worse).</p></blockquote></div><p>It’s annoying to find, for one. It’s towards the back of the headset, and not quite pronounced enough to find without activating one of its features. While multi-pressing the ANC button changes playback (bad), the touch bar changes the volume (even worse).</p><p>It has a habit of wildly shifting volume no matter what you ask of it, whether you swipe up or down. I was really hoping that this version of the headphones would take this control and cast it into the fires of headphone Mount Doom. Alas, it did not.</p><h3 class="article-body__section" id="section-bose-quietcomfort-ultra-headphones-2nd-generation-review-sound-quality"><span>Bose QuietComfort Ultra Headphones 2nd Generation review: Sound quality</span></h3><ul><li>It’s fine</li><li><em>Very bassy</em></li><li>You’ll need to play with the EQ</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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bS94XFbktjXu7G3CebuBu4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/bS94XFbktjXu7G3CebuBu4.jpg" mos="" align="middle" fullscreen="" width="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>Bose’s sound profile has generally been all about the bass, and making things sound warm and velvety. That’s no less true here with the QuietComfort Ultra Headphones 2nd gen, although there is a way to tweak them and it’s not all that tricky..</p><p>Head into the Bose App’s EQ menu, and set the treble to +2 or +3. That dials in some extra high range, allowing cymbals and other sounds to breathe a bit more. It’s not the perfect solution, but it makes them sound more listenable than they are straight out of the box.</p><p>The QuietComfort Ultra Headphones are otherwise a solid-sounding pair of headphones, especially with the Immersive Sound modes turned off. </p><p>They’re reasonably spacious in their soundstage, and there’s some lovely, rich bass here to get things rumbling. The mids provide good vocal representation, although they’re not quite as focused or dialed in as the Sony WH-1000XM6.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bV3tETaksYAft4Girzjpv4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/bV3tETaksYAft4Girzjpv4.jpg" mos="" align="middle" fullscreen="" width="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 bass, while plentiful and warm, feels one-note. As a result, detail takes a hit, as do dynamics. It’s perfect for some background listening, but not quite as good if you want to sit down and get involved with your music. If that’s what you want, then you should opt for the Sennheiser HDB 630 or the Bowers & Wilkins PX7 S3.</p><p><u></u><a href="https://open.qobuz.com/track/320910997"><u>Katatonia’s metallic melancholy </u><u><em>Wind Of No Change</em></u></a><em> </em>allows the headphones to stretch their bassy legs, although I do wish for some more dynamism in that low end. The bass guitar hits nicely, but it feels very flat. With my EQ adjustments, the cymbals can sing more, and the vocals are right in the forefront. </p><p>The distorted guitars sound great, with plenty of bite. Instrument separation is fine, but when things get busy, it can be hard to pick out the choir in the background. That’s not a struggle in the Sony WH-1000XM6.</p><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="sKhBoRzNTgesaJnDgrZLF5" name="Bose QuietComfort Ultra Headphones Gen 2.jpg" alt="Bose QuietComfort Ultra Headphones Gen 2" src="https://cdn.mos.cms.futurecdn.net/sKhBoRzNTgesaJnDgrZLF5.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: Bose)</span></figcaption></figure><p>As you might expect, the QuietComfort Ultra Headphones 2nd Gen fare a whole lot better with Pop music. XG’s <em>Gala</em> brings the glam, and the headphones are more than happy to let the bass go off. </p><p>The flatness doesn’t feel like as much of a problem here as the group's vocals layer over the top, and the chirping synths bring some extra dimension. Nothing gets lost here, and the imaging is good. They’re headphones really dialed in for the genre, it feels.</p><p><a href="https://open.qobuz.com/track/122538802">Chvrches' <em>Asking For a Friend</em></a><em> </em>feels similarly well defined in the QuietComfort Ultra, although I do miss some bass dynamism again. Mayberry’s vocals are clear and easy to listen to, and the drum beat drives with some gusto thanks to that warmer focus of the headphones. I’ve heard better — but it still sounds good.</p><ul><li><em>Listen along to the Tom's Guide Bose QuietComfort Ultra Headphones 2nd Generation testing playlist</em></li></ul><iframe allow="" height="450" width="378" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/48365474?zone=GB-en"></iframe><h3 class="article-body__section" id="section-bose-quietcomfort-ultra-headphones-2nd-generation-review-battery-life"><span>Bose QuietComfort Ultra Headphones 2nd Generation review: Battery life</span></h3><ul><li>Vast improvement over old model…</li><li>But still not class-leading</li><li>30 hours</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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xaSbcHhY2NVtuNj2emc5w4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/xaSbcHhY2NVtuNj2emc5w4.jpg" mos="" align="middle" fullscreen="" width="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 QuietComfort Ultra Headphones only featured 24 hours of battery life. You couldn’t extend that battery life either, with the headphones only featuring “on” and “transparency” modes for the noise canceling. Both drank battery life like a thirsty dog, and turning on Immersive Audio brought the staying power down to 18 hours. </p><p>We’ve got some improvement here, although it only brings them up to par with the competition rather than bettering it. According to Bose, you’ll be able to pull 30 hours of battery life out of the QuietComfort Ultra Headphones gen 2. </p><p>That’s 6 hours more than the old model, but if you’re after the most battery life possible, then you’re going to want to choose something like the <a href="https://www.tomsguide.com/audio/over-ear-headphones/sennheiser-hdb-630-review">Sennheiser HDB 630</a>. They’re about $40 more again, but they last for 60 hours. </p><h3 class="article-body__section" id="section-bose-quietcomfort-ultra-headphones-2nd-generation-review-verdict"><span>Bose QuietComfort Ultra Headphones 2nd Generation review: Verdict</span></h3><p>The Bose QuietComfort Ultra Headphones 2nd Gen are a great pair of headphones. The sound is good, they’re incredibly comfortable, and the ANC remains a spectacular example of noise-canceling technology. I can’t <em>not </em>give them 4 stars, and a recommendation. They’re good. Unfortunately, so is the competition.</p><p>Making matters trickier is that the old model, a pair you can still buy for often reduced prices, is close enough in performance and is still well worth picking up. Once the stock of the first gen has dried up, the story will be different, but we're still a few months away from that point.</p><p>The Bose QuietComfort Ultra Headphones gen 2 are a good upgrade, and they’re now the best noise-canceling headphones by the sheer fact that their ANC is better than anything available right now. </p><p>However, when Bose ditches the useless touch control thing on the right earcup, improves the sound and brings us a new design, a higher score will be in order. But as it stands, they’re a solid four-star pair of headphones in a crowded, competitive market.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Best Cyber Monday soundbar deals with Dolby Atmos: I've found 13 deals on Samsung, Bose, Sonos and more from $129 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/soundbars/best-cyber-monday-soundbar-deals-with-dolby-atmos-2025</link>
                                                                            <description>
                            <![CDATA[ I've tested 15 soundbars this year, so I've rounded up the best Cyber Monday deals on Dolby Atmos soundbars. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">8vwcGanGkoDuy953YyWe6e</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qvE2hBC3hP5azZhxHwD6gD-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Mon, 01 Dec 2025 11:02:09 +0000</pubDate>                                                                                                                                <updated>Mon, 01 Dec 2025 14:56:29 +0000</updated>
                                                                                                                                            <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.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>
                                                                                                                                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/qvE2hBC3hP5azZhxHwD6gD-1280-80.png">
                                                            <media:credit><![CDATA[JBL / Polk Audio / Samsung / Bose / Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a composite image of jbl, polk audio, bose, and samsung soundbars with a cyber monday badge]]></media:description>                                                            <media:text><![CDATA[a composite image of jbl, polk audio, bose, and samsung soundbars with a cyber monday badge]]></media:text>
                                <media:title type="plain"><![CDATA[a composite image of jbl, polk audio, bose, and samsung soundbars with a cyber monday badge]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qvE2hBC3hP5azZhxHwD6gD-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Cyber Monday is officially here, and it's brought some awesome soundbar deals along with it. The <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbars</a> with Dolby Atmos are expensive, so it's even more important to grab them when they're discounted. </p><p>I've tested 15 soundbars this year, ranging from $1,700 JBL setups to $67 uber-budget TV speaker replacements, and I've rounded up the 11 best Cyber Monday soundbar deals for your viewing pleasure. All of these soundbars have Dolby Atmos (except one, which has fake-but-still-good DTS:VirtualX), so let me help you find the cheapest way to transform your living room into a movie theater. </p><p>My top recommendation is the <a href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" target="_blank" rel="nofollow">Bose Smart Soundbar for just $399 at Amazon</a>. This is my personal soundbar and a great option for the soundbar that can do it all — movies, TV, and music. Or, if you want to save as much as possible, I recommend the unbelievably good value Insignia 5.1.2 Soundbar  — you get rear speakers, a subwoofer, and the soundbar itself for just <a href="https://www.bestbuy.com/product/insignia-5-1-2-channel-home-theater-soundbar-with-wireless-subwoofer-and-rear-speakers-dolby-atmos-dtsx-bluetooth-black/J2FPJK9L43" target="_blank" rel="nofollow"><strong>$129 at Best Buy</strong></a>. If we were in a cartoon, my head would have exploded when I found that deal. A full surround system for $129 is incomprehensibly cheap. </p><p>But there are more soundbar deals where that came from. Read on to see my favorites.</p><h2 class="article-body__section" id="section-soundbar-deals-quick-links"><span>Soundbar deals: Quick links</span></h2><ul><li><strong>Insignia 5.1.2 Soundbar: </strong><a href="https://www.bestbuy.com/product/insignia-5-1-2-channel-home-theater-soundbar-with-wireless-subwoofer-and-rear-speakers-dolby-atmos-dtsx-bluetooth-black/J2FPJK9L43" target="_blank" rel="nofollow"><strong>was $229 now $129 @ Best Buy</strong></a></li><li><strong>Amazon Fire TV Soundbar: </strong><a href="https://www.amazon.com/dp/B0CXZTT4MT/" target="_blank" rel="nofollow"><strong>was $249 now $149 @ Amazon</strong></a></li><li><strong>Samsung HW-B650: </strong><a href="https://www.bestbuy.com/product/samsung-hw-b650-za-3-1-channel-soundbar-with-wireless-subwoofer-dolby-5-1-dts-virtualx-black/J3ZYG2XWJJ/sku/6505155" target="_blank" rel="nofollow"><strong>was $399 now $199 @ Best Buy</strong></a><strong></strong></li><li><strong>Polk Audio Signa S4: </strong><a href="https://www.amazon.com/Polk-Audio-Signa-S4-Ultra-Slim/dp/B09J753M18" target="_blank" rel="nofollow"><strong>was $449 now $359 @ Amazon</strong></a></li><li><strong>JBL Bar 500: </strong><a href="https://www.bestbuy.com/product/jbl-bar-500-5-1ch-soundbar-with-multibeam-and-dolby-atmos-black/J7LXFW2ZYW" target="_blank" rel="nofollow"><strong>was $649 now $399 @ Best Buy</strong></a></li><li><strong>Bose Smart Soundbar 2024: </strong><a href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" target="_blank" rel="nofollow"><strong>was $499 now $399 @ Amazon</strong></a><strong></strong></li><li><strong>Samsung Q600F: </strong><a href="https://www.bestbuy.com/product/samsung-q-series-hw-q600f-atmos-3-1-2-ch-soundbar-with-subwoofer-titan-black/J3ZYG2FV7Z/sku/6619392" target="_blank" rel="nofollow"><strong>was $699 now $499 @ Best Buy</strong></a><strong></strong></li><li><strong>Bose Smart Soundbar Ultra: </strong><a href="https://www.amazon.com/Bose-Soundbar-Wireless-Bluetooth-Surround/dp/B0C548MYF3" target="_blank" rel="nofollow"><strong>was $899 now $699 @ Amazon</strong></a><strong> </strong></li><li><strong>Sonos Arc Ultra: </strong><a href="https://www.bestbuy.com/product/sonos-arc-ultra-soundbar-black/J39H373F2S" target="_blank" rel="nofollow"><strong>was $1,099 now $879 @ Best Buy</strong></a><strong></strong></li><li><strong>Samsung Q990D: </strong><a href="https://www.bestbuy.com/product/samsung-hw-q990d-za-11-1-4-channel-q-series-soundbar-with-wireless-subwoofer-and-rear-speakers-dolby-atmos-and-q-symphony-black/J3ZYG2H93V" target="_blank" rel="nofollow"><strong>was $1,999 now $999 @ Best Buy</strong></a><strong> </strong></li><li><strong>JBL Bar 1300 MK2: </strong><a href="https://www.bestbuy.com/product/jbl-bar1300mk2-11-1-4-channel-soundbar-system-with-detachable-surround-speakers-and-dolby-atmos-and-dtsx-black/J7LXFW36KK" target="_blank" rel="nofollow"><strong>was $1,699 now $1,99 @ Best Buy</strong></a></li></ul><h2 class="article-body__section" id="section-best-cyber-monday-deals-on-dolby-atmos-soundbars"><span>Best Cyber Monday deals on Dolby Atmos soundbars</span></h2><div class="product"><a data-dimension112="5c1fd3f5-cdea-4ea7-9d6e-162672556af6" data-action="Deal Block" data-label="Considering you get two rears and a subwoofer, $149 for the Insignia 5.1.2 Soundbar feels illegal. With both Dolby Atmos and DTS:VirtualX, this soundbar is one of the cheapest ways to get immersive audio for movie nights. Of course, this budget speaker doesn't have the clarity of a pricier model, but for $149, can you really complain?" data-dimension48="Considering you get two rears and a subwoofer, $149 for the Insignia 5.1.2 Soundbar feels illegal. With both Dolby Atmos and DTS:VirtualX, this soundbar is one of the cheapest ways to get immersive audio for movie nights. Of course, this budget speaker doesn't have the clarity of a pricier model, but for $149, can you really complain?" data-dimension25="$129" href="https://www.bestbuy.com/product/insignia-5-1-2-channel-home-theater-soundbar-with-wireless-subwoofer-and-rear-speakers-dolby-atmos-dtsx-bluetooth-black/J2FPJK9L43" 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="86AXKaTYMPe2ctMhBvzvuB" name="insignia 5.1.2 soundbar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/86AXKaTYMPe2ctMhBvzvuB.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Considering you get two rears and a subwoofer, $149 for the Insignia 5.1.2 Soundbar feels illegal. With both Dolby Atmos and DTS:VirtualX, this soundbar is one of the cheapest ways to get immersive audio for movie nights. Of course, this budget speaker doesn't have the clarity of a pricier model, but for $149, can you really complain? <a class="view-deal button" href="https://www.bestbuy.com/product/insignia-5-1-2-channel-home-theater-soundbar-with-wireless-subwoofer-and-rear-speakers-dolby-atmos-dtsx-bluetooth-black/J2FPJK9L43" target="_blank" rel="nofollow" data-dimension112="5c1fd3f5-cdea-4ea7-9d6e-162672556af6" data-action="Deal Block" data-label="Considering you get two rears and a subwoofer, $149 for the Insignia 5.1.2 Soundbar feels illegal. With both Dolby Atmos and DTS:VirtualX, this soundbar is one of the cheapest ways to get immersive audio for movie nights. Of course, this budget speaker doesn't have the clarity of a pricier model, but for $149, can you really complain?" data-dimension48="Considering you get two rears and a subwoofer, $149 for the Insignia 5.1.2 Soundbar feels illegal. With both Dolby Atmos and DTS:VirtualX, this soundbar is one of the cheapest ways to get immersive audio for movie nights. Of course, this budget speaker doesn't have the clarity of a pricier model, but for $149, can you really complain?" data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="5d5e76af-288d-455d-90f3-a4bc02c4e2fb" data-action="Deal Block" data-label="If you're on a super low budget but you still want to upgrade from your TV speakers, why not check out the Amazon Fire TV Soundbar? This compact soundbar has a built-in subwoofer and Dolby Atmos and DTS:VirtualX for immersive 360° audio in your movies." data-dimension48="If you're on a super low budget but you still want to upgrade from your TV speakers, why not check out the Amazon Fire TV Soundbar? This compact soundbar has a built-in subwoofer and Dolby Atmos and DTS:VirtualX for immersive 360° audio in your movies." data-dimension25="$149" href="https://www.amazon.com/dp/B0CXZTT4MT/" 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="94QLtog4vScXz4kkgXLWyi" name="Amazon fire TV soundbar.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/94QLtog4vScXz4kkgXLWyi.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're on a super low budget but you still want to upgrade from your TV speakers, why not check out the Amazon Fire TV Soundbar? This compact soundbar has a built-in subwoofer and Dolby Atmos and DTS:VirtualX for immersive 360° audio in your movies. <a class="view-deal button" href="https://www.amazon.com/dp/B0CXZTT4MT/" target="_blank" rel="nofollow" data-dimension112="5d5e76af-288d-455d-90f3-a4bc02c4e2fb" data-action="Deal Block" data-label="If you're on a super low budget but you still want to upgrade from your TV speakers, why not check out the Amazon Fire TV Soundbar? This compact soundbar has a built-in subwoofer and Dolby Atmos and DTS:VirtualX for immersive 360° audio in your movies." data-dimension48="If you're on a super low budget but you still want to upgrade from your TV speakers, why not check out the Amazon Fire TV Soundbar? This compact soundbar has a built-in subwoofer and Dolby Atmos and DTS:VirtualX for immersive 360° audio in your movies." data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="cd4fc1ce-ee97-4341-ae3c-46899e5a114b" data-action="Deal Block" data-label="Save an incredible $200 off this great deal. This soundbar comes with a center speaker for clear dialogue and powerful bass, thanks to its subwoofer and Boost mode — perfect for movie nights. Just note that it doesn't have Dolby Atmos, but it has DTS:VirtualX, which upscales audio signals into fake-but-still-noticeable 360° sound. At just $199, this is one to snap up." data-dimension48="Save an incredible $200 off this great deal. This soundbar comes with a center speaker for clear dialogue and powerful bass, thanks to its subwoofer and Boost mode — perfect for movie nights. Just note that it doesn't have Dolby Atmos, but it has DTS:VirtualX, which upscales audio signals into fake-but-still-noticeable 360° sound. At just $199, this is one to snap up." data-dimension25="$199" href="https://www.bestbuy.com/product/samsung-hw-b650-za-3-1-channel-soundbar-with-wireless-subwoofer-dolby-5-1-dts-virtualx-black/J3ZYG2XWJJ/sku/6505155" 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.22%;"><img id="s8mLEeRJcW97rtnQCEGVKh" name="Samsung Soundbar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/s8mLEeRJcW97rtnQCEGVKh.jpg" mos="" align="middle" fullscreen="" width="900" height="542" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Save an incredible $200 off this great deal. This soundbar comes with a center speaker for clear dialogue and powerful bass, thanks to its subwoofer and Boost mode — perfect for movie nights. Just note that it doesn't have Dolby Atmos, but it has DTS:VirtualX, which upscales audio signals into fake-but-still-noticeable 360° sound. At just $199, this is one to snap up. <a class="view-deal button" href="https://www.bestbuy.com/product/samsung-hw-b650-za-3-1-channel-soundbar-with-wireless-subwoofer-dolby-5-1-dts-virtualx-black/J3ZYG2XWJJ/sku/6505155" target="_blank" rel="nofollow" data-dimension112="cd4fc1ce-ee97-4341-ae3c-46899e5a114b" data-action="Deal Block" data-label="Save an incredible $200 off this great deal. This soundbar comes with a center speaker for clear dialogue and powerful bass, thanks to its subwoofer and Boost mode — perfect for movie nights. Just note that it doesn't have Dolby Atmos, but it has DTS:VirtualX, which upscales audio signals into fake-but-still-noticeable 360° sound. At just $199, this is one to snap up." data-dimension48="Save an incredible $200 off this great deal. This soundbar comes with a center speaker for clear dialogue and powerful bass, thanks to its subwoofer and Boost mode — perfect for movie nights. Just note that it doesn't have Dolby Atmos, but it has DTS:VirtualX, which upscales audio signals into fake-but-still-noticeable 360° sound. At just $199, this is one to snap up." data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="7038a291-1964-4599-a322-50dce775cc75" data-action="Deal Block" data-label="The Polk Audio Signa S4 is my go-to recommendation for Dolby Atmos sound on a budget. This soundbar has a fantastic 3.1.2 channel configuration with a wireless subwoofer for extra floor-shaking bass. This soundbar is $90 off right now, making it a steal." data-dimension48="The Polk Audio Signa S4 is my go-to recommendation for Dolby Atmos sound on a budget. This soundbar has a fantastic 3.1.2 channel configuration with a wireless subwoofer for extra floor-shaking bass. This soundbar is $90 off right now, making it a steal." data-dimension25="$359" href="https://www.amazon.com/Polk-Audio-Signa-S4-Ultra-Slim/dp/B09J753M18" 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:120.00%;"><img id="MQA2fDw3TZNB6m5sYLUUcQ" name="Polk Signa S4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/MQA2fDw3TZNB6m5sYLUUcQ.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Polk Audio Signa S4 is my go-to recommendation for Dolby Atmos sound on a budget. This soundbar has a fantastic 3.1.2 channel configuration with a wireless subwoofer for extra floor-shaking bass. This soundbar is $90 off right now, making it a steal. <a class="view-deal button" href="https://www.amazon.com/Polk-Audio-Signa-S4-Ultra-Slim/dp/B09J753M18" target="_blank" rel="nofollow" data-dimension112="7038a291-1964-4599-a322-50dce775cc75" data-action="Deal Block" data-label="The Polk Audio Signa S4 is my go-to recommendation for Dolby Atmos sound on a budget. This soundbar has a fantastic 3.1.2 channel configuration with a wireless subwoofer for extra floor-shaking bass. This soundbar is $90 off right now, making it a steal." data-dimension48="The Polk Audio Signa S4 is my go-to recommendation for Dolby Atmos sound on a budget. This soundbar has a fantastic 3.1.2 channel configuration with a wireless subwoofer for extra floor-shaking bass. This soundbar is $90 off right now, making it a steal." data-dimension25="$359">View Deal</a></p></div><div class="product"><a data-dimension112="ed02485f-835a-44cd-87b9-c3ad500b7ddb" data-action="Deal Block" data-label="This JBL system comes with a 5.1-Channel soundbar with MultiBeam, to transform your movies, music, and games into 3D surround sound. This also comes with a 10" wireless subwoofer for ground-shaking bass. With a saving of $250, this is a great deal." data-dimension48="This JBL system comes with a 5.1-Channel soundbar with MultiBeam, to transform your movies, music, and games into 3D surround sound. This also comes with a 10" wireless subwoofer for ground-shaking bass. With a saving of $250, this is a great deal." data-dimension25="$399" href="https://www.bestbuy.com/product/jbl-bar-500-5-1ch-soundbar-with-multibeam-and-dolby-atmos-black/J7LXFW2ZYW" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1395px;"><p class="vanilla-image-block" style="padding-top:92.76%;"><img id="tTkXag4bwZyxWoVBE5XaAb" name="JBL Bar 500 5.1Channel soundbar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tTkXag4bwZyxWoVBE5XaAb.jpg" mos="" align="middle" fullscreen="" width="1395" height="1294" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This JBL system comes with a 5.1-Channel soundbar with MultiBeam, to transform your movies, music, and games into 3D surround sound. This also comes with a 10" wireless subwoofer for ground-shaking bass. With a saving of $250, this is a great deal. <a class="view-deal button" href="https://www.bestbuy.com/product/jbl-bar-500-5-1ch-soundbar-with-multibeam-and-dolby-atmos-black/J7LXFW2ZYW" target="_blank" rel="nofollow" data-dimension112="ed02485f-835a-44cd-87b9-c3ad500b7ddb" data-action="Deal Block" data-label="This JBL system comes with a 5.1-Channel soundbar with MultiBeam, to transform your movies, music, and games into 3D surround sound. This also comes with a 10" wireless subwoofer for ground-shaking bass. With a saving of $250, this is a great deal." data-dimension48="This JBL system comes with a 5.1-Channel soundbar with MultiBeam, to transform your movies, music, and games into 3D surround sound. This also comes with a 10" wireless subwoofer for ground-shaking bass. With a saving of $250, this is a great deal." data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="6cdf94ed-e864-42ba-b404-17d43ec2276e" data-action="Deal Block" data-label="Bose's Sub 700" data-dimension48="Bose's Sub 700" data-dimension25="$399" href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J/" 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:120.00%;"><img id="rJbLARrb3giTtDi2jTiuGE" name="Bose Smart Soundbar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rJbLARrb3giTtDi2jTiuGE.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose Smart Soundbar is a great beginner soundbar. With a 3.0.2 channel setup, it has great surround sound, even in shows and movies you least expect it. The soundbar can even upcode non-Atmos content into "fake" suround sound. The dialogue is crisp thanks to Bose's AI dialogue mode, and the bass is surprisingly great when listening to music via AirPlay. Although it's not as room-filling as pricier alternatives, it's a fantastic option. You can even add <a href="https://www.amazon.com/Bose-Bass-Module-700-Black/dp/B07F39ZRCQ" target="_blank" rel="nofollow" data-dimension112="6cdf94ed-e864-42ba-b404-17d43ec2276e" data-action="Deal Block" data-label="Bose's Sub 700" data-dimension48="Bose's Sub 700" data-dimension25="$399">Bose's Sub 700</a> ($899) as an extra. <a class="view-deal button" href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J/" target="_blank" rel="nofollow" data-dimension112="6cdf94ed-e864-42ba-b404-17d43ec2276e" data-action="Deal Block" data-label="Bose's Sub 700" data-dimension48="Bose's Sub 700" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="589a1e72-5c11-4740-9e13-c41d4f4d409d" data-action="Deal Block" data-label="The Sony Bravia Bar 6 has an incredible $200 off right now, making it one of the best-value soundbar + subwoofer combos out there. You get a 3.1.2 channel configuration, meaning there's a subwoofer and two side-firing speakers for Dolby Atmos or DTS:VirtualX content. You can also stream music over Wi-Fi!" data-dimension48="The Sony Bravia Bar 6 has an incredible $200 off right now, making it one of the best-value soundbar + subwoofer combos out there. You get a 3.1.2 channel configuration, meaning there's a subwoofer and two side-firing speakers for Dolby Atmos or DTS:VirtualX content. You can also stream music over Wi-Fi!" data-dimension25="$498" href="https://www.amazon.com/gp/aw/d/B0DYWPJYF1?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:38.60%;"><img id="KnxTKeVURhKAjdQ8o5tZ3Q" name="BRAVIA Theater Bar 6" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KnxTKeVURhKAjdQ8o5tZ3Q.png" mos="" align="middle" fullscreen="" width="1500" height="579" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Sony Bravia Bar 6 has an incredible $200 off right now, making it one of the best-value soundbar + subwoofer combos out there. You get a 3.1.2 channel configuration, meaning there's a subwoofer and two side-firing speakers for Dolby Atmos or DTS:VirtualX content. You can also stream music over Wi-Fi! <a class="view-deal button" href="https://www.amazon.com/gp/aw/d/B0DYWPJYF1?th=1" target="_blank" rel="nofollow" data-dimension112="589a1e72-5c11-4740-9e13-c41d4f4d409d" data-action="Deal Block" data-label="The Sony Bravia Bar 6 has an incredible $200 off right now, making it one of the best-value soundbar + subwoofer combos out there. You get a 3.1.2 channel configuration, meaning there's a subwoofer and two side-firing speakers for Dolby Atmos or DTS:VirtualX content. You can also stream music over Wi-Fi!" data-dimension48="The Sony Bravia Bar 6 has an incredible $200 off right now, making it one of the best-value soundbar + subwoofer combos out there. You get a 3.1.2 channel configuration, meaning there's a subwoofer and two side-firing speakers for Dolby Atmos or DTS:VirtualX content. You can also stream music over Wi-Fi!" data-dimension25="$498">View Deal</a></p></div><div class="product"><a data-dimension112="551e15f9-caa7-4c7d-a070-239f918830c1" data-action="Deal Block" data-label="This is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it." data-dimension48="This is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it." data-dimension25="$499" href="https://www.bestbuy.com/product/samsung-q-series-hw-q600f-atmos-3-1-2-ch-soundbar-with-subwoofer-titan-black/J3ZYG2FV7Z/sku/6619392" 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:120.00%;"><img id="ExfR2TSGT2maYw6G6JSFS5" name="Samsung Q600F" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ExfR2TSGT2maYw6G6JSFS5.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it. <a class="view-deal button" href="https://www.bestbuy.com/product/samsung-q-series-hw-q600f-atmos-3-1-2-ch-soundbar-with-subwoofer-titan-black/J3ZYG2FV7Z/sku/6619392" target="_blank" rel="nofollow" data-dimension112="551e15f9-caa7-4c7d-a070-239f918830c1" data-action="Deal Block" data-label="This is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it." data-dimension48="This is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it." data-dimension25="$499">View Deal</a></p></div><div class="product"><a data-dimension112="e6775ba4-c8be-4b91-b2f2-8e1ebcb3c979" data-action="Deal Block" data-label="The Samsung Q800F is a fantastic soundbar for movie-theater sound at home. As this is a more premium version of the Q600F above, the Q800F has the same crisp dialogue, clear mids, and rumbling bass, but with added smart home tech." data-dimension48="The Samsung Q800F is a fantastic soundbar for movie-theater sound at home. As this is a more premium version of the Q600F above, the Q800F has the same crisp dialogue, clear mids, and rumbling bass, but with added smart home tech." data-dimension25="$549" href="https://www.amazon.com/Samsung-Subwoofer-Q-Symphony-Integration-HW-Q800F/dp/B0DY1XXYT7" 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="WfrM5b5LrUNyToUpRnoZ6c" name="samsung q800f" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WfrM5b5LrUNyToUpRnoZ6c.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Samsung Q800F is a fantastic soundbar for movie-theater sound at home. As this is a more premium version of the Q600F above, the Q800F has the same crisp dialogue, clear mids, and rumbling bass, but with added smart home tech. <a class="view-deal button" href="https://www.amazon.com/Samsung-Subwoofer-Q-Symphony-Integration-HW-Q800F/dp/B0DY1XXYT7" target="_blank" rel="nofollow" data-dimension112="e6775ba4-c8be-4b91-b2f2-8e1ebcb3c979" data-action="Deal Block" data-label="The Samsung Q800F is a fantastic soundbar for movie-theater sound at home. As this is a more premium version of the Q600F above, the Q800F has the same crisp dialogue, clear mids, and rumbling bass, but with added smart home tech." data-dimension48="The Samsung Q800F is a fantastic soundbar for movie-theater sound at home. As this is a more premium version of the Q600F above, the Q800F has the same crisp dialogue, clear mids, and rumbling bass, but with added smart home tech." data-dimension25="$549">View Deal</a></p></div><div class="product"><a data-dimension112="9f2d32af-9f61-49e8-ba90-86a3c678df61" data-action="Deal Block" data-label="The Bose Smart Ultra Soundbar is a step-up from the $399 Bose Smart Soundbar. This option is for customers who want a bit more pizzazz to their home cinema and don't mind spending extra. The Smart Ultra boasts a 5.1.2 channel system with added bass. It also has the fantastic AI dialogue mode and smart home features like wireless control and AirPlay. As with the Smart Soundbar, it's compatible with Bose's Subs, too, for even heavier bass." data-dimension48="The Bose Smart Ultra Soundbar is a step-up from the $399 Bose Smart Soundbar. This option is for customers who want a bit more pizzazz to their home cinema and don't mind spending extra. The Smart Ultra boasts a 5.1.2 channel system with added bass. It also has the fantastic AI dialogue mode and smart home features like wireless control and AirPlay. As with the Smart Soundbar, it's compatible with Bose's Subs, too, for even heavier bass." data-dimension25="$699" href="https://www.amazon.com/Bose-Soundbar-Wireless-Bluetooth-Surround/dp/B0C548MYF3" 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="dLLYXWpy2mJsCzXj262Tq6" name="bose smart soundbar ultra" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dLLYXWpy2mJsCzXj262Tq6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose Smart Ultra Soundbar is a step-up from the $399 Bose Smart Soundbar. This option is for customers who want a bit more pizzazz to their home cinema and don't mind spending extra. The Smart Ultra boasts a 5.1.2 channel system with added bass. It also has the fantastic AI dialogue mode and smart home features like wireless control and AirPlay. As with the Smart Soundbar, it's compatible with Bose's Subs, too, for even heavier bass. <a class="view-deal button" href="https://www.amazon.com/Bose-Soundbar-Wireless-Bluetooth-Surround/dp/B0C548MYF3" target="_blank" rel="nofollow" data-dimension112="9f2d32af-9f61-49e8-ba90-86a3c678df61" data-action="Deal Block" data-label="The Bose Smart Ultra Soundbar is a step-up from the $399 Bose Smart Soundbar. This option is for customers who want a bit more pizzazz to their home cinema and don't mind spending extra. The Smart Ultra boasts a 5.1.2 channel system with added bass. It also has the fantastic AI dialogue mode and smart home features like wireless control and AirPlay. As with the Smart Soundbar, it's compatible with Bose's Subs, too, for even heavier bass." data-dimension48="The Bose Smart Ultra Soundbar is a step-up from the $399 Bose Smart Soundbar. This option is for customers who want a bit more pizzazz to their home cinema and don't mind spending extra. The Smart Ultra boasts a 5.1.2 channel system with added bass. It also has the fantastic AI dialogue mode and smart home features like wireless control and AirPlay. As with the Smart Soundbar, it's compatible with Bose's Subs, too, for even heavier bass." data-dimension25="$699">View Deal</a></p></div><div class="product"><a data-dimension112="0d5e56d9-6ba7-4d88-a073-35efc26cc37a" data-action="Deal Block" data-label="The Sonos Arc Ultra is the champion of soundbars for a reason. With unbeatable immersive sound that genuinely feels like it's coming from all around you and the iconic Sonos aesthetics, this is the perfect soundbar for those who want the best of the best and are happy to invest in their home cinema setup. Of course, the Sonos Arc Ultra is buildable with Sonos subs and rears, so you can continue to add to your cinema room as you go." data-dimension48="The Sonos Arc Ultra is the champion of soundbars for a reason. With unbeatable immersive sound that genuinely feels like it's coming from all around you and the iconic Sonos aesthetics, this is the perfect soundbar for those who want the best of the best and are happy to invest in their home cinema setup. Of course, the Sonos Arc Ultra is buildable with Sonos subs and rears, so you can continue to add to your cinema room as you go." data-dimension25="$879" href="https://www.bestbuy.com/product/sonos-arc-ultra-soundbar-black/J39H373F2S" 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:120.00%;"><img id="6G59Y4BtSpscX3WCZEnsj5" name="Sonos Arc Ultra" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6G59Y4BtSpscX3WCZEnsj5.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Sonos Arc Ultra is the champion of soundbars for a reason. With unbeatable immersive sound that genuinely feels like it's coming from all around you and the iconic Sonos aesthetics, this is the perfect soundbar for those who want the best of the best and are happy to invest in their home cinema setup. Of course, the Sonos Arc Ultra is buildable with Sonos subs and rears, so you can continue to add to your cinema room as you go. <a class="view-deal button" href="https://www.bestbuy.com/product/sonos-arc-ultra-soundbar-black/J39H373F2S" target="_blank" rel="nofollow" data-dimension112="0d5e56d9-6ba7-4d88-a073-35efc26cc37a" data-action="Deal Block" data-label="The Sonos Arc Ultra is the champion of soundbars for a reason. With unbeatable immersive sound that genuinely feels like it's coming from all around you and the iconic Sonos aesthetics, this is the perfect soundbar for those who want the best of the best and are happy to invest in their home cinema setup. Of course, the Sonos Arc Ultra is buildable with Sonos subs and rears, so you can continue to add to your cinema room as you go." data-dimension48="The Sonos Arc Ultra is the champion of soundbars for a reason. With unbeatable immersive sound that genuinely feels like it's coming from all around you and the iconic Sonos aesthetics, this is the perfect soundbar for those who want the best of the best and are happy to invest in their home cinema setup. Of course, the Sonos Arc Ultra is buildable with Sonos subs and rears, so you can continue to add to your cinema room as you go." data-dimension25="$879">View Deal</a></p></div><div class="product"><a data-dimension112="7590fe4b-edb7-47bf-ac7c-4da59c03021f" data-action="Deal Block" data-label="With a huge 11.1.4 channel arrangement, the Samsung Q990D is the best of the best. If you want a serious movie-theater-quality soundbar system, it's got to be the Q990D. This soundbar has a subwoofer and two rear speakers, meaning you get true Dolby Atmos. As with other 'Q' series Samsung soundbars, you also get access to premium AI-powered room calibration so your speakers adapt to your surroundings — not the other way around." data-dimension48="With a huge 11.1.4 channel arrangement, the Samsung Q990D is the best of the best. If you want a serious movie-theater-quality soundbar system, it's got to be the Q990D. This soundbar has a subwoofer and two rear speakers, meaning you get true Dolby Atmos. As with other 'Q' series Samsung soundbars, you also get access to premium AI-powered room calibration so your speakers adapt to your surroundings — not the other way around." data-dimension25="$999" href="https://www.bestbuy.com/product/samsung-hw-q990d-za-11-1-4-channel-q-series-soundbar-with-wireless-subwoofer-and-rear-speakers-dolby-atmos-and-q-symphony-black/J3ZYG2H93V" 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:120.00%;"><img id="qu867jreWrkXCd74uJZaHZ" name="Samsung HW-Q990D" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qu867jreWrkXCd74uJZaHZ.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With a huge 11.1.4 channel arrangement, the Samsung Q990D is the best of the best. If you want a serious movie-theater-quality soundbar system, it's got to be the Q990D. This soundbar has a subwoofer and two rear speakers, meaning you get <em>true</em> Dolby Atmos. As with other 'Q' series Samsung soundbars, you also get access to premium AI-powered room calibration so your speakers adapt to your surroundings — not the other way around. <a class="view-deal button" href="https://www.bestbuy.com/product/samsung-hw-q990d-za-11-1-4-channel-q-series-soundbar-with-wireless-subwoofer-and-rear-speakers-dolby-atmos-and-q-symphony-black/J3ZYG2H93V" target="_blank" rel="nofollow" data-dimension112="7590fe4b-edb7-47bf-ac7c-4da59c03021f" data-action="Deal Block" data-label="With a huge 11.1.4 channel arrangement, the Samsung Q990D is the best of the best. If you want a serious movie-theater-quality soundbar system, it's got to be the Q990D. This soundbar has a subwoofer and two rear speakers, meaning you get true Dolby Atmos. As with other 'Q' series Samsung soundbars, you also get access to premium AI-powered room calibration so your speakers adapt to your surroundings — not the other way around." data-dimension48="With a huge 11.1.4 channel arrangement, the Samsung Q990D is the best of the best. If you want a serious movie-theater-quality soundbar system, it's got to be the Q990D. This soundbar has a subwoofer and two rear speakers, meaning you get true Dolby Atmos. As with other 'Q' series Samsung soundbars, you also get access to premium AI-powered room calibration so your speakers adapt to your surroundings — not the other way around." data-dimension25="$999">View Deal</a></p></div><div class="product"><a data-dimension112="288ca9bf-efac-4c64-9aea-ee3344fb85b1" data-action="Deal Block" data-label="I tested the JBL Bar 1300 and fell in love. I have never experienced infatuation like it. With an unparalleled 11.1.4. channel configuration, crystal-clear dialogue, wireless rears, and fantastic automatic room calibration, the JBL Bar 1300 is the soundbar for serious home theater nerds. This model is brand-new, so you know it's got all the latest tech." data-dimension48="I tested the JBL Bar 1300 and fell in love. I have never experienced infatuation like it. With an unparalleled 11.1.4. channel configuration, crystal-clear dialogue, wireless rears, and fantastic automatic room calibration, the JBL Bar 1300 is the soundbar for serious home theater nerds. This model is brand-new, so you know it's got all the latest tech." data-dimension25="$1199" href="https://www.bestbuy.com/product/jbl-bar1300mk2-11-1-4-channel-soundbar-system-with-detachable-surround-speakers-and-dolby-atmos-and-dtsx-black/J7LXFW36KK" 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.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>I tested the JBL Bar 1300 and fell in <em>love</em>. I have never experienced infatuation like it. With an unparalleled 11.1.4. channel configuration, crystal-clear dialogue, wireless rears, and fantastic automatic room calibration, the JBL Bar 1300 is the soundbar for serious home theater nerds. This model is brand-new, so you know it's got all the latest tech. <a class="view-deal button" href="https://www.bestbuy.com/product/jbl-bar1300mk2-11-1-4-channel-soundbar-system-with-detachable-surround-speakers-and-dolby-atmos-and-dtsx-black/J7LXFW36KK" target="_blank" rel="nofollow" data-dimension112="288ca9bf-efac-4c64-9aea-ee3344fb85b1" data-action="Deal Block" data-label="I tested the JBL Bar 1300 and fell in love. I have never experienced infatuation like it. With an unparalleled 11.1.4. channel configuration, crystal-clear dialogue, wireless rears, and fantastic automatic room calibration, the JBL Bar 1300 is the soundbar for serious home theater nerds. This model is brand-new, so you know it's got all the latest tech." data-dimension48="I tested the JBL Bar 1300 and fell in love. I have never experienced infatuation like it. With an unparalleled 11.1.4. channel configuration, crystal-clear dialogue, wireless rears, and fantastic automatic room calibration, the JBL Bar 1300 is the soundbar for serious home theater nerds. This model is brand-new, so you know it's got all the latest tech." data-dimension25="$1199">View Deal</a></p></div><p><em>For more discounts, check out our </em><a href="https://www.tomsguide.com/live/news/cyber-monday-deals-live-2025-from-three-dollars" target="_blank"><em>Cyber Monday deals live blog</em></a><em>.</em></p><h3 class="article-body__section" id="section-shop-today-s-best-cyber-monday-deals"><span>Shop today's best Cyber Monday deals</span></h3><ul><li><strong>Amazon: </strong><a href="https://www.amazon.com/b?node=210998206011" target="_blank" rel="nofollow"><strong>50% off Ring, Ninja, AirPods and more</strong></a><strong></strong></li><li><strong>Walmart Plus: </strong><a href="https://www.walmart.com/plus" target="_blank" rel="nofollow"><strong>50% off @ Walmart</strong></a></li><li><strong>REI: </strong><a href="https://www.rei.com/f/scd-deals" target="_blank" rel="nofollow"><strong>half-off Arc'teryx, Patagonia, more</strong></a><strong></strong></li><li><strong>Dell: </strong><a href="https://www.dell.com/en-us/shop/deals?sortBy=price-ascending" target="_blank" rel="nofollow"><strong>monitors from $69, laptops from $299</strong></a><strong></strong></li><li><strong>Nectar: </strong><a href="https://www.nectarsleep.com/" target="_blank" rel="nofollow"><strong>50% off mattresses + bundles</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/all-electronics-on-sale/all-computers-tablets-on-sale/pcmcat1632941704767.c?id=pcmcat1632941704767" target="_blank" rel="nofollow"><strong>laptops from $149</strong></a><strong></strong></li><li><strong>Lenovo: </strong><a href="https://www.lenovo.com/us/en/d/deals/laptops/?IPromoID=LEN380027&sortBy=priceUp" target="_blank" rel="nofollow"><strong>doorbuster deals from $319</strong></a><strong></strong></li><li><strong>Wayfair: </strong><a href="https://www.wayfair.com/daily-sales" target="_blank" rel="nofollow"><strong>up to 80% off home decor</strong></a><strong></strong></li><li><strong>Lululemon: </strong><a href="https://shop.lululemon.com/c/we-made-too-much/n18mhd?Ns=price%7C0" target="_blank" rel="nofollow"><strong>top picks from $9</strong></a><strong></strong></li><li><strong>Newegg: </strong><a href="https://www.newegg.com/Black-November-Early-Access/EventSaleStore/ID-1132" target="_blank" rel="nofollow"><strong>Doorbuster deals from $6</strong></a></li><li><strong>Walmart: </strong><a href="https://www.walmart.com/cp/gifts/3131907" target="_blank" rel="nofollow"><strong>holiday gifts from $15</strong></a></li><li><strong>Birkenstock: </strong><a href="https://www.nordstrom.com/browse/sale?sort=PercentOff&filterByBrand=birkenstock" target="_blank" rel="nofollow"><strong>deals from $20 @ Nordstrom</strong></a><strong></strong></li><li><strong>Saatva: </strong><a href="https://www.saatva.com/mattresses/saatva-classic?utm_source=futurepublishing&utm_medium=affiliate&coupon=awyqqgzvxqicebab" target="_blank" rel="nofollow"><strong>luxury mattresses from $1,099</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ These are the best Bluetooth speaker deals this Black Friday — and they start at just $27 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/bluetooth-speakers/these-are-the-best-bluetooth-speaker-deals-this-black-friday-and-they-start-from-just-usd27</link>
                                                                            <description>
                            <![CDATA[ I’ve found the best Bluetooth speaker deals on Amazon this Black Friday, and there are offerings from just $27. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">pmEwgvsqruWSzJA2tCkB3X</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jXRVpga6RUovayhZZ9agvJ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 27 Nov 2025 14:56:06 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Bluetooth Speakers]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Speakers]]></category>
                                                                                                <author><![CDATA[ ashley.thieme@futurenet.com (Ashley Thieme) ]]></author>                    <dc:creator><![CDATA[ Ashley Thieme ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3AWovHjApwuNrSGRS6WBcL.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Ashley Thieme is a staff writer on the Reviews team at Tom’s Guide where she tests out the latest tech so you can know what’s going to be worth your time and money.She has a master’s degree in Magazine Journalism and a bachelor’s degree in Journalism, Media and Sociology from Cardiff University. She has bylines in titles including Women’s Health UK online, sharing the latest health and wellness news stories, and Virgin Radio UK, providing the latest entertainment news and working on celebrity interviews.She has experience reporting on a variety of topics including music, literature, motorsport, entertainment and health, and has her own newsletter where she shares reviews of her favorite books, Ashley’s Reading Nook. In previously published work, she has reviewed live music events, books, and wellness products.She values the importance of tech enhancing your life rather than taking over, and as a music fanatic, she is always looking for the best way to listen to new music releases. Discovering the top audio equipment that enhances sound quality and provides optimum comfort is what Ashley does best.In her spare time, Ashley enjoys hitting her reading goals on Goodreads by getting into the latest fantasy novels with a cup of tea as well as getting out in the Welsh mountains for a good hike on the weekend.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/jXRVpga6RUovayhZZ9agvJ-1280-80.jpg">
                                                            <media:credit><![CDATA[Future/Tribit/JBL/Anker/Bose ]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tribit Strombox Lava, JBL Go 3, Anker Soundcore 2, Bose Soundlink Flex (2nd Gen) with Black Friday deals tag ]]></media:description>                                                            <media:text><![CDATA[Tribit Strombox Lava, JBL Go 3, Anker Soundcore 2, Bose Soundlink Flex (2nd Gen) with Black Friday deals tag ]]></media:text>
                                <media:title type="plain"><![CDATA[Tribit Strombox Lava, JBL Go 3, Anker Soundcore 2, Bose Soundlink Flex (2nd Gen) with Black Friday deals tag ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jXRVpga6RUovayhZZ9agvJ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I don’t think you can ever have enough speakers. I own everything from smart home speakers to small portable speakers, and I still find new sounds that I love with every speaker I try. </p><p>And in this year’s <a href="https://www.tomsguide.com/black-friday-deals-and-sales">Black Friday deals</a>, you can try some out for your self with deals on some of the best Bluetooth speakers money can buy. I’ve put together a list of some stand-out favorites available at Amazon this year, including home speakers and some great ones to take on adventures with you.</p><h2 class="article-body__section" id="section-quick-links"><span>Quick links</span></h2><ul><li><strong>Anker Soundcore 2: </strong><a href="https://www.amazon.com/Anker-Soundcore-Bluetooth-Exclusive-Water-Resistant/dp/B01MTB55WH" target="_blank" rel="nofollow"><strong>was $44 now $27 @Amazon</strong></a></li><li><strong>JBL Go 3: </strong><a href="https://www.amazon.com/JBL-Bluetooth-Built-Waterproof-Dustproof/dp/B08KW1KR5H" target="_blank" rel="nofollow"><strong>was $39 now $29 @ Amazon</strong></a></li><li><strong>Tribit Strombox Lava: </strong><a href="http://amazon.com/Tribit-StormBox-Portable-Bluetooth-Waterproof/dp/B0DN5F9BC2" target="_blank" rel="nofollow"><strong>was $139 now $99 @ Amazon</strong></a></li><li><strong>Bose Soundlink Flex (2nd Gen): </strong><a href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16" target="_blank" rel="nofollow"><strong>was $149 now $99 @ Amazon</strong></a></li><li><strong>Marshall Acton III: </strong><a href="https://www.amazon.com/Marshall-Acton-Bluetooth-Speaker-Black/dp/B0BC27MM5Z" target="_blank" rel="nofollow"><strong>was $299 now $179 @ Amazon</strong></a></li></ul><h2 class="article-body__section" id="section-best-bluetooth-speaker-deals-at-amazon"><span>Best Bluetooth speaker deals @ Amazon</span></h2><div class="product"><a data-dimension112="0aee1d32-aaa9-495d-a1e4-2cc6ff67e408" data-action="Deal Block" data-label="The Anker Soundcore 2 is a portable Bluetooth speaker with a waterproof rating of IPX7, so it’s safe from water splashes. Measuring 6.6 x 1.9 x 2.2 inches, it is a great option to take with you on trips or camping, where you need a small speaker to fit in your backpack that will still pack a punch. The 24-hour playtime is also enough to keep the tunes going all day long, so at $27 for Black Friday, this is the ultimate deal." data-dimension48="The Anker Soundcore 2 is a portable Bluetooth speaker with a waterproof rating of IPX7, so it’s safe from water splashes. Measuring 6.6 x 1.9 x 2.2 inches, it is a great option to take with you on trips or camping, where you need a small speaker to fit in your backpack that will still pack a punch. The 24-hour playtime is also enough to keep the tunes going all day long, so at $27 for Black Friday, this is the ultimate deal." data-dimension25="$27" href="https://www.amazon.com/Anker-Soundcore-Bluetooth-Exclusive-Water-Resistant/dp/B01MTB55WH" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1115px;"><p class="vanilla-image-block" style="padding-top:47.98%;"><img id="aHLU5GSPWQ4ie9b7zpTWwY" name="Anker Soundcore 2.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/aHLU5GSPWQ4ie9b7zpTWwY.jpg" mos="" align="middle" fullscreen="" width="1115" height="535" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Anker Soundcore 2 is a portable Bluetooth speaker with a waterproof rating of IPX7, so it’s safe from water splashes. Measuring 6.6 x 1.9 x 2.2 inches, it is a great option to take with you on trips or camping, where you need a small speaker to fit in your backpack that will still pack a punch. The 24-hour playtime is also enough to keep the tunes going all day long, so at $27 for Black Friday, this is the ultimate deal.<a class="view-deal button" href="https://www.amazon.com/Anker-Soundcore-Bluetooth-Exclusive-Water-Resistant/dp/B01MTB55WH" target="_blank" rel="nofollow" data-dimension112="0aee1d32-aaa9-495d-a1e4-2cc6ff67e408" data-action="Deal Block" data-label="The Anker Soundcore 2 is a portable Bluetooth speaker with a waterproof rating of IPX7, so it’s safe from water splashes. Measuring 6.6 x 1.9 x 2.2 inches, it is a great option to take with you on trips or camping, where you need a small speaker to fit in your backpack that will still pack a punch. The 24-hour playtime is also enough to keep the tunes going all day long, so at $27 for Black Friday, this is the ultimate deal." data-dimension48="The Anker Soundcore 2 is a portable Bluetooth speaker with a waterproof rating of IPX7, so it’s safe from water splashes. Measuring 6.6 x 1.9 x 2.2 inches, it is a great option to take with you on trips or camping, where you need a small speaker to fit in your backpack that will still pack a punch. The 24-hour playtime is also enough to keep the tunes going all day long, so at $27 for Black Friday, this is the ultimate deal." data-dimension25="$27">View Deal</a></p></div><div class="product"><a data-dimension112="52e794b0-4176-443d-904f-1f861fe0778f" data-action="Deal Block" data-label="The JBL Go 3 is the ideal Bluetooth speaker for traveling and outdoor adventures, and it's now available for $29 at Amazon. It literally fits in the palm of your hand and can even go underwater with you, thanks to its IP67 waterproof and dustproof rating. Despite its compact size, the Go 3 still offers surprisingly strong sound and up to five hours of playback. You also get the choice of six colors with this speaker, and JBL is known for its vibrant color choices." data-dimension48="The JBL Go 3 is the ideal Bluetooth speaker for traveling and outdoor adventures, and it's now available for $29 at Amazon. It literally fits in the palm of your hand and can even go underwater with you, thanks to its IP67 waterproof and dustproof rating. Despite its compact size, the Go 3 still offers surprisingly strong sound and up to five hours of playback. You also get the choice of six colors with this speaker, and JBL is known for its vibrant color choices." data-dimension25="$29" href="https://www.amazon.com/JBL-Bluetooth-Built-Waterproof-Dustproof/dp/B08KW1KR5H" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1395px;"><p class="vanilla-image-block" style="padding-top:61.51%;"><img id="N2CHKo3ceR7eP5bf7WbPjb" name="jbl-go-3.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/N2CHKo3ceR7eP5bf7WbPjb.jpg" mos="" align="middle" fullscreen="" width="1395" height="858" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The JBL Go 3 is the ideal Bluetooth speaker for traveling and outdoor adventures, and it's now available for $29 at Amazon. It literally fits in the palm of your hand and can even go underwater with you, thanks to its IP67 waterproof and dustproof rating. Despite its compact size, the Go 3 still offers surprisingly strong sound and up to five hours of playback. You also get the choice of six colors with this speaker, and JBL is known for its vibrant color choices.<a class="view-deal button" href="https://www.amazon.com/JBL-Bluetooth-Built-Waterproof-Dustproof/dp/B08KW1KR5H" target="_blank" rel="nofollow" data-dimension112="52e794b0-4176-443d-904f-1f861fe0778f" data-action="Deal Block" data-label="The JBL Go 3 is the ideal Bluetooth speaker for traveling and outdoor adventures, and it's now available for $29 at Amazon. It literally fits in the palm of your hand and can even go underwater with you, thanks to its IP67 waterproof and dustproof rating. Despite its compact size, the Go 3 still offers surprisingly strong sound and up to five hours of playback. You also get the choice of six colors with this speaker, and JBL is known for its vibrant color choices." data-dimension48="The JBL Go 3 is the ideal Bluetooth speaker for traveling and outdoor adventures, and it's now available for $29 at Amazon. It literally fits in the palm of your hand and can even go underwater with you, thanks to its IP67 waterproof and dustproof rating. Despite its compact size, the Go 3 still offers surprisingly strong sound and up to five hours of playback. You also get the choice of six colors with this speaker, and JBL is known for its vibrant color choices." data-dimension25="$29">View Deal</a></p></div><div class="product"><a data-dimension112="0199011b-1e0b-4233-9bf9-7c539fab09f7" data-action="Deal Block" data-label="The Tribit StormBox Lava is a Bluetooth speaker that won't break the bank but still packs a punch. The BassX setting really brings out the bass in your tunes. It's also tailor-made for the outdoors, with a completely waterproof and dustproof design (IP67). It has up to 24 hours of battery life, and you can even use the speaker as a portable charger by plugging your phone into the back." data-dimension48="The Tribit StormBox Lava is a Bluetooth speaker that won't break the bank but still packs a punch. The BassX setting really brings out the bass in your tunes. It's also tailor-made for the outdoors, with a completely waterproof and dustproof design (IP67). It has up to 24 hours of battery life, and you can even use the speaker as a portable charger by plugging your phone into the back." data-dimension25="$99" href="http://amazon.com/Tribit-StormBox-Portable-Bluetooth-Waterproof/dp/B0DN5F9BC2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:83.80%;"><img id="GNykPgtqnDpV9wfnHuMJ9L" name="Tribit StormBox Lava Bluetooth Speaker in black" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GNykPgtqnDpV9wfnHuMJ9L.jpg" mos="" align="middle" fullscreen="" width="679" height="569" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Tribit StormBox Lava is a Bluetooth speaker that won't break the bank but still packs a punch. The BassX setting really brings out the bass in your tunes. It's also tailor-made for the outdoors, with a completely waterproof and dustproof design (IP67). It has up to 24 hours of battery life, and you can even use the speaker as a portable charger by plugging your phone into the back. <a class="view-deal button" href="http://amazon.com/Tribit-StormBox-Portable-Bluetooth-Waterproof/dp/B0DN5F9BC2" target="_blank" rel="nofollow" data-dimension112="0199011b-1e0b-4233-9bf9-7c539fab09f7" data-action="Deal Block" data-label="The Tribit StormBox Lava is a Bluetooth speaker that won't break the bank but still packs a punch. The BassX setting really brings out the bass in your tunes. It's also tailor-made for the outdoors, with a completely waterproof and dustproof design (IP67). It has up to 24 hours of battery life, and you can even use the speaker as a portable charger by plugging your phone into the back." data-dimension48="The Tribit StormBox Lava is a Bluetooth speaker that won't break the bank but still packs a punch. The BassX setting really brings out the bass in your tunes. It's also tailor-made for the outdoors, with a completely waterproof and dustproof design (IP67). It has up to 24 hours of battery life, and you can even use the speaker as a portable charger by plugging your phone into the back." data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="e3bd5d5b-072c-4890-9a9c-9727da20f76b" data-action="Deal Block" data-label="The Bose SoundLink Flex 2 is a compact and powerful Bluetooth speaker with a durable design. This 1.2-pound speaker is water and dust-proof with an IP67 waterproof rating and delivers great sound quality. I love how easy it is to use the custom EQ, so I can really dial it in to a sound profile that I love. It comes in seven different colorways that are all included in this sale. Add its 12 hours of battery life, and you have a great Black Friday deal at $50 off right now." data-dimension48="The Bose SoundLink Flex 2 is a compact and powerful Bluetooth speaker with a durable design. This 1.2-pound speaker is water and dust-proof with an IP67 waterproof rating and delivers great sound quality. I love how easy it is to use the custom EQ, so I can really dial it in to a sound profile that I love. It comes in seven different colorways that are all included in this sale. Add its 12 hours of battery life, and you have a great Black Friday deal at $50 off right now." data-dimension25="$99" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1303px;"><p class="vanilla-image-block" style="padding-top:74.75%;"><img id="hfwnfPdrGwgnEcbUXqjbCP" name="SoundLink Flex Bluetooth Speaker (2nd gen)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hfwnfPdrGwgnEcbUXqjbCP.png" mos="" align="middle" fullscreen="" width="1303" height="974" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose SoundLink Flex 2 is a compact and powerful Bluetooth speaker with a durable design. This 1.2-pound speaker is water and dust-proof with an IP67 waterproof rating and delivers great sound quality. I love how easy it is to use the custom EQ, so I can really dial it in to a sound profile that I love. It comes in seven different colorways that are all included in this sale. Add its 12 hours of battery life, and you have a great Black Friday deal at $50 off right now. <a class="view-deal button" href="https://www.amazon.com/Bose-SoundLink-Bluetooth-Waterproof-Dustproof/dp/B0DV5H3S16" target="_blank" rel="nofollow" data-dimension112="e3bd5d5b-072c-4890-9a9c-9727da20f76b" data-action="Deal Block" data-label="The Bose SoundLink Flex 2 is a compact and powerful Bluetooth speaker with a durable design. This 1.2-pound speaker is water and dust-proof with an IP67 waterproof rating and delivers great sound quality. I love how easy it is to use the custom EQ, so I can really dial it in to a sound profile that I love. It comes in seven different colorways that are all included in this sale. Add its 12 hours of battery life, and you have a great Black Friday deal at $50 off right now." data-dimension48="The Bose SoundLink Flex 2 is a compact and powerful Bluetooth speaker with a durable design. This 1.2-pound speaker is water and dust-proof with an IP67 waterproof rating and delivers great sound quality. I love how easy it is to use the custom EQ, so I can really dial it in to a sound profile that I love. It comes in seven different colorways that are all included in this sale. Add its 12 hours of battery life, and you have a great Black Friday deal at $50 off right now." data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="377febfb-1c82-4b4d-8a44-216f80d5086f" data-action="Deal Block" data-label="The Marshall Acton III is a retro-styled Bluetooth speaker that features some thoroughly modern touches. The physical controls and tactile and satisfying, and the sound is big and warm. It has one 30W Class D amplifier for the mid/woofer and two 15W amps for the tweeters. And it’s pretty small too for a home speaker, measuring 10.24 x 6.69 x 5.91 inches. Just remember that this one needs to be plugged into the wall to work." data-dimension48="The Marshall Acton III is a retro-styled Bluetooth speaker that features some thoroughly modern touches. The physical controls and tactile and satisfying, and the sound is big and warm. It has one 30W Class D amplifier for the mid/woofer and two 15W amps for the tweeters. And it’s pretty small too for a home speaker, measuring 10.24 x 6.69 x 5.91 inches. Just remember that this one needs to be plugged into the wall to work." data-dimension25="$179" href="https://www.amazon.com/Marshall-Acton-Bluetooth-Speaker-Black/dp/B0BC27MM5Z" 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:120.00%;"><img id="T2qSjTer2AgBjuQkKpsHm" name="Marshall Acton III" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/T2qSjTer2AgBjuQkKpsHm.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Marshall Acton III is a retro-styled Bluetooth speaker that features some thoroughly modern touches. The physical controls and tactile and satisfying, and the sound is big and warm. It has one 30W Class D amplifier for the mid/woofer and two 15W amps for the tweeters. And it’s pretty small too for a home speaker, measuring 10.24 x 6.69 x 5.91 inches. Just remember that this one needs to be plugged into the wall to work. <a class="view-deal button" href="https://www.amazon.com/Marshall-Acton-Bluetooth-Speaker-Black/dp/B0BC27MM5Z" target="_blank" rel="nofollow" data-dimension112="377febfb-1c82-4b4d-8a44-216f80d5086f" data-action="Deal Block" data-label="The Marshall Acton III is a retro-styled Bluetooth speaker that features some thoroughly modern touches. The physical controls and tactile and satisfying, and the sound is big and warm. It has one 30W Class D amplifier for the mid/woofer and two 15W amps for the tweeters. And it’s pretty small too for a home speaker, measuring 10.24 x 6.69 x 5.91 inches. Just remember that this one needs to be plugged into the wall to work." data-dimension48="The Marshall Acton III is a retro-styled Bluetooth speaker that features some thoroughly modern touches. The physical controls and tactile and satisfying, and the sound is big and warm. It has one 30W Class D amplifier for the mid/woofer and two 15W amps for the tweeters. And it’s pretty small too for a home speaker, measuring 10.24 x 6.69 x 5.91 inches. Just remember that this one needs to be plugged into the wall to work." data-dimension25="$179">View Deal</a></p></div><p><em>For more discounts, check out our </em><a href="https://www.tomsguide.com/live/news/black-friday-deals-ultimate-guide-my-top-picks-2025"><em>Black Friday deals live blog</em></a><em>.</em></p><h3 class="article-body__section" id="section-shop-today-s-best-black-friday-deals"><span>Shop today's best Black Friday deals</span></h3><ul><li><strong>Amazon: </strong><a href="https://www.amazon.com/b?node=210998206011" target="_blank" rel="nofollow"><strong>50% off Ring, Ninja, AirPods and more</strong></a><strong></strong></li><li><strong>Walmart Plus: </strong><a href="https://www.walmart.com/plus" target="_blank" rel="nofollow"><strong>50% off @ Walmart</strong></a></li><li><strong>REI: </strong><a href="https://www.rei.com/f/scd-deals" target="_blank" rel="nofollow"><strong>half-off Arc'teryx, Patagonia, more</strong></a><strong></strong></li><li><strong>Dell: </strong><a href="https://www.dell.com/en-us/shop/deals?sortBy=price-ascending" target="_blank" rel="nofollow"><strong>monitors from $69, laptops from $299</strong></a><strong></strong></li><li><strong>Nectar: </strong><a href="https://www.nectarsleep.com/" target="_blank" rel="nofollow"><strong>50% off mattresses + bundles</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/all-electronics-on-sale/all-computers-tablets-on-sale/pcmcat1632941704767.c?id=pcmcat1632941704767" target="_blank" rel="nofollow"><strong>laptops from $149</strong></a><strong></strong></li><li><strong>Lenovo: </strong><a href="https://www.lenovo.com/us/en/d/deals/laptops/?IPromoID=LEN380027&sortBy=priceUp" target="_blank" rel="nofollow"><strong>doorbuster deals from $319</strong></a><strong></strong></li><li><strong>Wayfair: </strong><a href="https://www.wayfair.com/daily-sales" target="_blank" rel="nofollow"><strong>up to 80% off home decor</strong></a><strong></strong></li><li><strong>Lululemon: </strong><a href="https://shop.lululemon.com/c/we-made-too-much/n18mhd?Ns=price%7C0" target="_blank" rel="nofollow"><strong>top picks from $9</strong></a><strong></strong></li><li><strong>Newegg: </strong><a href="https://www.newegg.com/Black-November-Early-Access/EventSaleStore/ID-1132" target="_blank" rel="nofollow"><strong>Doorbuster deals from $6</strong></a></li><li><strong>Walmart: </strong><a href="https://www.walmart.com/cp/gifts/3131907" target="_blank" rel="nofollow"><strong>holiday gifts from $15</strong></a></li><li><strong>Birkenstock: </strong><a href="https://www.nordstrom.com/browse/sale?sort=PercentOff&filterByBrand=birkenstock" target="_blank" rel="nofollow"><strong>deals from $20 @ Nordstrom</strong></a><strong></strong></li><li><strong>Saatva: </strong><a href="https://www.saatva.com/mattresses/saatva-classic?utm_source=futurepublishing&utm_medium=affiliate&coupon=awyqqgzvxqicebab" target="_blank" rel="nofollow"><strong>luxury mattresses from $1,099</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Best Cyber Monday soundbar deals: 11 discounts with up to 50% off from Bose, Samsung, JBL and more ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/soundbars/i-found-the-best-black-friday-soundbar-deals-with-dolby-atmos-up-to-50-percent-off-bose-sonos-samsung-and-jbl</link>
                                                                            <description>
                            <![CDATA[ I've tested 15 soundbars this year, so I've rounded up the best Cyber Monday deals on soundbars from just $149! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">sxSWidJ2EDFiJjKrroTy2G</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/hJ3pzarD4C84HAN7o8UdRP-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 27 Nov 2025 12:43:57 +0000</pubDate>                                                                                                                                <updated>Mon, 01 Dec 2025 14:35:32 +0000</updated>
                                                                                                                                            <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.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>
                                                                                                                                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/hJ3pzarD4C84HAN7o8UdRP-1280-80.png">
                                                            <media:credit><![CDATA[Bose / JBL / Polk Audio / Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a soundbars image with cyber monday deal showing jbl, polk audio, and bose soundbars]]></media:description>                                                            <media:text><![CDATA[a soundbars image with cyber monday deal showing jbl, polk audio, and bose soundbars]]></media:text>
                                <media:title type="plain"><![CDATA[a soundbars image with cyber monday deal showing jbl, polk audio, and bose soundbars]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/hJ3pzarD4C84HAN7o8UdRP-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Cyber Monday is here! That means some of the best soundbars I've reviewed this year are majorly discounted. There's never been a better time to upgrade your home theater. </p><p>This year's Cyber Monday sees awesome savings on the <a href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" target="_blank" rel="nofollow">Bose Smart Soundbar (2024) for just $399 on Amazon</a> right now — that's a massive $100 saving. Or, if you're looking for a serious cinema-quality setup, the <a href="https://www.bestbuy.com/product/jbl-bar1300mk2-11-1-4-channel-soundbar-system-with-detachable-surround-speakers-and-dolby-atmos-and-dtsx-black/J7LXFW36KK" target="_blank" rel="nofollow">JBL Bar 1300 MK2 is just $1,199 at Best Buy</a> — that's a huge $500 saving on a soundbar that came out only a month ago. </p><p>If you're on a tight budget, I'd recommend the <a href="https://www.amazon.com/dp/B0CXZTT4MT/" target="_blank" rel="nofollow">Amazon Fire TV Soundbar, just $149 right now</a>. This soundbar has Dolby Atmos for just <strong>$149</strong>!</p><p>I've reviewed 15 soundbars this year from big names like Bose, Samsung and Sony, and also budget bars from lesser-known brands. To help you choose which soundbar to buy, I've rounded up the<strong> </strong>best discounts this Cyber Monday so far.  </p><h2 class="article-body__section" id="section-soundbar-deals-quick-links"><span>Soundbar deals: Quick links</span></h2><ul><li><strong>Amazon Fire TV Soundbar: </strong><a href="https://www.amazon.com/dp/B0CXZTT4MT/" target="_blank" rel="nofollow"><strong>was $249 now $149 @ Amazon</strong></a></li><li><strong>Hisense AX3120Q: </strong><a href="https://www.bestbuy.com/product/hisense-ax3120q-3-1-2-channel-soundbar-with-wireless-subwoofer-hi-concerto-dolby-atmos-dts-x-and-ai-eq-mode-black/J3Z9Z429Z7" target="_blank" rel="nofollow"><strong>was $279 now $199 @ Best Buy</strong></a></li><li><strong>Samsung HW-B650: </strong><a href="https://www.bestbuy.com/product/samsung-hw-b650-za-3-1-channel-soundbar-with-wireless-subwoofer-dolby-5-1-dts-virtualx-black/J3ZYG2XWJJ/sku/6505155" target="_blank" rel="nofollow"><strong>was $399 now $199 @ Best Buy</strong></a></li><li><strong>Polk Audio Signa S4: </strong><a href="https://www.amazon.com/Polk-Audio-Signa-S4-Ultra-Slim/dp/B09J753M18" target="_blank" rel="nofollow"><strong>was $449 now $359 @ Amazon</strong></a></li><li><strong>JBL Bar 500: </strong><a href="https://www.bestbuy.com/product/jbl-bar-500-5-1ch-soundbar-with-multibeam-and-dolby-atmos-black/J7LXFW2ZYW" target="_blank" rel="nofollow"><strong>was $649 now $379 @ Best Buy</strong></a></li><li><strong>Bose Smart Soundbar 2024: </strong><a href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J" target="_blank" rel="nofollow"><strong>was $499 now $399 @ Amazon</strong></a><strong></strong></li><li><strong>Samsung Q600F: </strong><a href="https://www.bestbuy.com/product/samsung-q-series-hw-q600f-atmos-3-1-2-ch-soundbar-with-subwoofer-titan-black/J3ZYG2FV7Z/sku/6619392" target="_blank" rel="nofollow"><strong>was $699 now $499 @ Best Buy</strong></a><strong></strong></li><li><strong>Bose Smart Soundbar Ultra: </strong><a href="https://www.amazon.com/Bose-Soundbar-Wireless-Bluetooth-Surround/dp/B0C548MYF3" target="_blank" rel="nofollow"><strong>was $899 now $699 @ Amazon</strong></a><strong> </strong></li><li><strong>Sonos Arc Ultra: </strong><a href="https://www.bestbuy.com/product/sonos-arc-ultra-soundbar-black/J39H373F2S" target="_blank" rel="nofollow"><strong>was $1,099 now $879 @ Best Buy</strong></a><strong></strong></li><li><strong>Samsung Q990D: </strong><a href="https://www.bestbuy.com/product/samsung-hw-q990d-za-11-1-4-channel-q-series-soundbar-with-wireless-subwoofer-and-rear-speakers-dolby-atmos-and-q-symphony-black/J3ZYG2H93V" target="_blank" rel="nofollow"><strong>was $1,999 now $999 @ Best Buy</strong></a><strong> </strong></li><li><strong>JBL Bar 1300 MK2: </strong><a href="https://www.bestbuy.com/product/jbl-bar1300mk2-11-1-4-channel-soundbar-system-with-detachable-surround-speakers-and-dolby-atmos-and-dtsx-black/J7LXFW36KK" target="_blank" rel="nofollow"><strong>was $1,699 now $1,199 @ Best Buy</strong></a></li></ul><h2 class="article-body__section" id="section-best-cyber-monday-soundbar-deals"><span>Best Cyber Monday soundbar deals</span></h2><div class="product"><a data-dimension112="5d5e76af-288d-455d-90f3-a4bc02c4e2fb" data-action="Deal Block" data-label="If you're on a super low budget but you still want to upgrade from your TV speakers, why not check out the Amazon Fire TV Soundbar? This compact soundbar has a built-in subwoofer and Dolby Atmos and DTS:VirtualX for immersive 360° audio in your movies." data-dimension48="If you're on a super low budget but you still want to upgrade from your TV speakers, why not check out the Amazon Fire TV Soundbar? This compact soundbar has a built-in subwoofer and Dolby Atmos and DTS:VirtualX for immersive 360° audio in your movies." data-dimension25="$149" href="https://www.amazon.com/dp/B0CXZTT4MT/" 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="94QLtog4vScXz4kkgXLWyi" name="Amazon fire TV soundbar.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/94QLtog4vScXz4kkgXLWyi.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're on a super low budget but you still want to upgrade from your TV speakers, why not check out the Amazon Fire TV Soundbar? This compact soundbar has a built-in subwoofer and Dolby Atmos and DTS:VirtualX for immersive 360° audio in your movies. <a class="view-deal button" href="https://www.amazon.com/dp/B0CXZTT4MT/" target="_blank" rel="nofollow" data-dimension112="5d5e76af-288d-455d-90f3-a4bc02c4e2fb" data-action="Deal Block" data-label="If you're on a super low budget but you still want to upgrade from your TV speakers, why not check out the Amazon Fire TV Soundbar? This compact soundbar has a built-in subwoofer and Dolby Atmos and DTS:VirtualX for immersive 360° audio in your movies." data-dimension48="If you're on a super low budget but you still want to upgrade from your TV speakers, why not check out the Amazon Fire TV Soundbar? This compact soundbar has a built-in subwoofer and Dolby Atmos and DTS:VirtualX for immersive 360° audio in your movies." data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="5c1fd3f5-cdea-4ea7-9d6e-162672556af6" data-action="Deal Block" data-label="Considering you get two rears and a subwoofer, $159 for the Vizio 5.1 channel soundbar feels illegal. With both Dolby Atmos and DTS:VirtualX, this soundbar is one of the cheapest ways to get immersive audio for movie nights. Of course, this budget speaker doesn't have the clarity of a pricier model, but for $159, can you really complain?" data-dimension48="Considering you get two rears and a subwoofer, $159 for the Vizio 5.1 channel soundbar feels illegal. With both Dolby Atmos and DTS:VirtualX, this soundbar is one of the cheapest ways to get immersive audio for movie nights. Of course, this budget speaker doesn't have the clarity of a pricier model, but for $159, can you really complain?" data-dimension25="$159" href="https://www.target.com/p/vizio-5-1-soundbar-w-dolby-atmos-sv510m-08/-/A-91625152" 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="ThyjWs9hAA4JmPzCyrcmSe" name="vizio 5.1 soundbar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ThyjWs9hAA4JmPzCyrcmSe.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Considering you get two rears and a subwoofer, $159 for the Vizio 5.1 channel soundbar feels illegal. With both Dolby Atmos and DTS:VirtualX, this soundbar is one of the cheapest ways to get immersive audio for movie nights. Of course, this budget speaker doesn't have the clarity of a pricier model, but for $159, can you really complain? <a class="view-deal button" href="https://www.target.com/p/vizio-5-1-soundbar-w-dolby-atmos-sv510m-08/-/A-91625152" target="_blank" rel="nofollow" data-dimension112="5c1fd3f5-cdea-4ea7-9d6e-162672556af6" data-action="Deal Block" data-label="Considering you get two rears and a subwoofer, $159 for the Vizio 5.1 channel soundbar feels illegal. With both Dolby Atmos and DTS:VirtualX, this soundbar is one of the cheapest ways to get immersive audio for movie nights. Of course, this budget speaker doesn't have the clarity of a pricier model, but for $159, can you really complain?" data-dimension48="Considering you get two rears and a subwoofer, $159 for the Vizio 5.1 channel soundbar feels illegal. With both Dolby Atmos and DTS:VirtualX, this soundbar is one of the cheapest ways to get immersive audio for movie nights. Of course, this budget speaker doesn't have the clarity of a pricier model, but for $159, can you really complain?" data-dimension25="$159">View Deal</a></p></div><div class="product"><a data-dimension112="f175dc52-fdb4-47a9-b3bc-58174970fc30" data-action="Deal Block" data-label="This is a great mid-range Atmos option. There's a pair of upfiring speakers inside to make movies and TV shows sound like they're coming from all around you. It plugs in with HDMI for easy connection, and comes packed with a subwoofer for extra bass." data-dimension48="This is a great mid-range Atmos option. There's a pair of upfiring speakers inside to make movies and TV shows sound like they're coming from all around you. It plugs in with HDMI for easy connection, and comes packed with a subwoofer for extra bass." data-dimension25="$199" href="https://www.bestbuy.com/product/hisense-ax3120q-3-1-2-channel-soundbar-with-wireless-subwoofer-hi-concerto-dolby-atmos-dts-x-and-ai-eq-mode-black/J3Z9Z429Z7" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:57.90%;"><img id="4uJxcTYfUcdWWUZzPUqyP9" name="hisense--ax3120q-312-channel-soundbar-wi-58185ec1-6697-462f-be92-7156f20483c0.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4uJxcTYfUcdWWUZzPUqyP9.png" mos="" align="middle" fullscreen="" width="3000" height="1737" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is a great mid-range Atmos option. There's a pair of upfiring speakers inside to make movies and TV shows sound like they're coming from all around you. It plugs in with HDMI for easy connection, and comes packed with a subwoofer for extra bass.<a class="view-deal button" href="https://www.bestbuy.com/product/hisense-ax3120q-3-1-2-channel-soundbar-with-wireless-subwoofer-hi-concerto-dolby-atmos-dts-x-and-ai-eq-mode-black/J3Z9Z429Z7" target="_blank" rel="nofollow" data-dimension112="f175dc52-fdb4-47a9-b3bc-58174970fc30" data-action="Deal Block" data-label="This is a great mid-range Atmos option. There's a pair of upfiring speakers inside to make movies and TV shows sound like they're coming from all around you. It plugs in with HDMI for easy connection, and comes packed with a subwoofer for extra bass." data-dimension48="This is a great mid-range Atmos option. There's a pair of upfiring speakers inside to make movies and TV shows sound like they're coming from all around you. It plugs in with HDMI for easy connection, and comes packed with a subwoofer for extra bass." data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="cd4fc1ce-ee97-4341-ae3c-46899e5a114b" data-action="Deal Block" data-label="Save an incredible $200 off this great deal. This soundbar comes with a center speaker for clear dialogue and powerful bass, thanks to its subwoofer and Boost mode — perfect for movie nights. Just note that it doesn't have Dolby Atmos, but it has DTS:VirtualX, which upscales audio signals into fake-but-still-noticeable 360° sound. At just $199, this is one to snap up." data-dimension48="Save an incredible $200 off this great deal. This soundbar comes with a center speaker for clear dialogue and powerful bass, thanks to its subwoofer and Boost mode — perfect for movie nights. Just note that it doesn't have Dolby Atmos, but it has DTS:VirtualX, which upscales audio signals into fake-but-still-noticeable 360° sound. At just $199, this is one to snap up." data-dimension25="$199" href="https://www.bestbuy.com/product/samsung-hw-b650-za-3-1-channel-soundbar-with-wireless-subwoofer-dolby-5-1-dts-virtualx-black/J3ZYG2XWJJ/sku/6505155" 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.22%;"><img id="s8mLEeRJcW97rtnQCEGVKh" name="Samsung Soundbar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/s8mLEeRJcW97rtnQCEGVKh.jpg" mos="" align="middle" fullscreen="" width="900" height="542" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Save an incredible $200 off this great deal. This soundbar comes with a center speaker for clear dialogue and powerful bass, thanks to its subwoofer and Boost mode — perfect for movie nights. Just note that it doesn't have Dolby Atmos, but it has DTS:VirtualX, which upscales audio signals into fake-but-still-noticeable 360° sound. At just $199, this is one to snap up. <a class="view-deal button" href="https://www.bestbuy.com/product/samsung-hw-b650-za-3-1-channel-soundbar-with-wireless-subwoofer-dolby-5-1-dts-virtualx-black/J3ZYG2XWJJ/sku/6505155" target="_blank" rel="nofollow" data-dimension112="cd4fc1ce-ee97-4341-ae3c-46899e5a114b" data-action="Deal Block" data-label="Save an incredible $200 off this great deal. This soundbar comes with a center speaker for clear dialogue and powerful bass, thanks to its subwoofer and Boost mode — perfect for movie nights. Just note that it doesn't have Dolby Atmos, but it has DTS:VirtualX, which upscales audio signals into fake-but-still-noticeable 360° sound. At just $199, this is one to snap up." data-dimension48="Save an incredible $200 off this great deal. This soundbar comes with a center speaker for clear dialogue and powerful bass, thanks to its subwoofer and Boost mode — perfect for movie nights. Just note that it doesn't have Dolby Atmos, but it has DTS:VirtualX, which upscales audio signals into fake-but-still-noticeable 360° sound. At just $199, this is one to snap up." data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="3857dd56-1a8e-480c-b673-83ba45e8a828" data-action="Deal Block" data-label="This Sony soundbar doesn't come with a subwoofer for extra bass, but packs in some other extra features instead. It's a 3.1 channel bar so there's a built in sub, and DTS X and Dolby Atmos support for some surround sound. This $200 saving is one of the biggest we've seen on this bar yet." data-dimension48="This Sony soundbar doesn't come with a subwoofer for extra bass, but packs in some other extra features instead. It's a 3.1 channel bar so there's a built in sub, and DTS X and Dolby Atmos support for some surround sound. This $200 saving is one of the biggest we've seen on this bar yet." data-dimension25="£268" href="https://www.amazon.co.uk/Sony-HT-S2000-3-1ch-Atmos%C2%AE-Soundbar/dp/B0C4Q3CQ23" 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:41.53%;"><img id="DCKumg7HxUjahHH3CtScCT" name="sony-hts2000-small--compact-31ch-dolby-a-763f2bad-b439-4430-ae8e-2a91639d8477.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/DCKumg7HxUjahHH3CtScCT.jpg" mos="" align="middle" fullscreen="" width="1500" height="623" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This Sony soundbar doesn't come with a subwoofer for extra bass, but packs in some other extra features instead. It's a 3.1 channel bar so there's a built in sub, and DTS X and Dolby Atmos support for some surround sound. This $200 saving is one of the biggest we've seen on this bar yet.<a class="view-deal button" href="https://www.amazon.co.uk/Sony-HT-S2000-3-1ch-Atmos%C2%AE-Soundbar/dp/B0C4Q3CQ23" target="_blank" rel="nofollow" data-dimension112="3857dd56-1a8e-480c-b673-83ba45e8a828" data-action="Deal Block" data-label="This Sony soundbar doesn't come with a subwoofer for extra bass, but packs in some other extra features instead. It's a 3.1 channel bar so there's a built in sub, and DTS X and Dolby Atmos support for some surround sound. This $200 saving is one of the biggest we've seen on this bar yet." data-dimension48="This Sony soundbar doesn't come with a subwoofer for extra bass, but packs in some other extra features instead. It's a 3.1 channel bar so there's a built in sub, and DTS X and Dolby Atmos support for some surround sound. This $200 saving is one of the biggest we've seen on this bar yet." data-dimension25="£268">View Deal</a></p></div><div class="product"><a data-dimension112="7038a291-1964-4599-a322-50dce775cc75" data-action="Deal Block" data-label="The Polk Audio Signa S4 is my go-to recommendation for Dolby Atmos sound on a budget. This soundbar has a fantastic 3.1.2 channel configuration with a wireless subwoofer for extra floor-shaking bass. This soundbar is $90 off right now, making it a steal." data-dimension48="The Polk Audio Signa S4 is my go-to recommendation for Dolby Atmos sound on a budget. This soundbar has a fantastic 3.1.2 channel configuration with a wireless subwoofer for extra floor-shaking bass. This soundbar is $90 off right now, making it a steal." data-dimension25="$359" href="https://www.amazon.com/Polk-Audio-Signa-S4-Ultra-Slim/dp/B09J753M18" 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:120.00%;"><img id="MQA2fDw3TZNB6m5sYLUUcQ" name="Polk Signa S4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/MQA2fDw3TZNB6m5sYLUUcQ.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Polk Audio Signa S4 is my go-to recommendation for Dolby Atmos sound on a budget. This soundbar has a fantastic 3.1.2 channel configuration with a wireless subwoofer for extra floor-shaking bass. This soundbar is $90 off right now, making it a steal. <a class="view-deal button" href="https://www.amazon.com/Polk-Audio-Signa-S4-Ultra-Slim/dp/B09J753M18" target="_blank" rel="nofollow" data-dimension112="7038a291-1964-4599-a322-50dce775cc75" data-action="Deal Block" data-label="The Polk Audio Signa S4 is my go-to recommendation for Dolby Atmos sound on a budget. This soundbar has a fantastic 3.1.2 channel configuration with a wireless subwoofer for extra floor-shaking bass. This soundbar is $90 off right now, making it a steal." data-dimension48="The Polk Audio Signa S4 is my go-to recommendation for Dolby Atmos sound on a budget. This soundbar has a fantastic 3.1.2 channel configuration with a wireless subwoofer for extra floor-shaking bass. This soundbar is $90 off right now, making it a steal." data-dimension25="$359">View Deal</a></p></div><div class="product"><a data-dimension112="ed02485f-835a-44cd-87b9-c3ad500b7ddb" data-action="Deal Block" data-label="This JBL system comes with a 5.1-Channel soundbar with MultiBeam, to transform your movies, music, and games into 3D surround sound. This also comes with a 10" wireless subwoofer for ground-shaking bass. With an increased saving of $270 for Cyber Monday, this is a great deal." data-dimension48="This JBL system comes with a 5.1-Channel soundbar with MultiBeam, to transform your movies, music, and games into 3D surround sound. This also comes with a 10" wireless subwoofer for ground-shaking bass. With an increased saving of $270 for Cyber Monday, this is a great deal." data-dimension25="$379" href="https://www.bestbuy.com/product/jbl-bar-500-5-1ch-soundbar-with-multibeam-and-dolby-atmos-black/J7LXFW2ZYW" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1395px;"><p class="vanilla-image-block" style="padding-top:92.76%;"><img id="tTkXag4bwZyxWoVBE5XaAb" name="JBL Bar 500 5.1Channel soundbar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tTkXag4bwZyxWoVBE5XaAb.jpg" mos="" align="middle" fullscreen="" width="1395" height="1294" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This JBL system comes with a 5.1-Channel soundbar with MultiBeam, to transform your movies, music, and games into 3D surround sound. This also comes with a 10" wireless subwoofer for ground-shaking bass. With an increased saving of $270 for Cyber Monday, this is a great deal. <a class="view-deal button" href="https://www.bestbuy.com/product/jbl-bar-500-5-1ch-soundbar-with-multibeam-and-dolby-atmos-black/J7LXFW2ZYW" target="_blank" rel="nofollow" data-dimension112="ed02485f-835a-44cd-87b9-c3ad500b7ddb" data-action="Deal Block" data-label="This JBL system comes with a 5.1-Channel soundbar with MultiBeam, to transform your movies, music, and games into 3D surround sound. This also comes with a 10" wireless subwoofer for ground-shaking bass. With an increased saving of $270 for Cyber Monday, this is a great deal." data-dimension48="This JBL system comes with a 5.1-Channel soundbar with MultiBeam, to transform your movies, music, and games into 3D surround sound. This also comes with a 10" wireless subwoofer for ground-shaking bass. With an increased saving of $270 for Cyber Monday, this is a great deal." data-dimension25="$379">View Deal</a></p></div><div class="product"><a data-dimension112="6cdf94ed-e864-42ba-b404-17d43ec2276e" data-action="Deal Block" data-label="Bose's Sub 700" data-dimension48="Bose's Sub 700" data-dimension25="$399" href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J/" 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:120.00%;"><img id="rJbLARrb3giTtDi2jTiuGE" name="Bose Smart Soundbar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rJbLARrb3giTtDi2jTiuGE.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose Smart Soundbar is a great beginner soundbar. With a 3.0.2 channel setup, it has great surround sound, even in shows and movies you least expect it. The soundbar can even upcode non-Atmos content into "fake" suround sound. The dialogue is crisp thanks to Bose's AI dialogue mode, and the bass is surprisingly great when listening to music via AirPlay. Although it's not as room-filling as pricier alternatives, it's a fantastic option. You can even add <a href="https://www.amazon.com/Bose-Bass-Module-700-Black/dp/B07F39ZRCQ" target="_blank" rel="nofollow" data-dimension112="6cdf94ed-e864-42ba-b404-17d43ec2276e" data-action="Deal Block" data-label="Bose's Sub 700" data-dimension48="Bose's Sub 700" data-dimension25="$399">Bose's Sub 700</a> ($899) as an extra. <a class="view-deal button" href="https://www.amazon.com/Bose-Soundbar-Bluetooth-Assistant-Capabilities/dp/B0D6W8XQ6J/" target="_blank" rel="nofollow" data-dimension112="6cdf94ed-e864-42ba-b404-17d43ec2276e" data-action="Deal Block" data-label="Bose's Sub 700" data-dimension48="Bose's Sub 700" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="589a1e72-5c11-4740-9e13-c41d4f4d409d" data-action="Deal Block" data-label="The Sony Bravia Bar 6 has an incredible $200 off right now, making it one of the best-value soundbar + subwoofer combos out there. You get a 3.1.2 channel configuration, meaning there's a subwoofer and two side-firing speakers for Dolby Atmos or DTS:VirtualX content. You can also stream music over Wi-Fi!" data-dimension48="The Sony Bravia Bar 6 has an incredible $200 off right now, making it one of the best-value soundbar + subwoofer combos out there. You get a 3.1.2 channel configuration, meaning there's a subwoofer and two side-firing speakers for Dolby Atmos or DTS:VirtualX content. You can also stream music over Wi-Fi!" data-dimension25="$498" href="https://www.amazon.com/gp/aw/d/B0DYWPJYF1?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:38.60%;"><img id="KnxTKeVURhKAjdQ8o5tZ3Q" name="BRAVIA Theater Bar 6" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KnxTKeVURhKAjdQ8o5tZ3Q.png" mos="" align="middle" fullscreen="" width="1500" height="579" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Sony Bravia Bar 6 has an incredible $200 off right now, making it one of the best-value soundbar + subwoofer combos out there. You get a 3.1.2 channel configuration, meaning there's a subwoofer and two side-firing speakers for Dolby Atmos or DTS:VirtualX content. You can also stream music over Wi-Fi! <a class="view-deal button" href="https://www.amazon.com/gp/aw/d/B0DYWPJYF1?th=1" target="_blank" rel="nofollow" data-dimension112="589a1e72-5c11-4740-9e13-c41d4f4d409d" data-action="Deal Block" data-label="The Sony Bravia Bar 6 has an incredible $200 off right now, making it one of the best-value soundbar + subwoofer combos out there. You get a 3.1.2 channel configuration, meaning there's a subwoofer and two side-firing speakers for Dolby Atmos or DTS:VirtualX content. You can also stream music over Wi-Fi!" data-dimension48="The Sony Bravia Bar 6 has an incredible $200 off right now, making it one of the best-value soundbar + subwoofer combos out there. You get a 3.1.2 channel configuration, meaning there's a subwoofer and two side-firing speakers for Dolby Atmos or DTS:VirtualX content. You can also stream music over Wi-Fi!" data-dimension25="$498">View Deal</a></p></div><div class="product"><a data-dimension112="551e15f9-caa7-4c7d-a070-239f918830c1" data-action="Deal Block" data-label="This is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it." data-dimension48="This is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it." data-dimension25="$499" href="https://www.bestbuy.com/product/samsung-q-series-hw-q600f-atmos-3-1-2-ch-soundbar-with-subwoofer-titan-black/J3ZYG2FV7Z/sku/6619392" 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:120.00%;"><img id="ExfR2TSGT2maYw6G6JSFS5" name="Samsung Q600F" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ExfR2TSGT2maYw6G6JSFS5.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it. <a class="view-deal button" href="https://www.bestbuy.com/product/samsung-q-series-hw-q600f-atmos-3-1-2-ch-soundbar-with-subwoofer-titan-black/J3ZYG2FV7Z/sku/6619392" target="_blank" rel="nofollow" data-dimension112="551e15f9-caa7-4c7d-a070-239f918830c1" data-action="Deal Block" data-label="This is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it." data-dimension48="This is my favorite mid-range soundbar. With a fantastic 3.1.2 channel arrangement, the Samsung Q600F has expansive sound both horizontally and vertically, and it offers crystal-clear dialogue. Although it doesn't have any smart home features like AirPlay, if you're after a soundbar and subwoofer that does everything to earn its place on your TV stand, then this is it." data-dimension25="$499">View Deal</a></p></div><div class="product"><a data-dimension112="9f2d32af-9f61-49e8-ba90-86a3c678df61" data-action="Deal Block" data-label="The Bose Smart Ultra Soundbar is a step-up from the $399 Bose Smart Soundbar. This option is for customers who want a bit more pizzazz to their home cinema and don't mind spending extra. The Smart Ultra boasts a 5.1.2 channel system with added bass. It also has the fantastic AI dialogue mode and smart home features like wireless control and AirPlay. As with the Smart Soundbar, it's compatible with Bose's Subs, too, for even heavier bass." data-dimension48="The Bose Smart Ultra Soundbar is a step-up from the $399 Bose Smart Soundbar. This option is for customers who want a bit more pizzazz to their home cinema and don't mind spending extra. The Smart Ultra boasts a 5.1.2 channel system with added bass. It also has the fantastic AI dialogue mode and smart home features like wireless control and AirPlay. As with the Smart Soundbar, it's compatible with Bose's Subs, too, for even heavier bass." data-dimension25="$699" href="https://www.amazon.com/Bose-Soundbar-Wireless-Bluetooth-Surround/dp/B0C548MYF3" 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="dLLYXWpy2mJsCzXj262Tq6" name="bose smart soundbar ultra" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dLLYXWpy2mJsCzXj262Tq6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose Smart Ultra Soundbar is a step-up from the $399 Bose Smart Soundbar. This option is for customers who want a bit more pizzazz to their home cinema and don't mind spending extra. The Smart Ultra boasts a 5.1.2 channel system with added bass. It also has the fantastic AI dialogue mode and smart home features like wireless control and AirPlay. As with the Smart Soundbar, it's compatible with Bose's Subs, too, for even heavier bass. <a class="view-deal button" href="https://www.amazon.com/Bose-Soundbar-Wireless-Bluetooth-Surround/dp/B0C548MYF3" target="_blank" rel="nofollow" data-dimension112="9f2d32af-9f61-49e8-ba90-86a3c678df61" data-action="Deal Block" data-label="The Bose Smart Ultra Soundbar is a step-up from the $399 Bose Smart Soundbar. This option is for customers who want a bit more pizzazz to their home cinema and don't mind spending extra. The Smart Ultra boasts a 5.1.2 channel system with added bass. It also has the fantastic AI dialogue mode and smart home features like wireless control and AirPlay. As with the Smart Soundbar, it's compatible with Bose's Subs, too, for even heavier bass." data-dimension48="The Bose Smart Ultra Soundbar is a step-up from the $399 Bose Smart Soundbar. This option is for customers who want a bit more pizzazz to their home cinema and don't mind spending extra. The Smart Ultra boasts a 5.1.2 channel system with added bass. It also has the fantastic AI dialogue mode and smart home features like wireless control and AirPlay. As with the Smart Soundbar, it's compatible with Bose's Subs, too, for even heavier bass." data-dimension25="$699">View Deal</a></p></div><div class="product"><a data-dimension112="0d5e56d9-6ba7-4d88-a073-35efc26cc37a" data-action="Deal Block" data-label="The Sonos Arc Ultra is the champion of soundbars for a reason. With unbeatable immersive sound that genuinely feels like it's coming from all around you and the iconic Sonos aesthetics, this is the perfect soundbar for those who want the best of the best and are happy to invest in their home cinema setup. Of course, the Sonos Arc Ultra is buildable with Sonos subs and rears, so you can continue to add to your cinema room as you go." data-dimension48="The Sonos Arc Ultra is the champion of soundbars for a reason. With unbeatable immersive sound that genuinely feels like it's coming from all around you and the iconic Sonos aesthetics, this is the perfect soundbar for those who want the best of the best and are happy to invest in their home cinema setup. Of course, the Sonos Arc Ultra is buildable with Sonos subs and rears, so you can continue to add to your cinema room as you go." data-dimension25="$879" href="https://www.bestbuy.com/product/sonos-arc-ultra-soundbar-black/J39H373F2S" 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:120.00%;"><img id="6G59Y4BtSpscX3WCZEnsj5" name="Sonos Arc Ultra" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6G59Y4BtSpscX3WCZEnsj5.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Sonos Arc Ultra is the champion of soundbars for a reason. With unbeatable immersive sound that genuinely feels like it's coming from all around you and the iconic Sonos aesthetics, this is the perfect soundbar for those who want the best of the best and are happy to invest in their home cinema setup. Of course, the Sonos Arc Ultra is buildable with Sonos subs and rears, so you can continue to add to your cinema room as you go. <a class="view-deal button" href="https://www.bestbuy.com/product/sonos-arc-ultra-soundbar-black/J39H373F2S" target="_blank" rel="nofollow" data-dimension112="0d5e56d9-6ba7-4d88-a073-35efc26cc37a" data-action="Deal Block" data-label="The Sonos Arc Ultra is the champion of soundbars for a reason. With unbeatable immersive sound that genuinely feels like it's coming from all around you and the iconic Sonos aesthetics, this is the perfect soundbar for those who want the best of the best and are happy to invest in their home cinema setup. Of course, the Sonos Arc Ultra is buildable with Sonos subs and rears, so you can continue to add to your cinema room as you go." data-dimension48="The Sonos Arc Ultra is the champion of soundbars for a reason. With unbeatable immersive sound that genuinely feels like it's coming from all around you and the iconic Sonos aesthetics, this is the perfect soundbar for those who want the best of the best and are happy to invest in their home cinema setup. Of course, the Sonos Arc Ultra is buildable with Sonos subs and rears, so you can continue to add to your cinema room as you go." data-dimension25="$879">View Deal</a></p></div><div class="product"><a data-dimension112="7590fe4b-edb7-47bf-ac7c-4da59c03021f" data-action="Deal Block" data-label="With a huge 11.1.4 channel arrangement, the Samsung Q990D is the best of the best. If you want a serious movie-theater-quality soundbar system, it's got to be the Q990D. This soundbar has a subwoofer and two rear speakers, meaning you get true Dolby Atmos. As with other 'Q' series Samsung soundbars, you also get access to premium AI-powered room calibration so your speakers adapt to your surroundings — not the other way around." data-dimension48="With a huge 11.1.4 channel arrangement, the Samsung Q990D is the best of the best. If you want a serious movie-theater-quality soundbar system, it's got to be the Q990D. This soundbar has a subwoofer and two rear speakers, meaning you get true Dolby Atmos. As with other 'Q' series Samsung soundbars, you also get access to premium AI-powered room calibration so your speakers adapt to your surroundings — not the other way around." data-dimension25="$999" href="https://www.bestbuy.com/product/samsung-hw-q990d-za-11-1-4-channel-q-series-soundbar-with-wireless-subwoofer-and-rear-speakers-dolby-atmos-and-q-symphony-black/J3ZYG2H93V" 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:120.00%;"><img id="qu867jreWrkXCd74uJZaHZ" name="Samsung HW-Q990D" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qu867jreWrkXCd74uJZaHZ.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With a huge 11.1.4 channel arrangement, the Samsung Q990D is the best of the best. If you want a serious movie-theater-quality soundbar system, it's got to be the Q990D. This soundbar has a subwoofer and two rear speakers, meaning you get <em>true</em> Dolby Atmos. As with other 'Q' series Samsung soundbars, you also get access to premium AI-powered room calibration so your speakers adapt to your surroundings — not the other way around. <a class="view-deal button" href="https://www.bestbuy.com/product/samsung-hw-q990d-za-11-1-4-channel-q-series-soundbar-with-wireless-subwoofer-and-rear-speakers-dolby-atmos-and-q-symphony-black/J3ZYG2H93V" target="_blank" rel="nofollow" data-dimension112="7590fe4b-edb7-47bf-ac7c-4da59c03021f" data-action="Deal Block" data-label="With a huge 11.1.4 channel arrangement, the Samsung Q990D is the best of the best. If you want a serious movie-theater-quality soundbar system, it's got to be the Q990D. This soundbar has a subwoofer and two rear speakers, meaning you get true Dolby Atmos. As with other 'Q' series Samsung soundbars, you also get access to premium AI-powered room calibration so your speakers adapt to your surroundings — not the other way around." data-dimension48="With a huge 11.1.4 channel arrangement, the Samsung Q990D is the best of the best. If you want a serious movie-theater-quality soundbar system, it's got to be the Q990D. This soundbar has a subwoofer and two rear speakers, meaning you get true Dolby Atmos. As with other 'Q' series Samsung soundbars, you also get access to premium AI-powered room calibration so your speakers adapt to your surroundings — not the other way around." data-dimension25="$999">View Deal</a></p></div><div class="product"><a data-dimension112="288ca9bf-efac-4c64-9aea-ee3344fb85b1" data-action="Deal Block" data-label="I tested the JBL Bar 1300 and fell in love. I have never experienced infatuation like it. With an unparalleled 11.1.4. channel configuration, crystal-clear dialogue, wireless rears, and fantastic automatic room calibration, the JBL Bar 1300 is the soundbar for serious home theater nerds. This model is brand-new, so you know it's got all the latest tech." data-dimension48="I tested the JBL Bar 1300 and fell in love. I have never experienced infatuation like it. With an unparalleled 11.1.4. channel configuration, crystal-clear dialogue, wireless rears, and fantastic automatic room calibration, the JBL Bar 1300 is the soundbar for serious home theater nerds. This model is brand-new, so you know it's got all the latest tech." data-dimension25="$1199" href="https://www.bestbuy.com/product/jbl-bar1300mk2-11-1-4-channel-soundbar-system-with-detachable-surround-speakers-and-dolby-atmos-and-dtsx-black/J7LXFW36KK" 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.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>I tested the JBL Bar 1300 and fell in <em>love</em>. I have never experienced infatuation like it. With an unparalleled 11.1.4. channel configuration, crystal-clear dialogue, wireless rears, and fantastic automatic room calibration, the JBL Bar 1300 is the soundbar for serious home theater nerds. This model is brand-new, so you know it's got all the latest tech. <a class="view-deal button" href="https://www.bestbuy.com/product/jbl-bar1300mk2-11-1-4-channel-soundbar-system-with-detachable-surround-speakers-and-dolby-atmos-and-dtsx-black/J7LXFW36KK" target="_blank" rel="nofollow" data-dimension112="288ca9bf-efac-4c64-9aea-ee3344fb85b1" data-action="Deal Block" data-label="I tested the JBL Bar 1300 and fell in love. I have never experienced infatuation like it. With an unparalleled 11.1.4. channel configuration, crystal-clear dialogue, wireless rears, and fantastic automatic room calibration, the JBL Bar 1300 is the soundbar for serious home theater nerds. This model is brand-new, so you know it's got all the latest tech." data-dimension48="I tested the JBL Bar 1300 and fell in love. I have never experienced infatuation like it. With an unparalleled 11.1.4. channel configuration, crystal-clear dialogue, wireless rears, and fantastic automatic room calibration, the JBL Bar 1300 is the soundbar for serious home theater nerds. This model is brand-new, so you know it's got all the latest tech." data-dimension25="$1199">View Deal</a></p></div><p><em>For more discounts, check out our </em><a href="https://www.tomsguide.com/live/news/black-friday-deals-ultimate-guide-my-top-picks-2025"><em>Cyber Monday deals live blog</em></a><em>.</em></p><h3 class="article-body__section" id="section-shop-today-s-best-cyber-monday-deals"><span>Shop today's best Cyber Monday deals</span></h3><ul><li><strong>Amazon: </strong><a href="https://www.amazon.com/b?node=210998206011" target="_blank" rel="nofollow"><strong>50% off Ring, Ninja, AirPods and more</strong></a><strong></strong></li><li><strong>Walmart Plus: </strong><a href="https://www.walmart.com/plus" target="_blank" rel="nofollow"><strong>50% off @ Walmart</strong></a></li><li><strong>REI: </strong><a href="https://www.rei.com/f/scd-deals" target="_blank" rel="nofollow"><strong>half-off Arc'teryx, Patagonia, more</strong></a><strong></strong></li><li><strong>Dell: </strong><a href="https://www.dell.com/en-us/shop/deals?sortBy=price-ascending" target="_blank" rel="nofollow"><strong>monitors from $69, laptops from $299</strong></a><strong></strong></li><li><strong>Nectar: </strong><a href="https://www.nectarsleep.com/" target="_blank" rel="nofollow"><strong>50% off mattresses + bundles</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/all-electronics-on-sale/all-computers-tablets-on-sale/pcmcat1632941704767.c?id=pcmcat1632941704767" target="_blank" rel="nofollow"><strong>laptops from $149</strong></a><strong></strong></li><li><strong>Lenovo: </strong><a href="https://www.lenovo.com/us/en/d/deals/laptops/?IPromoID=LEN380027&sortBy=priceUp" target="_blank" rel="nofollow"><strong>doorbuster deals from $319</strong></a><strong></strong></li><li><strong>Wayfair: </strong><a href="https://www.wayfair.com/daily-sales" target="_blank" rel="nofollow"><strong>up to 80% off home decor</strong></a><strong></strong></li><li><strong>Lululemon: </strong><a href="https://shop.lululemon.com/c/we-made-too-much/n18mhd?Ns=price%7C0" target="_blank" rel="nofollow"><strong>top picks from $9</strong></a><strong></strong></li><li><strong>Newegg: </strong><a href="https://www.newegg.com/Black-November-Early-Access/EventSaleStore/ID-1132" target="_blank" rel="nofollow"><strong>Doorbuster deals from $6</strong></a></li><li><strong>Walmart: </strong><a href="https://www.walmart.com/cp/gifts/3131907" target="_blank" rel="nofollow"><strong>holiday gifts from $15</strong></a></li><li><strong>Birkenstock: </strong><a href="https://www.nordstrom.com/browse/sale?sort=PercentOff&filterByBrand=birkenstock" target="_blank" rel="nofollow"><strong>deals from $20 @ Nordstrom</strong></a><strong></strong></li><li><strong>Saatva: </strong><a href="https://www.saatva.com/mattresses/saatva-classic?utm_source=futurepublishing&utm_medium=affiliate&coupon=awyqqgzvxqicebab" target="_blank" rel="nofollow"><strong>luxury mattresses from $1,099</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I'm an audio expert, and I'm tracking the 37+ best Black Friday headphones deals LIVE: Up to 51% off AirPods, Bose, and more ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/live/news/black-friday-2025-headphone-earbud-deals-airpods-sony-bose</link>
                                                                            <description>
                            <![CDATA[ Don't miss these massive savings ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">sfmK36trm38od373FubNkB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ZXict8KPMMTVfT9c7GJdDF-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 26 Nov 2025 13:39:16 +0000</pubDate>                                                                                                                                <updated>Fri, 28 Nov 2025 16:48:39 +0000</updated>
                                                                                                                                            <category><![CDATA[Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                        <dc:contributor><![CDATA[ Erin Bashford ]]></dc:contributor>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ZXict8KPMMTVfT9c7GJdDF-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple, Sony, Bose, Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Headphones deals]]></media:description>                                                            <media:text><![CDATA[Headphones deals]]></media:text>
                                <media:title type="plain"><![CDATA[Headphones deals]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ZXict8KPMMTVfT9c7GJdDF-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Black Friday headphones 2025</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="ZXict8KPMMTVfT9c7GJdDF" name="Headphones deals" caption="" alt="Headphones deals" src="https://cdn.mos.cms.futurecdn.net/ZXict8KPMMTVfT9c7GJdDF.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: Apple, Sony, Bose, Tom's Guide)</span></figcaption></figure><p class="fancy-box__body-text">1.  <a data-analytics-id="inline-link" href="#section-quick-links">Quick Links</a><br>2. <a data-analytics-id="inline-link" href="#section-black-friday-headphones">Headphones deals</a><br>3. <a data-analytics-id="inline-link" href="#live">Earbuds deals</a></p></div></div><p>The <a href="https://www.tomsguide.com/live/news/ive-picked-the-best-early-black-friday-deals-november-2025">Black Friday sales</a> are here! With the lowest prices on loads of different headphones and earbuds. But which should you buy? That's a tricky question, but one that I am ready to help you answer. </p><p>The AirPods Max are down to their lowest price, as well as the AirPods 4. Then, the Sony WH-1000XM5 have been reduced to fresh lows, not to be beaten by Apple — followed suit by Bose and some deals on its QuietComfort line.</p><ul><li><a href="https://www.amazon.com/blackfriday" target="_blank" rel="nofollow"><strong>Shop Amazon's entire Black Friday sale</strong></a></li></ul><p>I've got some great recommendations for even cheaper headphones and earbuds, though. If you want something that will set you back less than $50, you should check out the <a href="https://www.amazon.com/dp/B0D83J6JJ9/" target="_blank" rel="nofollow">Nothing CMF Buds Pro 2 for $47 at Amazon</a>. We gave these fantastic earbuds a lovely 4.5-star rating in our review. </p><p>If you want the best Black Friday deals on headphones, make sure to keep checking back here for all the updates on the deals as I find them. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick links</span></h3><ul><li><strong>JLab Go Air Pop earbuds: </strong><a href="https://www.walmart.com/ip/JLab-Go-Air-Pop-True-Wireless-Earbuds-w-Charging-Case-Slate/799981023?" target="_blank" rel="nofollow"><strong>was $29 now $9 @ Walmart</strong></a><strong></strong></li><li><strong>AirPods 4: </strong><a href="https://www.amazon.com/dp/B0DGHMNQ5Z/" target="_blank" rel="nofollow"><strong>was $129 now $69 @ Amazon</strong></a><strong></strong></li><li><strong>Nothing Ear (a): </strong><a href="https://www.amazon.com/dp/B0CXPRHTNB?" target="_blank" rel="nofollow"><strong>was $109 now $59 @ Amazon</strong></a></li><li><strong>Sony WF-C710N: </strong><a href="https://www.bestbuy.com/product/sony-wf-c710n-truly-wireless-noise-canceling-earbuds-glass-blue/J7XSRH5Q5T/sku/6620464" target="_blank" rel="nofollow"><strong>was $129 now $79 @ Best Buy</strong></a></li><li><strong>Sony WH-CH720N: </strong><a href="https://www.amazon.com/dp/B0BS74M665?" target="_blank" rel="nofollow"><strong>was $179 now $88 @ Amazon</strong></a></li><li><strong>Bose QuietComfort Earbuds: </strong><a href="https://www.amazon.com/dp/B0D8BZDPXB/" target="_blank" rel="nofollow"><strong>was $179 now $129 @ Amazon</strong></a></li><li><strong>Sony WH-1000XM4: </strong><a href="https://www.amazon.com/dp/B08MVGF24M/" target="_blank" rel="nofollow"><strong>was $349 now $159 @ Amazon</strong></a><strong></strong></li><li><strong>Bose QuietComfort Headphones: </strong><a href="https://www.amazon.com/dp/B0CCZ26B5V/" target="_blank" rel="nofollow"><strong>was $349 now $199 @ Amazon</strong></a></li><li><strong>Bose QuietComfort Ultra Earbuds gen 2: </strong><a href="https://www.amazon.com/dp/B0F7M3HPBD/" target="_blank" rel="nofollow"><strong>was $299 now $216 @ Amazon</strong></a></li><li><strong>AirPods Pro 3: </strong><a href="https://www.amazon.com/dp/B0FQFB8FMG/" target="_blank" rel="nofollow"><strong>was $249 now $219 @ Amazon</strong></a></li><li><strong>Sony WF-1000XM5: </strong><a href="https://www.amazon.com/dp/B0C345M3T7/" target="_blank" rel="nofollow"><strong>was $329 now $228 @ Amazon</strong></a></li><li><strong>Bose QuietComfort Ultra Headphones: </strong><a href="https://www.amazon.com/dp/B0CCZ1L489/" target="_blank" rel="nofollow"><strong>was $429 now $298 @ Amazon</strong></a><strong></strong></li><li><strong>Sony WH-1000XM6: </strong><a href="https://www.amazon.com/dp/B0F3QJLD3B/?th=1" target="_blank" rel="nofollow"><strong>was $459 now $398 @ Amazon</strong></a></li></ul><h3 class="article-body__section" id="section-my-top-5-deals"><span>My top 5 deals</span></h3><div class="product"><a data-dimension112="f5bd8e10-f4cd-4f56-9555-9346cd3e6194" data-action="Deal Block" data-label="These are some of the newest buds on the list, and pack some great features in for a bargain price. The ANC is excellent, the fit is very comfortable, and the 43 hours of battery life is exemplary. We particularly like the orange colorway. They're so new that this is the first discount we've seen on the buds." data-dimension48="These are some of the newest buds on the list, and pack some great features in for a bargain price. The ANC is excellent, the fit is very comfortable, and the 43 hours of battery life is exemplary. We particularly like the orange colorway. They're so new that this is the first discount we've seen on the buds." data-dimension25="$47" href="https://www.amazon.com/dp/B0D836988S?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:978px;"><p class="vanilla-image-block" style="padding-top:122.09%;"><img id="7wasxPqe5698hiHYZvXn9W" name="61YeKJu7oML._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7wasxPqe5698hiHYZvXn9W.jpg" mos="" align="middle" fullscreen="" width="978" height="1194" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These are some of the newest buds on the list, and pack some great features in for a bargain price. The ANC is excellent, the fit is very comfortable, and the 43 hours of battery life is exemplary. We particularly like the orange colorway. They're so new that this is the first discount we've seen on the buds.<a class="view-deal button" href="https://www.amazon.com/dp/B0D836988S?" target="_blank" rel="nofollow" data-dimension112="f5bd8e10-f4cd-4f56-9555-9346cd3e6194" data-action="Deal Block" data-label="These are some of the newest buds on the list, and pack some great features in for a bargain price. The ANC is excellent, the fit is very comfortable, and the 43 hours of battery life is exemplary. We particularly like the orange colorway. They're so new that this is the first discount we've seen on the buds." data-dimension48="These are some of the newest buds on the list, and pack some great features in for a bargain price. The ANC is excellent, the fit is very comfortable, and the 43 hours of battery life is exemplary. We particularly like the orange colorway. They're so new that this is the first discount we've seen on the buds." data-dimension25="$47">View Deal</a></p></div><div class="product"><a data-dimension112="c9b98149-f04d-437c-853f-c2372e0d05c5" data-action="Deal Block" data-label="The AirPods Pro 3 are the newest AirPods, but we've still got a tasty Black Friday deal to enjoy. You get up to 10 hours of battery and some great sound out of the buds, as well as their useful Apple-centric features." data-dimension48="The AirPods Pro 3 are the newest AirPods, but we've still got a tasty Black Friday deal to enjoy. You get up to 10 hours of battery and some great sound out of the buds, as well as their useful Apple-centric features." data-dimension25="$219" href="https://www.amazon.com/dp/B0FQFB8FMG/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:842px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="FYzcjQSdtuwidVacXmMNL5" name="AirPods Pro 3.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FYzcjQSdtuwidVacXmMNL5.jpg" mos="" align="middle" fullscreen="" width="842" height="842" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The AirPods Pro 3 are the newest AirPods, but we've still got a tasty Black Friday deal to enjoy. You get up to 10 hours of battery and some great sound out of the buds, as well as their useful Apple-centric features.<a class="view-deal button" href="https://www.amazon.com/dp/B0FQFB8FMG/" target="_blank" rel="nofollow" data-dimension112="c9b98149-f04d-437c-853f-c2372e0d05c5" data-action="Deal Block" data-label="The AirPods Pro 3 are the newest AirPods, but we've still got a tasty Black Friday deal to enjoy. You get up to 10 hours of battery and some great sound out of the buds, as well as their useful Apple-centric features." data-dimension48="The AirPods Pro 3 are the newest AirPods, but we've still got a tasty Black Friday deal to enjoy. You get up to 10 hours of battery and some great sound out of the buds, as well as their useful Apple-centric features." data-dimension25="$219">View Deal</a></p></div><div class="product"><a data-dimension112="5fc20abe-27ac-4fcb-850c-fca8631399e7" data-action="Deal Block" data-label="Sony's latest ANC cans bring a whole host of great features. A more comfortable fit, better sound, and improved ANC as well as 30 hours of battery life. This deal is the first we've seen, and it's a great saving." data-dimension48="Sony's latest ANC cans bring a whole host of great features. A more comfortable fit, better sound, and improved ANC as well as 30 hours of battery life. This deal is the first we've seen, and it's a great saving." data-dimension25="$398" href="https://www.amazon.com/dp/B0F3QJLD3B/?th=1" 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:120.00%;"><img id="x3hpHUb8bPXUJsBkoevKDN" name="Sony WH-1000XM6" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/x3hpHUb8bPXUJsBkoevKDN.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Sony's latest ANC cans bring a whole host of great features. A more comfortable fit, better sound, and improved ANC as well as 30 hours of battery life. This deal is the first we've seen, and it's a great saving.<a class="view-deal button" href="https://www.amazon.com/dp/B0F3QJLD3B/?th=1" target="_blank" rel="nofollow" data-dimension112="5fc20abe-27ac-4fcb-850c-fca8631399e7" data-action="Deal Block" data-label="Sony's latest ANC cans bring a whole host of great features. A more comfortable fit, better sound, and improved ANC as well as 30 hours of battery life. This deal is the first we've seen, and it's a great saving." data-dimension48="Sony's latest ANC cans bring a whole host of great features. A more comfortable fit, better sound, and improved ANC as well as 30 hours of battery life. This deal is the first we've seen, and it's a great saving." data-dimension25="$398">View Deal</a></p></div><div class="product"><a data-dimension112="9fe3017c-3873-443c-98c4-55e04142a3bd" data-action="Deal Block" data-label="Price Check: $399 @ Amazon (certain colors)" data-dimension48="Price Check: $399 @ Amazon (certain colors)" data-dimension25="$399" href="https://www.bestbuy.com/product/apple-airpods-max-usb-c-midnight/JJGCQ3ZZ3Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1509px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="YXPxtrVgnPf6SLRVijpsJi" name="AirPods Max.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YXPxtrVgnPf6SLRVijpsJi.jpg" mos="" align="middle" fullscreen="" width="1509" height="1509" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The AirPods Max with USB-C are the headphones to get if you want the ultimate in sound and noise cancelation in once package. You also get a premium design with five color options, personalized Spatial Audio and a decent 20 hours of battery life.</p><p><strong>Price Check: </strong><a href="https://www.amazon.com/dp/B0DGJC52FP/ref=fs_a_mdt2_us2?th=1" target="_blank" rel="nofollow" data-dimension112="9fe3017c-3873-443c-98c4-55e04142a3bd" data-action="Deal Block" data-label="Price Check: $399 @ Amazon (certain colors)" data-dimension48="Price Check: $399 @ Amazon (certain colors)" data-dimension25="$399"><strong>$399 @ Amazon (certain colors)</strong></a><a class="view-deal button" href="https://www.bestbuy.com/product/apple-airpods-max-usb-c-midnight/JJGCQ3ZZ3Q" target="_blank" rel="nofollow" data-dimension112="9fe3017c-3873-443c-98c4-55e04142a3bd" data-action="Deal Block" data-label="Price Check: $399 @ Amazon (certain colors)" data-dimension48="Price Check: $399 @ Amazon (certain colors)" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="2bf1a87d-ee6f-44d1-b54e-63bfc675f9a9" data-action="Deal Block" data-label="Bose's newest headphones bring the best ANC around, and offer 30 hours of battery. They sound good, and they're very comfortable — this is their best saving yet." data-dimension48="Bose's newest headphones bring the best ANC around, and offer 30 hours of battery. They sound good, and they're very comfortable — this is their best saving yet." data-dimension25="$399" href="https://www.amazon.com/dp/B0FDKR293G/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:816px;"><p class="vanilla-image-block" style="padding-top:124.39%;"><img id="YCmxJDRLZYcSDoxQ8fMynC" name="QuietComfort Ultra Gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YCmxJDRLZYcSDoxQ8fMynC.png" mos="" align="middle" fullscreen="" width="816" height="1015" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Bose's newest headphones bring the best ANC around, and offer 30 hours of battery. They sound good, and they're very comfortable — this is their best saving yet.<a class="view-deal button" href="https://www.amazon.com/dp/B0FDKR293G/" target="_blank" rel="nofollow" data-dimension112="2bf1a87d-ee6f-44d1-b54e-63bfc675f9a9" data-action="Deal Block" data-label="Bose's newest headphones bring the best ANC around, and offer 30 hours of battery. They sound good, and they're very comfortable — this is their best saving yet." data-dimension48="Bose's newest headphones bring the best ANC around, and offer 30 hours of battery. They sound good, and they're very comfortable — this is their best saving yet." data-dimension25="$399">View Deal</a></p></div><h3 class="article-body__section" id="section-black-friday-earbuds"><span>Black Friday earbuds</span></h3><div class="product"><a data-dimension112="c7d5bfeb-80df-440f-b28e-29b5e0e091f6" data-action="Deal Block" data-label="The AirPods 4 are the cheapest AirPods option, but still pack in Spatial Audio and the special AirPods connection with Apple devices. 5 hours of battery isn't quite enough, though. This is their lowest price ever for a great deal." data-dimension48="The AirPods 4 are the cheapest AirPods option, but still pack in Spatial Audio and the special AirPods connection with Apple devices. 5 hours of battery isn't quite enough, though. This is their lowest price ever for a great deal." data-dimension25="$69" href="https://www.amazon.com/dp/B0DGHMNQ5Z/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:225px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="SqrmdVjagrzjgHVourtnUW" name="AirPods 4.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SqrmdVjagrzjgHVourtnUW.jpg" mos="" align="middle" fullscreen="" width="225" height="225" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The AirPods 4 are the cheapest AirPods option, but still pack in Spatial Audio and the special AirPods connection with Apple devices. 5 hours of battery isn't quite enough, though. This is their lowest price ever for a great deal.<a class="view-deal button" href="https://www.amazon.com/dp/B0DGHMNQ5Z/" target="_blank" rel="nofollow" data-dimension112="c7d5bfeb-80df-440f-b28e-29b5e0e091f6" data-action="Deal Block" data-label="The AirPods 4 are the cheapest AirPods option, but still pack in Spatial Audio and the special AirPods connection with Apple devices. 5 hours of battery isn't quite enough, though. This is their lowest price ever for a great deal." data-dimension48="The AirPods 4 are the cheapest AirPods option, but still pack in Spatial Audio and the special AirPods connection with Apple devices. 5 hours of battery isn't quite enough, though. This is their lowest price ever for a great deal." data-dimension25="$69">View Deal</a></p></div><div class="product"><a data-dimension112="6aa7092c-ac02-42a7-be89-0a7ea15e796f" data-action="Deal Block" data-label="The Soundcore P30i give you everything you need out of earbuds without costing the world. They've got solid sound, ANC to block out noise, and 45 hours to keep the music playing. There are some fetching colors as well. This $20 saving brings them down to their lowest price ever." data-dimension48="The Soundcore P30i give you everything you need out of earbuds without costing the world. They've got solid sound, ANC to block out noise, and 45 hours to keep the music playing. There are some fetching colors as well. This $20 saving brings them down to their lowest price ever." data-dimension25="$24" href="https://www.amazon.com/dp/B0CRTN7C8C?" 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="MGAmqkQgXKBS2JCUpwAVwY" name="soundcore p30i" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/MGAmqkQgXKBS2JCUpwAVwY.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Soundcore P30i give you everything you need out of earbuds without costing the world. They've got solid sound, ANC to block out noise, and 45 hours to keep the music playing. There are some fetching colors as well. This $20 saving brings them down to their lowest price ever.<a class="view-deal button" href="https://www.amazon.com/dp/B0CRTN7C8C?" target="_blank" rel="nofollow" data-dimension112="6aa7092c-ac02-42a7-be89-0a7ea15e796f" data-action="Deal Block" data-label="The Soundcore P30i give you everything you need out of earbuds without costing the world. They've got solid sound, ANC to block out noise, and 45 hours to keep the music playing. There are some fetching colors as well. This $20 saving brings them down to their lowest price ever." data-dimension48="The Soundcore P30i give you everything you need out of earbuds without costing the world. They've got solid sound, ANC to block out noise, and 45 hours to keep the music playing. There are some fetching colors as well. This $20 saving brings them down to their lowest price ever." data-dimension25="$24">View Deal</a></p></div><div class="product"><a data-dimension112="c1d5f6f5-d8b3-4ebd-94d9-d65acf37f3de" data-action="Deal Block" data-label="The EarFun Air Pro 4+ perform like much pricier earbuds. With an unkillable 45+ hour battery life and dual drivers for rich bass and melodic treble, these earbuds are the best option for audiophiles on a serious budget." data-dimension48="The EarFun Air Pro 4+ perform like much pricier earbuds. With an unkillable 45+ hour battery life and dual drivers for rich bass and melodic treble, these earbuds are the best option for audiophiles on a serious budget." data-dimension25="$74" href="https://www.amazon.com/EarFun-Adaptive-Cancelling-Snapdragon-Bluetooth/dp/B0FSKRJFKT" 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:120.00%;"><img id="6osKnUYAmrQXowPHgdGud9" name="EarFun Air Pro 4+" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6osKnUYAmrQXowPHgdGud9.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The EarFun Air Pro 4+ perform like much pricier earbuds. With an unkillable 45+ hour battery life and dual drivers for rich bass and melodic treble, these earbuds are the best option for audiophiles on a serious budget. <a class="view-deal button" href="https://www.amazon.com/EarFun-Adaptive-Cancelling-Snapdragon-Bluetooth/dp/B0FSKRJFKT" target="_blank" rel="nofollow" data-dimension112="c1d5f6f5-d8b3-4ebd-94d9-d65acf37f3de" data-action="Deal Block" data-label="The EarFun Air Pro 4+ perform like much pricier earbuds. With an unkillable 45+ hour battery life and dual drivers for rich bass and melodic treble, these earbuds are the best option for audiophiles on a serious budget." data-dimension48="The EarFun Air Pro 4+ perform like much pricier earbuds. With an unkillable 45+ hour battery life and dual drivers for rich bass and melodic treble, these earbuds are the best option for audiophiles on a serious budget." data-dimension25="$74">View Deal</a></p></div><div class="product"><a data-dimension112="8b1bff66-3005-45f7-a5bd-14105598d564" data-action="Deal Block" data-label="These little buds feature LDAC support for better sound quality. 40 hours of battery life make sure they'll last you a long time, and IPX7 ensures that you won't break them if you get them sweaty at the gym. This $10 discount brings them to a more affordable price than ever." data-dimension48="These little buds feature LDAC support for better sound quality. 40 hours of battery life make sure they'll last you a long time, and IPX7 ensures that you won't break them if you get them sweaty at the gym. This $10 discount brings them to a more affordable price than ever." data-dimension25="$34" href="https://www.amazon.com/dp/B0CR8XTJDW?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="pdwwxRArMtBK7nuw44hr3W" name="EarFun-Air-2-deal-box" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/pdwwxRArMtBK7nuw44hr3W.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These little buds feature LDAC support for better sound quality. 40 hours of battery life make sure they'll last you a long time, and IPX7 ensures that you won't break them if you get them sweaty at the gym. This $10 discount brings them to a more affordable price than ever.<a class="view-deal button" href="https://www.amazon.com/dp/B0CR8XTJDW?" target="_blank" rel="nofollow" data-dimension112="8b1bff66-3005-45f7-a5bd-14105598d564" data-action="Deal Block" data-label="These little buds feature LDAC support for better sound quality. 40 hours of battery life make sure they'll last you a long time, and IPX7 ensures that you won't break them if you get them sweaty at the gym. This $10 discount brings them to a more affordable price than ever." data-dimension48="These little buds feature LDAC support for better sound quality. 40 hours of battery life make sure they'll last you a long time, and IPX7 ensures that you won't break them if you get them sweaty at the gym. This $10 discount brings them to a more affordable price than ever." data-dimension25="$34">View Deal</a></p></div><div class="product"><a data-dimension112="12dd8134-73af-4c16-bf1e-76ce8ba25ed9" data-action="Deal Block" data-label="The Life A1 feature 40 hours of battery life, so they're sure to last you through a weeks use. You can even customize the sound to your liking with the Soundcore app. The fitting wings make them perfectly suited to gym use and exercise. This deal brings them $5 off their lowest-ever price." data-dimension48="The Life A1 feature 40 hours of battery life, so they're sure to last you through a weeks use. You can even customize the sound to your liking with the Soundcore app. The fitting wings make them perfectly suited to gym use and exercise. This deal brings them $5 off their lowest-ever price." data-dimension25="$32" href="https://www.amazon.com/dp/B08KDZ2NZX?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1279px;"><p class="vanilla-image-block" style="padding-top:104.61%;"><img id="eVfXdWKhFSPSwprUcu44Qk" name="Life A1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/eVfXdWKhFSPSwprUcu44Qk.png" mos="" align="middle" fullscreen="" width="1279" height="1338" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Life A1 feature 40 hours of battery life, so they're sure to last you through a weeks use. You can even customize the sound to your liking with the Soundcore app. The fitting wings make them perfectly suited to gym use and exercise. This deal brings them $5 off their lowest-ever price.<a class="view-deal button" href="https://www.amazon.com/dp/B08KDZ2NZX?" target="_blank" rel="nofollow" data-dimension112="12dd8134-73af-4c16-bf1e-76ce8ba25ed9" data-action="Deal Block" data-label="The Life A1 feature 40 hours of battery life, so they're sure to last you through a weeks use. You can even customize the sound to your liking with the Soundcore app. The fitting wings make them perfectly suited to gym use and exercise. This deal brings them $5 off their lowest-ever price." data-dimension48="The Life A1 feature 40 hours of battery life, so they're sure to last you through a weeks use. You can even customize the sound to your liking with the Soundcore app. The fitting wings make them perfectly suited to gym use and exercise. This deal brings them $5 off their lowest-ever price." data-dimension25="$32">View Deal</a></p></div><div class="product"><a data-dimension112="798006fc-54f8-4130-adfd-c6f51a28e638" data-action="Deal Block" data-label="These buds are some of the best-sounding earbuds for the price. There's LDAC support for hi-res listening on the go, and ANC to make sure that you can hear it. 45 hours of battery life is pretty epic to boot, and they're comfortable enough to wear them for the whole time. You need to be an Amazon Prime member to get this deal." data-dimension48="These buds are some of the best-sounding earbuds for the price. There's LDAC support for hi-res listening on the go, and ANC to make sure that you can hear it. 45 hours of battery life is pretty epic to boot, and they're comfortable enough to wear them for the whole time. You need to be an Amazon Prime member to get this deal." data-dimension25="$46" href="https://www.amazon.com/dp/B0BNNMYSGQ?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1228px;"><p class="vanilla-image-block" style="padding-top:99.59%;"><img id="Cgp37AGa6qGPskXkFNeykH" name="Earfun-Air-Pro-3-deal.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Cgp37AGa6qGPskXkFNeykH.jpg" mos="" align="middle" fullscreen="" width="1228" height="1223" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These buds are some of the best-sounding earbuds for the price. There's LDAC support for hi-res listening on the go, and ANC to make sure that you can hear it. 45 hours of battery life is pretty epic to boot, and they're comfortable enough to wear them for the whole time. You need to be an Amazon Prime member to get this deal.<a class="view-deal button" href="https://www.amazon.com/dp/B0BNNMYSGQ?" target="_blank" rel="nofollow" data-dimension112="798006fc-54f8-4130-adfd-c6f51a28e638" data-action="Deal Block" data-label="These buds are some of the best-sounding earbuds for the price. There's LDAC support for hi-res listening on the go, and ANC to make sure that you can hear it. 45 hours of battery life is pretty epic to boot, and they're comfortable enough to wear them for the whole time. You need to be an Amazon Prime member to get this deal." data-dimension48="These buds are some of the best-sounding earbuds for the price. There's LDAC support for hi-res listening on the go, and ANC to make sure that you can hear it. 45 hours of battery life is pretty epic to boot, and they're comfortable enough to wear them for the whole time. You need to be an Amazon Prime member to get this deal." data-dimension25="$46">View Deal</a></p></div><div class="product"><a data-dimension112="f081b0b8-890a-46ba-9d75-3b51104d8f21" data-action="Deal Block" data-label="These are some of the newest buds on the list, and pack some great features in for a bargain price. The ANC is excellent, the fit is very comfortable, and the 43 hours of battery life is exemplary. We particularly like the orange colorway. They're so new that this is the first discount we've seen on the buds." data-dimension48="These are some of the newest buds on the list, and pack some great features in for a bargain price. The ANC is excellent, the fit is very comfortable, and the 43 hours of battery life is exemplary. We particularly like the orange colorway. They're so new that this is the first discount we've seen on the buds." data-dimension25="$47" href="https://www.amazon.com/dp/B0D836988S?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:978px;"><p class="vanilla-image-block" style="padding-top:122.09%;"><img id="7wasxPqe5698hiHYZvXn9W" name="61YeKJu7oML._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7wasxPqe5698hiHYZvXn9W.jpg" mos="" align="middle" fullscreen="" width="978" height="1194" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These are some of the newest buds on the list, and pack some great features in for a bargain price. The ANC is excellent, the fit is very comfortable, and the 43 hours of battery life is exemplary. We particularly like the orange colorway. They're so new that this is the first discount we've seen on the buds.<a class="view-deal button" href="https://www.amazon.com/dp/B0D836988S?" target="_blank" rel="nofollow" data-dimension112="f081b0b8-890a-46ba-9d75-3b51104d8f21" data-action="Deal Block" data-label="These are some of the newest buds on the list, and pack some great features in for a bargain price. The ANC is excellent, the fit is very comfortable, and the 43 hours of battery life is exemplary. We particularly like the orange colorway. They're so new that this is the first discount we've seen on the buds." data-dimension48="These are some of the newest buds on the list, and pack some great features in for a bargain price. The ANC is excellent, the fit is very comfortable, and the 43 hours of battery life is exemplary. We particularly like the orange colorway. They're so new that this is the first discount we've seen on the buds." data-dimension25="$47">View Deal</a></p></div><div class="product"><a data-dimension112="b884a83d-47d4-4901-841b-ad1a992e945d" data-action="Deal Block" data-label="With 60 hours of battery life on tap, there's no way you're running out of battery life before you're done. The P40i also feature solid sound, a comfortable fit, and the case can turn into a phone stand for train journeys. This price is $10 off their lowest price." data-dimension48="With 60 hours of battery life on tap, there's no way you're running out of battery life before you're done. The P40i also feature solid sound, a comfortable fit, and the case can turn into a phone stand for train journeys. This price is $10 off their lowest price." data-dimension25="$41" href="https://www.amazon.com/dp/B0CQXKXBR7?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:879px;"><p class="vanilla-image-block" style="padding-top:170.65%;"><img id="BBxLdJuUqdNp2GhUrM79oF" name="P40i" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BBxLdJuUqdNp2GhUrM79oF.png" mos="" align="middle" fullscreen="" width="879" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With 60 hours of battery life on tap, there's no way you're running out of battery life before you're done. The P40i also feature solid sound, a comfortable fit, and the case can turn into a phone stand for train journeys. This price is $10 off their lowest price.<a class="view-deal button" href="https://www.amazon.com/dp/B0CQXKXBR7?" target="_blank" rel="nofollow" data-dimension112="b884a83d-47d4-4901-841b-ad1a992e945d" data-action="Deal Block" data-label="With 60 hours of battery life on tap, there's no way you're running out of battery life before you're done. The P40i also feature solid sound, a comfortable fit, and the case can turn into a phone stand for train journeys. This price is $10 off their lowest price." data-dimension48="With 60 hours of battery life on tap, there's no way you're running out of battery life before you're done. The P40i also feature solid sound, a comfortable fit, and the case can turn into a phone stand for train journeys. This price is $10 off their lowest price." data-dimension25="$41">View Deal</a></p></div><div class="product"><a data-dimension112="f73c062d-c3f9-4543-8db3-0c0c55f75fea" data-action="Deal Block" data-label="These earbuds feature hooks to make sure they stay on while you're exercising. 40 hours of battery life overall means they'll last a long time as well, so you could go for a really long run. Really long. The case is slightly larger to accommodate those earhooks." data-dimension48="These earbuds feature hooks to make sure they stay on while you're exercising. 40 hours of battery life overall means they'll last a long time as well, so you could go for a really long run. Really long. The case is slightly larger to accommodate those earhooks." data-dimension25="$59" href="https://www.bestbuy.com/product/jlab-epic-sport-anc-3-true-wireless-earbuds-black/J3GW8XZQZG" 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:96.00%;"><img id="U8ECUQDMBpVBh4baBmXWaV" name="Epic Sport ANC 3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/U8ECUQDMBpVBh4baBmXWaV.png" mos="" align="middle" fullscreen="" width="900" height="864" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These earbuds feature hooks to make sure they stay on while you're exercising. 40 hours of battery life overall means they'll last a long time as well, so you could go for a really long run. <em>Really </em>long. The case is slightly larger to accommodate those earhooks. <a class="view-deal button" href="https://www.bestbuy.com/product/jlab-epic-sport-anc-3-true-wireless-earbuds-black/J3GW8XZQZG" target="_blank" rel="nofollow" data-dimension112="f73c062d-c3f9-4543-8db3-0c0c55f75fea" data-action="Deal Block" data-label="These earbuds feature hooks to make sure they stay on while you're exercising. 40 hours of battery life overall means they'll last a long time as well, so you could go for a really long run. Really long. The case is slightly larger to accommodate those earhooks." data-dimension48="These earbuds feature hooks to make sure they stay on while you're exercising. 40 hours of battery life overall means they'll last a long time as well, so you could go for a really long run. Really long. The case is slightly larger to accommodate those earhooks." data-dimension25="$59">View Deal</a></p></div><div class="product"><a data-dimension112="00275368-79ed-4e3c-890d-96ebbcbf557f" data-action="Deal Block" data-label="The Beats Solo Buds will last 18 hours before the earbuds need a charge. That's more bud-battery than any other option on the list — although you do trade in case battery. Because there isn't any. They sound great and look pretty cool, too. They have been cheaper by $20 before, so watch out for even deeper discounts." data-dimension48="The Beats Solo Buds will last 18 hours before the earbuds need a charge. That's more bud-battery than any other option on the list — although you do trade in case battery. Because there isn't any. They sound great and look pretty cool, too. They have been cheaper by $20 before, so watch out for even deeper discounts." data-dimension25="$69" href="https://www.amazon.com/dp/B0D3J85SX4?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:756px;"><p class="vanilla-image-block" style="padding-top:94.84%;"><img id="4bnZgBwLtoS9XALFjoLqQG" name="Beats Solo buds.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4bnZgBwLtoS9XALFjoLqQG.jpg" mos="" align="middle" fullscreen="" width="756" height="717" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Beats Solo Buds will last 18 hours before the earbuds need a charge. That's more bud-battery than any other option on the list — although you do trade in case battery. Because there isn't any. They sound great and look pretty cool, too. They have been cheaper by $20 before, so watch out for even deeper discounts.<a class="view-deal button" href="https://www.amazon.com/dp/B0D3J85SX4?" target="_blank" rel="nofollow" data-dimension112="00275368-79ed-4e3c-890d-96ebbcbf557f" data-action="Deal Block" data-label="The Beats Solo Buds will last 18 hours before the earbuds need a charge. That's more bud-battery than any other option on the list — although you do trade in case battery. Because there isn't any. They sound great and look pretty cool, too. They have been cheaper by $20 before, so watch out for even deeper discounts." data-dimension48="The Beats Solo Buds will last 18 hours before the earbuds need a charge. That's more bud-battery than any other option on the list — although you do trade in case battery. Because there isn't any. They sound great and look pretty cool, too. They have been cheaper by $20 before, so watch out for even deeper discounts." data-dimension25="$69">View Deal</a></p></div><div class="product"><a data-dimension112="22317812-115d-4b6a-afe9-47e147b2d682" data-action="Deal Block" data-label="This deal brings the Ear (a) down to a more affordable price. You get AI integration, 42.5 hours of battery life and solid sound in exchange for your dollars. They also happen to look super cool thanks to Nothing's see-through design language." data-dimension48="This deal brings the Ear (a) down to a more affordable price. You get AI integration, 42.5 hours of battery life and solid sound in exchange for your dollars. They also happen to look super cool thanks to Nothing's see-through design language." data-dimension25="$59" href="https://www.amazon.com/dp/B0CXPRHTNB?" 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:75.47%;"><img id="4UeYeUY8VFjtYXhr49t9Xe" name="71KjGMCidYL._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4UeYeUY8VFjtYXhr49t9Xe.jpg" mos="" align="middle" fullscreen="" width="1500" height="1132" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This deal brings the Ear (a) down to a more affordable price. You get AI integration, 42.5 hours of battery life and solid sound in exchange for your dollars. They also happen to look super cool thanks to Nothing's see-through design language.<a class="view-deal button" href="https://www.amazon.com/dp/B0CXPRHTNB?" target="_blank" rel="nofollow" data-dimension112="22317812-115d-4b6a-afe9-47e147b2d682" data-action="Deal Block" data-label="This deal brings the Ear (a) down to a more affordable price. You get AI integration, 42.5 hours of battery life and solid sound in exchange for your dollars. They also happen to look super cool thanks to Nothing's see-through design language." data-dimension48="This deal brings the Ear (a) down to a more affordable price. You get AI integration, 42.5 hours of battery life and solid sound in exchange for your dollars. They also happen to look super cool thanks to Nothing's see-through design language." data-dimension25="$59">View Deal</a></p></div><div class="product"><a data-dimension112="cc0c2cac-e39c-46c2-ab88-d9f94adb6d54" data-action="Deal Block" data-label="The WF-C710N are some of the best noise-canceling earbuds under $200, so grabbing them for a sub-$100 price feels like theft. Great sound, excellent ANC, and a very comfortable fit. That Jolly Ranchers transparent blue is the icing on the cake." data-dimension48="The WF-C710N are some of the best noise-canceling earbuds under $200, so grabbing them for a sub-$100 price feels like theft. Great sound, excellent ANC, and a very comfortable fit. That Jolly Ranchers transparent blue is the icing on the cake." data-dimension25="$79" href="https://www.bestbuy.com/product/sony-wf-c710n-truly-wireless-noise-canceling-earbuds-glass-blue/J7XSRH5Q5T/sku/6620464" 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:120.00%;"><img id="r3fsKfXfrYb8dNBNK7cdoP" name="Sony C710N" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/r3fsKfXfrYb8dNBNK7cdoP.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The WF-C710N are some of the best noise-canceling earbuds under $200, so grabbing them for a sub-$100 price feels like theft. Great sound, excellent ANC, and a very comfortable fit. That Jolly Ranchers transparent blue is the icing on the cake.<a class="view-deal button" href="https://www.bestbuy.com/product/sony-wf-c710n-truly-wireless-noise-canceling-earbuds-glass-blue/J7XSRH5Q5T/sku/6620464" target="_blank" rel="nofollow" data-dimension112="cc0c2cac-e39c-46c2-ab88-d9f94adb6d54" data-action="Deal Block" data-label="The WF-C710N are some of the best noise-canceling earbuds under $200, so grabbing them for a sub-$100 price feels like theft. Great sound, excellent ANC, and a very comfortable fit. That Jolly Ranchers transparent blue is the icing on the cake." data-dimension48="The WF-C710N are some of the best noise-canceling earbuds under $200, so grabbing them for a sub-$100 price feels like theft. Great sound, excellent ANC, and a very comfortable fit. That Jolly Ranchers transparent blue is the icing on the cake." data-dimension25="$79">View Deal</a></p></div><div class="product"><a data-dimension112="3c81b229-5eb4-456a-a4a4-5fb72d013167" data-action="Deal Block" data-label="The Beats Studio Buds are still some of my favorite earbuds. They're tiny, and their case is perfectly sized to fit easily into a pocket. The ANC is good, the fit is comfortable and the battery life is solid." data-dimension48="The Beats Studio Buds are still some of my favorite earbuds. They're tiny, and their case is perfectly sized to fit easily into a pocket. The ANC is good, the fit is comfortable and the battery life is solid." data-dimension25="$99" href="https://www.bestbuy.com/product/beats-studio-buds-totally-wireless-noise-cancelling-earbuds-black/JJ8ZHSC485" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:623px;"><p class="vanilla-image-block" style="padding-top:84.75%;"><img id="ofdBF2NRq4xuVjpNPs2zTG" name="Beats Studio Buds.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ofdBF2NRq4xuVjpNPs2zTG.jpg" mos="" align="middle" fullscreen="" width="623" height="528" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Beats Studio Buds are still some of my favorite earbuds. They're tiny, and their case is perfectly sized to fit easily into a pocket. The ANC is good, the fit is comfortable and the battery life is solid. <a class="view-deal button" href="https://www.bestbuy.com/product/beats-studio-buds-totally-wireless-noise-cancelling-earbuds-black/JJ8ZHSC485" target="_blank" rel="nofollow" data-dimension112="3c81b229-5eb4-456a-a4a4-5fb72d013167" data-action="Deal Block" data-label="The Beats Studio Buds are still some of my favorite earbuds. They're tiny, and their case is perfectly sized to fit easily into a pocket. The ANC is good, the fit is comfortable and the battery life is solid." data-dimension48="The Beats Studio Buds are still some of my favorite earbuds. They're tiny, and their case is perfectly sized to fit easily into a pocket. The ANC is good, the fit is comfortable and the battery life is solid." data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="4c01f8e3-a85d-4c67-8982-113eda1392a1" data-action="Deal Block" data-label="These are a cost effective way of blocking out lots and lots of noise. The ANC is excellent and the sound is good too — and thanks to this Black Friday deal, they're a great price." data-dimension48="These are a cost effective way of blocking out lots and lots of noise. The ANC is excellent and the sound is good too — and thanks to this Black Friday deal, they're a great price." data-dimension25="$129" href="https://www.amazon.com/dp/B0D8BZDPXB/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:95.55%;"><img id="gng2pmSiBsvdSJEfE2mEde" name="Bose QuietComfort Earbuds" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/gng2pmSiBsvdSJEfE2mEde.png" mos="" align="middle" fullscreen="" width="1280" height="1223" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These are a cost effective way of blocking out lots and lots of noise. The ANC is excellent and the sound is good too — and thanks to this Black Friday deal, they're a great price.<a class="view-deal button" href="https://www.amazon.com/dp/B0D8BZDPXB/" target="_blank" rel="nofollow" data-dimension112="4c01f8e3-a85d-4c67-8982-113eda1392a1" data-action="Deal Block" data-label="These are a cost effective way of blocking out lots and lots of noise. The ANC is excellent and the sound is good too — and thanks to this Black Friday deal, they're a great price." data-dimension48="These are a cost effective way of blocking out lots and lots of noise. The ANC is excellent and the sound is good too — and thanks to this Black Friday deal, they're a great price." data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="b0d0209c-5aab-46fb-b3ff-e1721186b908" data-action="Deal Block" data-label="This deal is only on the black colorway, but the saving is worth the restricted choice. Incredible ANC, excellent sound and a very comfortable fit make for an epic Black Friday pull." data-dimension48="This deal is only on the black colorway, but the saving is worth the restricted choice. Incredible ANC, excellent sound and a very comfortable fit make for an epic Black Friday pull." data-dimension25="$216" href="https://www.amazon.com/dp/B0F7M3HPBD/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1488px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="YH3dSXEfyLjZutaYJnnCFR" name="QuietComfort Ultra Earbuds gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YH3dSXEfyLjZutaYJnnCFR.png" mos="" align="middle" fullscreen="" width="1488" height="1488" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This deal is only on the black colorway, but the saving is worth the restricted choice. Incredible ANC, excellent sound and a very comfortable fit make for an epic Black Friday pull.<a class="view-deal button" href="https://www.amazon.com/dp/B0F7M3HPBD/" target="_blank" rel="nofollow" data-dimension112="b0d0209c-5aab-46fb-b3ff-e1721186b908" data-action="Deal Block" data-label="This deal is only on the black colorway, but the saving is worth the restricted choice. Incredible ANC, excellent sound and a very comfortable fit make for an epic Black Friday pull." data-dimension48="This deal is only on the black colorway, but the saving is worth the restricted choice. Incredible ANC, excellent sound and a very comfortable fit make for an epic Black Friday pull." data-dimension25="$216">View Deal</a></p></div><div class="product"><a data-dimension112="82e44c86-4efa-4dee-b509-4a80d1ff8adb" data-action="Deal Block" data-label="The AirPods Pro 3 are the newest AirPods, but we've still got a tasty Black Friday deal to enjoy. You get up to 10 hours of battery and some great sound out of the buds, as well as their useful Apple-centric features." data-dimension48="The AirPods Pro 3 are the newest AirPods, but we've still got a tasty Black Friday deal to enjoy. You get up to 10 hours of battery and some great sound out of the buds, as well as their useful Apple-centric features." data-dimension25="$219" href="https://www.amazon.com/dp/B0FQFB8FMG/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:842px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="FYzcjQSdtuwidVacXmMNL5" name="AirPods Pro 3.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FYzcjQSdtuwidVacXmMNL5.jpg" mos="" align="middle" fullscreen="" width="842" height="842" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The AirPods Pro 3 are the newest AirPods, but we've still got a tasty Black Friday deal to enjoy. You get up to 10 hours of battery and some great sound out of the buds, as well as their useful Apple-centric features.<a class="view-deal button" href="https://www.amazon.com/dp/B0FQFB8FMG/" target="_blank" rel="nofollow" data-dimension112="82e44c86-4efa-4dee-b509-4a80d1ff8adb" data-action="Deal Block" data-label="The AirPods Pro 3 are the newest AirPods, but we've still got a tasty Black Friday deal to enjoy. You get up to 10 hours of battery and some great sound out of the buds, as well as their useful Apple-centric features." data-dimension48="The AirPods Pro 3 are the newest AirPods, but we've still got a tasty Black Friday deal to enjoy. You get up to 10 hours of battery and some great sound out of the buds, as well as their useful Apple-centric features." data-dimension25="$219">View Deal</a></p></div><div class="product"><a data-dimension112="fe9b30bc-01eb-4c97-895e-ea5fd4f857bc" data-action="Deal Block" data-label="This deal on the WF-1000XM5 brings them down to a spectacular price. They're a great bud that offers 8 hours of battery life, a comfortable fit, and great sound quality." data-dimension48="This deal on the WF-1000XM5 brings them down to a spectacular price. They're a great bud that offers 8 hours of battery life, a comfortable fit, and great sound quality." data-dimension25="$228" href="https://www.amazon.com/dp/B0C345M3T7/" 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:120.00%;"><img id="6oSE83nxZPUtfim4Zye29J" name="Sony WF-1000XM5 BG image.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6oSE83nxZPUtfim4Zye29J.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This deal on the WF-1000XM5 brings them down to a spectacular price. They're a great bud that offers 8 hours of battery life, a comfortable fit, and great sound quality.<a class="view-deal button" href="https://www.amazon.com/dp/B0C345M3T7/" target="_blank" rel="nofollow" data-dimension112="fe9b30bc-01eb-4c97-895e-ea5fd4f857bc" data-action="Deal Block" data-label="This deal on the WF-1000XM5 brings them down to a spectacular price. They're a great bud that offers 8 hours of battery life, a comfortable fit, and great sound quality." data-dimension48="This deal on the WF-1000XM5 brings them down to a spectacular price. They're a great bud that offers 8 hours of battery life, a comfortable fit, and great sound quality." data-dimension25="$228">View Deal</a></p></div><h3 class="article-body__section" id="section-black-friday-headphones"><span>Black Friday headphones</span></h3><div class="product"><a data-dimension112="52d0cb16-3b4b-4423-8f0f-2621f675a3d7" data-action="Deal Block" data-label="The AirPods Max are a premium pair of headphones that often come at a premium price. Stellar build, quality sound, and a comfortable fit, now for the lowest price ever, thanks to a spectacular saving." data-dimension48="The AirPods Max are a premium pair of headphones that often come at a premium price. Stellar build, quality sound, and a comfortable fit, now for the lowest price ever, thanks to a spectacular saving." data-dimension25="$399" href="https://www.bestbuy.com/product/apple-airpods-max-usb-c-midnight/JJGCQ3ZZ3Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1509px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="YXPxtrVgnPf6SLRVijpsJi" name="AirPods Max.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YXPxtrVgnPf6SLRVijpsJi.jpg" mos="" align="middle" fullscreen="" width="1509" height="1509" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The AirPods Max are a premium pair of headphones that often come at a premium price. Stellar build, quality sound, and a comfortable fit, now for the lowest price ever, thanks to a spectacular saving.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-airpods-max-usb-c-midnight/JJGCQ3ZZ3Q" target="_blank" rel="nofollow" data-dimension112="52d0cb16-3b4b-4423-8f0f-2621f675a3d7" data-action="Deal Block" data-label="The AirPods Max are a premium pair of headphones that often come at a premium price. Stellar build, quality sound, and a comfortable fit, now for the lowest price ever, thanks to a spectacular saving." data-dimension48="The AirPods Max are a premium pair of headphones that often come at a premium price. Stellar build, quality sound, and a comfortable fit, now for the lowest price ever, thanks to a spectacular saving." data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="0c753844-3ae6-4ade-9bb9-828f733cf6b1" data-action="Deal Block" data-label="These headphones feature 40 hours of battery life, a light and comfortable fit, and a bassy sound signature. There's no case in the box, but for this incredible deal price they're unmissable." data-dimension48="These headphones feature 40 hours of battery life, a light and comfortable fit, and a bassy sound signature. There's no case in the box, but for this incredible deal price they're unmissable." data-dimension25="$24" href="https://www.amazon.com/dp/B092CP8ZH4?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1027px;"><p class="vanilla-image-block" style="padding-top:117.43%;"><img id="E2jMqnyiBfpNZQYNBkXnPC" name="JBL Tune 510BT.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/E2jMqnyiBfpNZQYNBkXnPC.jpg" mos="" align="middle" fullscreen="" width="1027" height="1206" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These headphones feature 40 hours of battery life, a light and comfortable fit, and a bassy sound signature. There's no case in the box, but for this incredible deal price they're unmissable.<a class="view-deal button" href="https://www.amazon.com/dp/B092CP8ZH4?" target="_blank" rel="nofollow" data-dimension112="0c753844-3ae6-4ade-9bb9-828f733cf6b1" data-action="Deal Block" data-label="These headphones feature 40 hours of battery life, a light and comfortable fit, and a bassy sound signature. There's no case in the box, but for this incredible deal price they're unmissable." data-dimension48="These headphones feature 40 hours of battery life, a light and comfortable fit, and a bassy sound signature. There's no case in the box, but for this incredible deal price they're unmissable." data-dimension25="$24">View Deal</a></p></div><div class="product"><a data-dimension112="5a3b1554-b479-4b37-9d80-8e53c4c936d0" data-action="Deal Block" data-label="This is a fully featured pair of ANC headphones for a very low cost. 40 hours of battery life is excellent, and the sound is great for something that costs so little. You can even customize the way they sound with the Soundcore app." data-dimension48="This is a fully featured pair of ANC headphones for a very low cost. 40 hours of battery life is excellent, and the sound is great for something that costs so little. You can even customize the way they sound with the Soundcore app." data-dimension25="$37" href="https://www.amazon.com/dp/B0CQXMXJC5/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:864px;"><p class="vanilla-image-block" style="padding-top:138.77%;"><img id="MPPbPTVQCCLDS3RUPyCdoe" name="Soundcore by Anker Q20i.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/MPPbPTVQCCLDS3RUPyCdoe.jpg" mos="" align="middle" fullscreen="" width="864" height="1199" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is a fully featured pair of ANC headphones for a very low cost. 40 hours of battery life is excellent, and the sound is great for something that costs so little. You can even customize the way they sound with the Soundcore app.<a class="view-deal button" href="https://www.amazon.com/dp/B0CQXMXJC5/" target="_blank" rel="nofollow" data-dimension112="5a3b1554-b479-4b37-9d80-8e53c4c936d0" data-action="Deal Block" data-label="This is a fully featured pair of ANC headphones for a very low cost. 40 hours of battery life is excellent, and the sound is great for something that costs so little. You can even customize the way they sound with the Soundcore app." data-dimension48="This is a fully featured pair of ANC headphones for a very low cost. 40 hours of battery life is excellent, and the sound is great for something that costs so little. You can even customize the way they sound with the Soundcore app." data-dimension25="$37">View Deal</a></p></div><div class="product"><a data-dimension112="73e031d1-4113-49a3-972f-f76e9e3a14cf" data-action="Deal Block" data-label="This pair of headphones offers 76 hours of battery life — that's some of the most you'll find in any headphones. They fold up for easy storage, and charge up super quickly if the battery runs. This half price deal brings them down to their lowest price ever." data-dimension48="This pair of headphones offers 76 hours of battery life — that's some of the most you'll find in any headphones. They fold up for easy storage, and charge up super quickly if the battery runs. This half price deal brings them down to their lowest price ever." data-dimension25="$44" href="https://www.amazon.com/dp/B0CTBCDD6D?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1190px;"><p class="vanilla-image-block" style="padding-top:113.61%;"><img id="kYA8RY5ohsqVvc9Ki7zKfL" name="JBL Tune 720BT.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kYA8RY5ohsqVvc9Ki7zKfL.jpg" mos="" align="middle" fullscreen="" width="1190" height="1352" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This pair of headphones offers 76 hours of battery life — that's some of the most you'll find in any headphones. They fold up for easy storage, and charge up super quickly if the battery runs. This half price deal brings them down to their lowest price ever.<a class="view-deal button" href="https://www.amazon.com/dp/B0CTBCDD6D?" target="_blank" rel="nofollow" data-dimension112="73e031d1-4113-49a3-972f-f76e9e3a14cf" data-action="Deal Block" data-label="This pair of headphones offers 76 hours of battery life — that's some of the most you'll find in any headphones. They fold up for easy storage, and charge up super quickly if the battery runs. This half price deal brings them down to their lowest price ever." data-dimension48="This pair of headphones offers 76 hours of battery life — that's some of the most you'll find in any headphones. They fold up for easy storage, and charge up super quickly if the battery runs. This half price deal brings them down to their lowest price ever." data-dimension25="$44">View Deal</a></p></div><div class="product"><a data-dimension112="33a49f97-58ac-42bc-8126-a6697ae4cb29" data-action="Deal Block" data-label="The JLab JBuds Lux are a great pair of ANC headphones. The noise canceling is good for the price, and the sound is top-notch. There's no case, but they do fold down small to fit into your bag. This deal is only for the light gray color." data-dimension48="The JLab JBuds Lux are a great pair of ANC headphones. The noise canceling is good for the price, and the sound is top-notch. There's no case, but they do fold down small to fit into your bag. This deal is only for the light gray color." data-dimension25="$46" href="https://www.amazon.com/dp/B0CRM9LQW2/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:932px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="WGegDqwQmSDe5J9L4mtenP" name="jlab jbuds lux anc deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WGegDqwQmSDe5J9L4mtenP.jpg" mos="" align="middle" fullscreen="" width="932" height="932" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The JLab JBuds Lux are a great pair of ANC headphones. The noise canceling is good for the price, and the sound is top-notch. There's no case, but they do fold down small to fit into your bag. This deal is only for the light gray color.<a class="view-deal button" href="https://www.amazon.com/dp/B0CRM9LQW2/" target="_blank" rel="nofollow" data-dimension112="33a49f97-58ac-42bc-8126-a6697ae4cb29" data-action="Deal Block" data-label="The JLab JBuds Lux are a great pair of ANC headphones. The noise canceling is good for the price, and the sound is top-notch. There's no case, but they do fold down small to fit into your bag. This deal is only for the light gray color." data-dimension48="The JLab JBuds Lux are a great pair of ANC headphones. The noise canceling is good for the price, and the sound is top-notch. There's no case, but they do fold down small to fit into your bag. This deal is only for the light gray color." data-dimension25="$46">View Deal</a></p></div><div class="product"><a data-dimension112="d9a7c236-a1a5-4093-972a-060215aa6f7a" data-action="Deal Block" data-label="This pair of Sony headphones are a steal at this price. You get ANC derived from some of the best headphones money can buy, a comfortable fit, and great sound quality.  35 hours of battery is plenty to get you through the day." data-dimension48="This pair of Sony headphones are a steal at this price. You get ANC derived from some of the best headphones money can buy, a comfortable fit, and great sound quality.  35 hours of battery is plenty to get you through the day." data-dimension25="$88" href="https://www.amazon.com/dp/B0BS74M665?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:715px;"><p class="vanilla-image-block" style="padding-top:135.52%;"><img id="EgXs4tJqH6ZcAbzxZCZCdV" name="41tp0JPPlmL._AC_SL1200_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EgXs4tJqH6ZcAbzxZCZCdV.jpg" mos="" align="middle" fullscreen="" width="715" height="969" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This pair of Sony headphones are a steal at this price. You get ANC derived from some of the best headphones money can buy, a comfortable fit, and great sound quality.  35 hours of battery is plenty to get you through the day.<a class="view-deal button" href="https://www.amazon.com/dp/B0BS74M665?" target="_blank" rel="nofollow" data-dimension112="d9a7c236-a1a5-4093-972a-060215aa6f7a" data-action="Deal Block" data-label="This pair of Sony headphones are a steal at this price. You get ANC derived from some of the best headphones money can buy, a comfortable fit, and great sound quality.  35 hours of battery is plenty to get you through the day." data-dimension48="This pair of Sony headphones are a steal at this price. You get ANC derived from some of the best headphones money can buy, a comfortable fit, and great sound quality.  35 hours of battery is plenty to get you through the day." data-dimension25="$88">View Deal</a></p></div><div class="product"><a data-dimension112="6e9da871-6ad2-4eb1-9402-3d42aee01ad2" data-action="Deal Block" data-label="There's a case in the box! That'll make sure they're safe from damage when you put them in your bag. The ANC is effective, the is sound decent, and 45 hours of battery will keep them going through your workday." data-dimension48="There's a case in the box! That'll make sure they're safe from damage when you put them in your bag. The ANC is effective, the is sound decent, and 45 hours of battery will keep them going through your workday." data-dimension25="$104" href="https://www.amazon.com/dp/B08V1VKMLS?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:97.87%;"><img id="zrtr6pAbCZsSDwothKg5sY" name="Z7 Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zrtr6pAbCZsSDwothKg5sY.png" mos="" align="middle" fullscreen="" width="1500" height="1468" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>There's a case in the box! That'll make sure they're safe from damage when you put them in your bag. The ANC is effective, the is sound decent, and 45 hours of battery will keep them going through your workday.<a class="view-deal button" href="https://www.amazon.com/dp/B08V1VKMLS?" target="_blank" rel="nofollow" data-dimension112="6e9da871-6ad2-4eb1-9402-3d42aee01ad2" data-action="Deal Block" data-label="There's a case in the box! That'll make sure they're safe from damage when you put them in your bag. The ANC is effective, the is sound decent, and 45 hours of battery will keep them going through your workday." data-dimension48="There's a case in the box! That'll make sure they're safe from damage when you put them in your bag. The ANC is effective, the is sound decent, and 45 hours of battery will keep them going through your workday." data-dimension25="$104">View Deal</a></p></div><div class="product"><a data-dimension112="a4310c87-abbf-49d8-873e-af60afbfdb0e" data-action="Deal Block" data-label="So we heard you like bass? Well, these are the headphones for you. Thanks to Skullcandy's love of the low stuff, these are some bassy cans. They're also comfortable despite a heavier weight, and they offer some great physical controls. 49 hours of battery life is excellent as well." data-dimension48="So we heard you like bass? Well, these are the headphones for you. Thanks to Skullcandy's love of the low stuff, these are some bassy cans. They're also comfortable despite a heavier weight, and they offer some great physical controls. 49 hours of battery life is excellent as well." data-dimension25="$119" href="https://www.bestbuy.com/product/skullcandy-crusher-anc-2-over-the-ear-noise-canceling-wireless-headphones-black-tan/J3GWL576GL" 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:109.00%;"><img id="ZhXB5vSgaqRGtP8JN5hYCm" name="Crusher ANC 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ZhXB5vSgaqRGtP8JN5hYCm.png" mos="" align="middle" fullscreen="" width="900" height="981" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>So we heard you like bass? Well, these are the headphones for you. Thanks to Skullcandy's love of the low stuff, these are some bassy cans. They're also comfortable despite a heavier weight, and they offer some great physical controls. 49 hours of battery life is excellent as well.<a class="view-deal button" href="https://www.bestbuy.com/product/skullcandy-crusher-anc-2-over-the-ear-noise-canceling-wireless-headphones-black-tan/J3GWL576GL" target="_blank" rel="nofollow" data-dimension112="a4310c87-abbf-49d8-873e-af60afbfdb0e" data-action="Deal Block" data-label="So we heard you like bass? Well, these are the headphones for you. Thanks to Skullcandy's love of the low stuff, these are some bassy cans. They're also comfortable despite a heavier weight, and they offer some great physical controls. 49 hours of battery life is excellent as well." data-dimension48="So we heard you like bass? Well, these are the headphones for you. Thanks to Skullcandy's love of the low stuff, these are some bassy cans. They're also comfortable despite a heavier weight, and they offer some great physical controls. 49 hours of battery life is excellent as well." data-dimension25="$119">View Deal</a></p></div><div class="product"><a data-dimension112="eff6162e-057e-4dbb-8e74-226a68ce06e5" data-action="Deal Block" data-label="The Sennheiser Accentum offer great sound, ANC, and a lovely fit for a great price. 50 hours of battery is excellent as well, letting them last for your full work week. This Blue colorway features lovely blue accents amongst the black paneling." data-dimension48="The Sennheiser Accentum offer great sound, ANC, and a lovely fit for a great price. 50 hours of battery is excellent as well, letting them last for your full work week. This Blue colorway features lovely blue accents amongst the black paneling." data-dimension25="$89" href="https://www.bestbuy.com/product/sennheiser-accentum-wireless-bluetooth-around-the-ear-headphones-hybrid-noise-cancelling-anc-all-day-comfort-blue/J3GW2LHPFY" 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:120.00%;"><img id="w4h5rQZx5FFLCZKLXqRqEn" name="Sennheiser Accentum wireless prod image.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/w4h5rQZx5FFLCZKLXqRqEn.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Sennheiser Accentum offer great sound, ANC, and a lovely fit for a great price. 50 hours of battery is excellent as well, letting them last for your full work week. This Blue colorway features lovely blue accents amongst the black paneling.<a class="view-deal button" href="https://www.bestbuy.com/product/sennheiser-accentum-wireless-bluetooth-around-the-ear-headphones-hybrid-noise-cancelling-anc-all-day-comfort-blue/J3GW2LHPFY" target="_blank" rel="nofollow" data-dimension112="eff6162e-057e-4dbb-8e74-226a68ce06e5" data-action="Deal Block" data-label="The Sennheiser Accentum offer great sound, ANC, and a lovely fit for a great price. 50 hours of battery is excellent as well, letting them last for your full work week. This Blue colorway features lovely blue accents amongst the black paneling." data-dimension48="The Sennheiser Accentum offer great sound, ANC, and a lovely fit for a great price. 50 hours of battery is excellent as well, letting them last for your full work week. This Blue colorway features lovely blue accents amongst the black paneling." data-dimension25="$89">View Deal</a></p></div><div class="product"><a data-dimension112="5adb350f-6726-47a7-88e7-2a12c2dd406b" data-action="Deal Block" data-label="Beats' older model of ANC headphones are still a decent option, especially at this reduced price. The ANC is solid, they sound pretty good, and the padding is comfortable. They have a good hardcase as well." data-dimension48="Beats' older model of ANC headphones are still a decent option, especially at this reduced price. The ANC is solid, they sound pretty good, and the padding is comfortable. They have a good hardcase as well." data-dimension25="$139" href="https://www.bestbuy.com/product/beats-studio3-wireless-noise-cancelling-headphones-white/JJ8XJL7QP2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:672px;"><p class="vanilla-image-block" style="padding-top:118.90%;"><img id="EXoMb2NWgbaM2TLT4P7iSn" name="Capture.PNG" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EXoMb2NWgbaM2TLT4P7iSn.png" mos="" align="middle" fullscreen="" width="672" height="799" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Beats' older model of ANC headphones are still a decent option, especially at this reduced price. The ANC is solid, they sound pretty good, and the padding is comfortable. They have a good hardcase as well. <a class="view-deal button" href="https://www.bestbuy.com/product/beats-studio3-wireless-noise-cancelling-headphones-white/JJ8XJL7QP2" target="_blank" rel="nofollow" data-dimension112="5adb350f-6726-47a7-88e7-2a12c2dd406b" data-action="Deal Block" data-label="Beats' older model of ANC headphones are still a decent option, especially at this reduced price. The ANC is solid, they sound pretty good, and the padding is comfortable. They have a good hardcase as well." data-dimension48="Beats' older model of ANC headphones are still a decent option, especially at this reduced price. The ANC is solid, they sound pretty good, and the padding is comfortable. They have a good hardcase as well." data-dimension25="$139">View Deal</a></p></div><div class="product"><a data-dimension112="ada8db25-2093-4ee5-9c3f-ba6fd15fd852" data-action="Deal Block" data-label="This deal is only on the Blue option, but it's one of the best deals of the sale so far. You get great ANC, 30 hours of battery life, and good sound for less than most budget pairs of headphones." data-dimension48="This deal is only on the Blue option, but it's one of the best deals of the sale so far. You get great ANC, 30 hours of battery life, and good sound for less than most budget pairs of headphones." data-dimension25="$159" href="https://www.bestbuy.com/product/sony-wh-1000xm4-wireless-noise-cancelling-over-the-ear-headphones-black/J7XSRH44JK" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1013px;"><p class="vanilla-image-block" style="padding-top:148.08%;"><img id="Na7VZv3rTyNtdnAisJwLtk" name="71x8gW79x-L._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Na7VZv3rTyNtdnAisJwLtk.jpg" mos="" align="middle" fullscreen="" width="1013" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This deal is only on the Blue option, but it's one of the best deals of the sale so far. You get great ANC, 30 hours of battery life, and good sound for less than most budget pairs of headphones. <a class="view-deal button" href="https://www.bestbuy.com/product/sony-wh-1000xm4-wireless-noise-cancelling-over-the-ear-headphones-black/J7XSRH44JK" target="_blank" rel="nofollow" data-dimension112="ada8db25-2093-4ee5-9c3f-ba6fd15fd852" data-action="Deal Block" data-label="This deal is only on the Blue option, but it's one of the best deals of the sale so far. You get great ANC, 30 hours of battery life, and good sound for less than most budget pairs of headphones." data-dimension48="This deal is only on the Blue option, but it's one of the best deals of the sale so far. You get great ANC, 30 hours of battery life, and good sound for less than most budget pairs of headphones." data-dimension25="$159">View Deal</a></p></div><div class="product"><a data-dimension112="9d0d3fc6-3ce8-4a5e-9c91-3aebd5ed100c" data-action="Deal Block" data-label="Bose's more affordable headphones are still a great option if you're looking for a great pair of noise-canceling cans. They sound good, and they're very comfortable to boot. This is a massive saving for a Black Friday bargain." data-dimension48="Bose's more affordable headphones are still a great option if you're looking for a great pair of noise-canceling cans. They sound good, and they're very comfortable to boot. This is a massive saving for a Black Friday bargain." data-dimension25="$199" href="https://www.amazon.com/dp/B0CCZ26B5V/" 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="YmXJvbwXhi7xr7vPRU4WYg" name="Bose QuietComfort Headphones on white.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YmXJvbwXhi7xr7vPRU4WYg.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Bose's more affordable headphones are still a great option if you're looking for a great pair of noise-canceling cans. They sound good, and they're very comfortable to boot. This is a massive saving for a Black Friday bargain.<a class="view-deal button" href="https://www.amazon.com/dp/B0CCZ26B5V/" target="_blank" rel="nofollow" data-dimension112="9d0d3fc6-3ce8-4a5e-9c91-3aebd5ed100c" data-action="Deal Block" data-label="Bose's more affordable headphones are still a great option if you're looking for a great pair of noise-canceling cans. They sound good, and they're very comfortable to boot. This is a massive saving for a Black Friday bargain." data-dimension48="Bose's more affordable headphones are still a great option if you're looking for a great pair of noise-canceling cans. They sound good, and they're very comfortable to boot. This is a massive saving for a Black Friday bargain." data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="0656c20a-31e5-4bcf-a2c9-ac4cc043e3d4" data-action="Deal Block" data-label="Sony's older flagship headphones are cheaper than ever in the Black Friday sales. 30 hours of battery means you can enjoy their excellent battery and great sound for a whole lot longer." data-dimension48="Sony's older flagship headphones are cheaper than ever in the Black Friday sales. 30 hours of battery means you can enjoy their excellent battery and great sound for a whole lot longer." data-dimension25="$248" href="https://www.amazon.com/dp/B0BXYCS74H/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:976px;"><p class="vanilla-image-block" style="padding-top:153.69%;"><img id="5yCFMhXGMpR2Dw7KLox54A" name="WH-1000XM5" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/5yCFMhXGMpR2Dw7KLox54A.png" mos="" align="middle" fullscreen="" width="976" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Sony's older flagship headphones are cheaper than ever in the Black Friday sales. 30 hours of battery means you can enjoy their excellent battery and great sound for a whole lot longer.<a class="view-deal button" href="https://www.amazon.com/dp/B0BXYCS74H/" target="_blank" rel="nofollow" data-dimension112="0656c20a-31e5-4bcf-a2c9-ac4cc043e3d4" data-action="Deal Block" data-label="Sony's older flagship headphones are cheaper than ever in the Black Friday sales. 30 hours of battery means you can enjoy their excellent battery and great sound for a whole lot longer." data-dimension48="Sony's older flagship headphones are cheaper than ever in the Black Friday sales. 30 hours of battery means you can enjoy their excellent battery and great sound for a whole lot longer." data-dimension25="$248">View Deal</a></p></div><div class="product"><a data-dimension112="277ef662-e4fc-461a-b007-4b0c7043e489" data-action="Deal Block" data-label="One of the best ways to block noise just got a whole lot more affordable. You get what was the best ANC around, along with great sound and a very comfortable fit for an epic price." data-dimension48="One of the best ways to block noise just got a whole lot more affordable. You get what was the best ANC around, along with great sound and a very comfortable fit for an epic price." data-dimension25="$298" href="https://www.amazon.com/dp/B0CCZ1L489/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:905px;"><p class="vanilla-image-block" style="padding-top:124.09%;"><img id="V4oSDKvVsytabWjWXBUoSU" name="bose-quietcomfort-ultra-whitebg.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/V4oSDKvVsytabWjWXBUoSU.jpg" mos="" align="middle" fullscreen="" width="905" height="1123" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>One of the best ways to block noise just got a whole lot more affordable. You get what was the best ANC around, along with great sound and a very comfortable fit for an epic price.<a class="view-deal button" href="https://www.amazon.com/dp/B0CCZ1L489/" target="_blank" rel="nofollow" data-dimension112="277ef662-e4fc-461a-b007-4b0c7043e489" data-action="Deal Block" data-label="One of the best ways to block noise just got a whole lot more affordable. You get what was the best ANC around, along with great sound and a very comfortable fit for an epic price." data-dimension48="One of the best ways to block noise just got a whole lot more affordable. You get what was the best ANC around, along with great sound and a very comfortable fit for an epic price." data-dimension25="$298">View Deal</a></p></div><div class="product"><a data-dimension112="aabd0446-9628-4b07-8bd9-f77b411b2ae7" data-action="Deal Block" data-label="Sony's latest ANC cans bring a whole host of great features. A more comfortable fit, better sound, and improved ANC as well as 30 hours of battery life. This deal is the first we've seen, and it's a great saving." data-dimension48="Sony's latest ANC cans bring a whole host of great features. A more comfortable fit, better sound, and improved ANC as well as 30 hours of battery life. This deal is the first we've seen, and it's a great saving." data-dimension25="$398" href="https://www.amazon.com/dp/B0F3QJLD3B/?th=1" 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:120.00%;"><img id="x3hpHUb8bPXUJsBkoevKDN" name="Sony WH-1000XM6" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/x3hpHUb8bPXUJsBkoevKDN.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Sony's latest ANC cans bring a whole host of great features. A more comfortable fit, better sound, and improved ANC as well as 30 hours of battery life. This deal is the first we've seen, and it's a great saving.<a class="view-deal button" href="https://www.amazon.com/dp/B0F3QJLD3B/?th=1" target="_blank" rel="nofollow" data-dimension112="aabd0446-9628-4b07-8bd9-f77b411b2ae7" data-action="Deal Block" data-label="Sony's latest ANC cans bring a whole host of great features. A more comfortable fit, better sound, and improved ANC as well as 30 hours of battery life. This deal is the first we've seen, and it's a great saving." data-dimension48="Sony's latest ANC cans bring a whole host of great features. A more comfortable fit, better sound, and improved ANC as well as 30 hours of battery life. This deal is the first we've seen, and it's a great saving." data-dimension25="$398">View Deal</a></p></div><div class="product"><a data-dimension112="1c6dbbab-5249-4c67-8683-cd28fc7ea5e8" data-action="Deal Block" data-label="Bose's newest headphones bring the best ANC around, and offer 30 hours of battery. They sound good, and they're very comfortable — this is their best saving yet." data-dimension48="Bose's newest headphones bring the best ANC around, and offer 30 hours of battery. They sound good, and they're very comfortable — this is their best saving yet." data-dimension25="$399" href="https://www.amazon.com/dp/B0FDKR293G/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:816px;"><p class="vanilla-image-block" style="padding-top:124.39%;"><img id="YCmxJDRLZYcSDoxQ8fMynC" name="QuietComfort Ultra Gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YCmxJDRLZYcSDoxQ8fMynC.png" mos="" align="middle" fullscreen="" width="816" height="1015" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Bose's newest headphones bring the best ANC around, and offer 30 hours of battery. They sound good, and they're very comfortable — this is their best saving yet.<a class="view-deal button" href="https://www.amazon.com/dp/B0FDKR293G/" target="_blank" rel="nofollow" data-dimension112="1c6dbbab-5249-4c67-8683-cd28fc7ea5e8" data-action="Deal Block" data-label="Bose's newest headphones bring the best ANC around, and offer 30 hours of battery. They sound good, and they're very comfortable — this is their best saving yet." data-dimension48="Bose's newest headphones bring the best ANC around, and offer 30 hours of battery. They sound good, and they're very comfortable — this is their best saving yet." data-dimension25="$399">View Deal</a></p></div><h2 id="we-are-live">We are live!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="e94eDhwrTmbmewFaVvrQ3D" name="Sony WH-1000XM6--01-LIST" alt="Black and white models of the Sony WH-1000XM6 noise-cancelling headphones outdoors in sunshine" src="https://cdn.mos.cms.futurecdn.net/e94eDhwrTmbmewFaVvrQ3D.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>And we are live! Tracking all the best headphone deals this Black Friday as they go live. One of the best at the moment is the first deal on the Sony WH-1000XM6, Sony's current flagship. They've got excellent ANC, a comfortable fit and 30 hours of battery.</p><p>This is their first discount, making it a de-facto lowest price ever. A great way to kick off this Black Friday extravaganza!</p><ul><li><strong>Sony WH-1000XM6: </strong><a href="https://www.amazon.com/dp/B0F3PQHWTZ/" target="_blank" rel="nofollow"><strong>was $459 now $398 @ Amazon</strong></a></li></ul><h2 id="save-on-all-the-airpods">Save on ALL the AirPods</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uKSSLPpfSUmKyg5PvvDumX" name="AirPods 4-1.jpg" alt="AirPods 4 on a table" src="https://cdn.mos.cms.futurecdn.net/uKSSLPpfSUmKyg5PvvDumX.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Did you know that every single model of AirPods that Apple makes are currently on sale? That's the AirPods 4, the AirPods 4 with ANC, AirPods Pro 3, and the AirPods Max. Almost every single one has been lowered to their lowest prices ever — if you're in the market for AirPods, now's the time to buy them.</p><p>The AirPods 4 are actually starting to sell out at some retailers — so you'd better be quick if you want them at these prices.</p><ul><li>AirPods 4: <a href="https://www.bestbuy.com/product/apple-airpods-4-white/JJGCQ83JQ5" target="_blank" rel="nofollow">was $129 now $79 @ Best Buy </a></li><li>AirPods 4 with ANC: <a href="https://www.amazon.com/dp/B0DGJ7HYG1/" target="_blank" rel="nofollow">was $179 now $99 @ Amazon</a></li><li>AirPods Pro 3: <a href="https://www.amazon.com/dp/B0FQFB8FMG/" target="_blank" rel="nofollow">was $249 now $219 @ Amazon</a></li><li>AirPods Max USB-C: <a href="https://www.amazon.com/dp/B0DGJC52FP/" target="_blank" rel="nofollow">was $549 now $399 @ Amazon</a></li></ul><h2 id="noise-canceling-savings-for-all">Noise canceling savings for 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:4030px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qMbDZmYi9FPz2EpdJqpBwY" name="IMG_7259.jpg" alt="Bose QuietComfort Ultra Headphones" src="https://cdn.mos.cms.futurecdn.net/qMbDZmYi9FPz2EpdJqpBwY.jpg" mos="" align="middle" fullscreen="" width="4030" height="2267" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Bose QuietComfort Ultra Headphones were my headphones of choice for a long time, thanks to their excellent ANC — only to be unseated by the 2nd generation when they launched. The 1st gen here are still great noise cancelers, make no mistake, and this excellent deal makes them more affordable than ever.</p><p>They're light, they're comfortable, and they feature solid sound to go with their top shelf ANC. There' little more you could ask for.</p><ul><li><strong>Bose QuietComfort Ultra Headphones: </strong><a href="https://www.amazon.com/dp/B0CCZ1L489/" target="_blank" rel="nofollow"><strong>was $429 now $289 @ Amazon</strong></a><strong></strong></li></ul><h2 id="something-a-little-more-affordable">Something a little more affordable</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uXHrHHQpNxS3PDqw2GdNLa" name="TG_Anker-Soundcore-Space-One_1.jpg" alt="Anker Soundcore Space One on charge" src="https://cdn.mos.cms.futurecdn.net/uXHrHHQpNxS3PDqw2GdNLa.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/reviews/anker-soundcore-space-one">Soundcore Space One</a> are some of our favorite budget cans – they're well-made, and sound excellent for the price. They've got ANC that does a good job of keeping out unwanted sounds, and their 40 hours of battery life is better than some more expensive options. Their funky color options sure help as well.</p><p>This deal makes them more affordable than ever, thanks to a decent $30 discount. We're big fans of the Space One here — and you probably will be too.</p><ul><li><strong>Soundcore Space One: </strong><a href="https://www.amazon.com/dp/B0C6KFZC9Z/" target="_blank" rel="nofollow"><strong>was $99 now $67 @ Amazon</strong></a></li></ul><h2 id="big-beats-savings">Big Beats savings</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1524px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="ZYHxmWCFMjcJ5Dbg6LSYxd" name="Beats Studio Pro.jpg" alt="Beats Studio Pro" src="https://cdn.mos.cms.futurecdn.net/ZYHxmWCFMjcJ5Dbg6LSYxd.jpg" mos="" align="middle" fullscreen="" width="1524" height="857" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Beats)</span></figcaption></figure><p>The Beats Studio Pro are some great over-ear headphones at their current deal price. Their ANC rivals more expensive models, and they've got a pretty comfortable fit to boot. This deal makes them their lowest price ever — and under half price. That's <em>insane.</em></p><p>To be exact, there's a 57% saving – that might be the most of any headphones this Black Friday. Don't miss out!</p><ul><li><strong>Beats Studio Pro: </strong><a href="https://www.amazon.com/dp/B0FHM61VTK?" target="_blank" rel="nofollow"><strong>was $349 now $149 @ Amazon</strong></a></li></ul><h2 id="how-about-something-super-cheap">How about something super cheap</h2><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="V6J7maKNawgAUdG7c4wX2U" name="JLab_JBudsLux_03.JPG" alt="the jlab jbuds lux anc headphones in black photographed against a blue background" src="https://cdn.mos.cms.futurecdn.net/V6J7maKNawgAUdG7c4wX2U.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>These folding headphones are a great way to get ANC in your backpack without spending loads of money. The JLab JBuds Lux sound good, look good and block out a decent amount of noise. There's no carrying case in the box, but let's be serious, there has to be something sacrificed at the altar of cost.</p><p>This deal makes them a Black Friday bargain, bringing their price down lower than its ever been before.</p><ul><li><strong>JLab JBuds Lux ANC: </strong><a href="https://www.amazon.com/dp/B0CRLXZ5J6?" target="_blank" rel="nofollow"><strong>was $79 now $39 @ Amazon</strong></a></li></ul><h2 id="something-for-galaxy-users">Something for Galaxy users</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Bq5wppxFio6fkSqdN8tghd" name="TG_Samsung-Galaxy-Buds-3-Pro-2.jpg" alt="Samsung Galaxy Buds 3 Pro" src="https://cdn.mos.cms.futurecdn.net/Bq5wppxFio6fkSqdN8tghd.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Buds 3 Pro are the perfect buds if you're wielding a Galaxy handset. They pack in all the usual suspects — great sound, solid ANC and good battery life — and then throw in some extras for Samsung fans. Live Translation? Sure thing. AI sound enhancement? Sounds good to me.</p><p>This deal brings them down to their lowest price ever, making them cheaper than their chief rivals. </p><ul><li><strong>Samsung Galaxy Buds 3 Pro: </strong><a href="https://www.amazon.com/dp/B0D9YZJ3V7?" target="_blank" rel="nofollow"><strong>was $249 now $159 @ Amazon</strong></a></li></ul><h2 id="more-noise-canceling-savings">More noise canceling savings</h2><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="Lz7GqtGvwgamHhXCGX9nbM" name="Bose_QuietComfort_Earbuds_ 4.JPG" alt="A pair of chilled lilac Bose QuietComfort Earbuds (2024)" src="https://cdn.mos.cms.futurecdn.net/Lz7GqtGvwgamHhXCGX9nbM.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Bose QuietComfort Earbuds are a comfortable pair of buds that are designed to block as much noise as possible without costing as much as their more expensive counterparts. They excel at their job — great ANC, solid sound and loads of battery life. They also come in some great colors.</p><p>This deal brings them down to a more affordable price.</p><ul><li><strong>Bose QuietComfort Earbuds: </strong><a href="https://www.walmart.com/ip/Bose-QuietComfort-Wireless-Earbuds-Noise-Cancelling-Bluetooth-Headphones-Black/6525919624?" target="_blank" rel="nofollow"><strong>was $179 now $129 @ Walmart</strong></a></li></ul><h2 id="another-beats-deal">ANOTHER Beats deal</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2936px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="qGWhcWRvRVbQzRTQh7DH6H" name="IMG_2685.jpg" alt="Beats Solo4" src="https://cdn.mos.cms.futurecdn.net/qGWhcWRvRVbQzRTQh7DH6H.jpg" mos="" align="middle" fullscreen="" width="2936" height="1652" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>How about something from Beats again — this time, the ANC-less Solo 4 headphones. They sould good, look handsome, and fold up super small so that they can fit in your backpack without issue. We love them and their comfortable fit.</p><p>This deal makes them even more affordable — time to grab a great deal!</p><ul><li><strong>Beats Solo 4: </strong><a href="https://www.bestbuy.com/product/beats-solo-4-wireless-on-ear-headphones-cloud-pink/JJGCQXWK5R" target="_blank" rel="nofollow"><strong>was $199 now $129 @ Best Buy</strong></a></li></ul><h2 id="now-for-something-slightly-different">Now for something slightly different</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4030px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Z2dS2T8jjFp8pfpZqERfUB" name="IMG_9477.JPG" alt="Bose Ultra Open Earbuds" src="https://cdn.mos.cms.futurecdn.net/Z2dS2T8jjFp8pfpZqERfUB.jpg" mos="" align="middle" fullscreen="" width="4030" height="2267" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>These are open earbuds (as if Bose calling them the "Ultra Open" didn't tell you enough), designed to let you hear more of the outside world. We loved them when we tested them, especially their suprisingly good sound quality.</p><p>This is a great deal on some interesting earbuds, saving you $70.</p><ul><li><strong>Bose Ultra Open: </strong><a href="https://www.walmart.com/ip/Bose-Ultra-Open-Ear-Headphones-Bluetooth-Wireless-Earbuds-with-Charging-Case-White-Smoke/5265054589?" target="_blank" rel="nofollow"><strong>was $299 now $229 @ Best Buy</strong></a></li></ul><h2 id="massive-airpods-pro-2-deal">Massive AirPods Pro 2 deal</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DyRXRKibiQy4ZS3DBk7Q2F" name="AirPods Pro 2" alt="AirPods Pro 2 in hand" src="https://cdn.mos.cms.futurecdn.net/DyRXRKibiQy4ZS3DBk7Q2F.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The AirPods Pro 2 might not be the newest of all the AirPods, but they're a wonderful option if you want noise canceling for your iPhone. They sound excellent and they're very comfortable — some would argue even more comfortable than the last pair.</p><p>This deal brings them down to an all-time low price — just keep in mind that this is likely retailers clearing out stock of AirPods, so get in there quick to avoid disapointment.</p><ul><li><strong>AirPods Pro 2: </strong><a href="https://www.walmart.com/ip/Apple-AirPods-Pro-2-Wireless-Earbuds-Active-Noise-Cancellation-Hearing-Aid-Feature/5689919121?" target="_blank" rel="nofollow"><strong>was $249 now $139 @ Walmart</strong></a></li></ul><h2 id="some-of-my-favorite-earbuds-are-down">Some of my favorite earbuds are down</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3027px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="j2PvQuiDLfMXwfV35r34dR" name="Shortcut widget (2).jpg" alt="Showing red Beats Studio Buds and Galaxy smartphone displaying shortcut menu" src="https://cdn.mos.cms.futurecdn.net/j2PvQuiDLfMXwfV35r34dR.jpg" mos="" align="middle" fullscreen="" width="3027" height="1703" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>These are actually some of my favorite earbuds. I love their comfortable fit, their good battery life, and their good sound. I really like the form factor of the case — it's smooth and pebble like, making it super easy to slip into a pocket.</p><p>This read color is particularly eye catching as well...</p><ul><li><strong>Beats Studio Buds: </strong><a href="https://www.walmart.com/ip/Beats-by-Dr-Dre-Studio-Buds-True-Wireless-Bluetooth-Earbud-Headphones-Type-Red/124004674?" target="_blank" rel="nofollow"><strong>was $149 now $79 @ Walmart</strong></a></li></ul><h2 id="something-from-another-galaxy-again">Something from another Galaxy... again</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jcjTMPHyBrUPUjk4hv4Sdk" name="TG_Samsung-Galax-Buds-FE_2.jpg" alt="Samsung Galaxy Buds FE wireless earbuds held in the hand." src="https://cdn.mos.cms.futurecdn.net/jcjTMPHyBrUPUjk4hv4Sdk.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>These "fan edition" earbuds area gift from Samsung to the fans of its Galaxy line of products. A gift that you pay for, but a gift none the less. This pair of earbuds bring flagship features like ANC and AI integration for a great price, especially thanks to this Black Friday deal.</p><p>Be aware that it's only the white colorway at this price.</p><ul><li><strong>Samsung Galaxy Buds FE: </strong><a href="https://www.walmart.com/ip/Samsung-Galaxy-Buds-FE-Bluetooth-Earbuds-with-Charging-Case-Graphite/5020183343?" target="_blank" rel="nofollow"><strong>was $79 now $59 @ Walmart</strong></a></li></ul><h2 id="even-more-noise-canceling-deals">EVEN MORE noise canceling deals</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4EuSKxY4xk7PNJ2Bh5bcsG" name="TG_Bose-QC-Headphones-vs-Bose-700_7.jpg" alt="Reviewer testing ANC performance on QC Headphones outside" src="https://cdn.mos.cms.futurecdn.net/4EuSKxY4xk7PNJ2Bh5bcsG.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Bose QuietComfort Headphones are a great way to block out noise, and they don't cost as much as the Ultra version. They're still very comfortable, offer excellent sound, and impeccable noise canceling — they're just a little more dated in their design.</p><p>This deal brings them down to their lowest ever price — not too shabby.</p><ul><li><strong>Bose QuietComfort Headphones: </strong><a href="https://www.walmart.com/ip/Bose-QuietComfort-Headphones-Noise-Cancelling-Over-Ear-Wireless-Bluetooth-Headphones-White-Smoke/2333728254?" target="_blank" rel="nofollow"><strong>was $349 now $199 @ Amazon</strong></a></li></ul><h2 id="yet-another-noise-canceling-deal">Yet another noise canceling deal!?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kqx5zRCDhnfa7o79Z8cru4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/kqx5zRCDhnfa7o79Z8cru4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is the generation 2 version of one of my favorite pairs of headphones. The QuietComfort Ultra headphones gen 2 are very comfortable indeed, and block out more noise than just about anything else you can buy. And now they're discounted, down to their lowest ever price thanks to Black Friday.</p><p>This deal makes them more affordable than ever — although they're still not cheap.</p><ul><li><strong>Bose QuietComfort Ultra Headphones gen 2: </strong><a href="https://www.walmart.com/ip/Bose-QuietComfort-Ultra-Headphones-II-Bluetooth-Over-Ear-Noise-Cancelling-Headphones-Driftwood-Sand/17605916660?" target="_blank" rel="nofollow"><strong>was $449 now $399 @ Walmart</strong></a></li></ul><h2 id="the-airpods-4-have-risen-in-price-again">The AirPods 4 have risen in price again</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3667px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="UMXRo3jZ6wo7vr4PP9HA8Z" name="IMG_7864.jpg" alt="AirPods 4" src="https://cdn.mos.cms.futurecdn.net/UMXRo3jZ6wo7vr4PP9HA8Z.jpg" mos="" align="middle" fullscreen="" width="3667" height="2063" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>HOLD OFF if you're planning on buying some AirPods 4 — they've been spotted at Best Buy and Walmart, but not at their lowest price ever. Amazon seems to have sold out of them at their excellent price — so it's worth holding back to see if they go back to that top-notch $69 price point.</p><ul><li><strong>AirPods 4: </strong><a href="https://www.bestbuy.com/product/apple-airpods-4-white/JJGCQ83JQ5" target="_blank" rel="nofollow"><strong>was $129 now $79 @ Best Buy (but don't — they've been cheaper just hours ago)</strong></a></li></ul><h2 id="wireless-audiophile-goodness">Wireless audiophile goodness</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3216px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="qPjLTD9q4g56ycVC2qG9eS" name="Sennheiser Momentum 4 LEDE.jpg" alt="Sennheiser Momentum 4 review" src="https://cdn.mos.cms.futurecdn.net/qPjLTD9q4g56ycVC2qG9eS.jpg" mos="" align="middle" fullscreen="" width="3216" height="1808" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Alex Bracetti/Future)</span></figcaption></figure><p>This is the deal of the sale, bar none. There's over $300 off the Momentum 4 ANC headphones, bringing them down to a truly spectacular price. They're a great sounding pair of headphones that offer good ANC as well — they're the perfect pair of noise cancelers for audiophiles. </p><p>This is their lowest price ever, and one well worth putting in your Black Friday shopping basket.</p><ul><li><strong>Sennheiser Momentum 4: </strong><a href="https://www.bestbuy.com/product/sennheiser-momemtum-4-wireless-adaptive-noise-canceling-over-the-ear-headphones-denim/J3GW2LH65F" target="_blank" rel="nofollow"><strong>was $449 now $179 @ Best Buy</strong></a></li></ul><h2 id="they-look-like-jolly-ranchers">They look like Jolly Ranchers</h2><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="XPNZSfJvvpsSFKZTwoW5gb" name="Sony_WF_C710N_ 1.JPG" alt="A pair of Glass Blue Sony WF-C710N wireless earbuds." src="https://cdn.mos.cms.futurecdn.net/XPNZSfJvvpsSFKZTwoW5gb.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Look at them... <em>Look at them! </em>They look good enough to eat. Not that you'd actually want to, they might be a bit too crunchy. Put them in your ears though and you're in for a treat. Great sound, a comfortable fit, and excellent noise canceling all add up to a great pair of buds that don't cost the world.</p><p>This deal brings them down to a great low price — you don't want to miss this one!</p><ul><li><strong>Sony WF-C510N: </strong><a href="https://www.bestbuy.com/product/sony-wf-c710n-truly-wireless-noise-canceling-earbuds-glass-blue/J7XSRH5Q5T/sku/6620464" target="_blank" rel="nofollow"><strong>was $129 now $79 @ Best Buy</strong></a></li></ul><h2 id="something-small">Something small</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3318px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="8k4ht4BJim9fsxaWigDgLE" name="JLab Go Air Pop charging case.jpg" alt="The JLab Go Air Pop held in hand" src="https://cdn.mos.cms.futurecdn.net/8k4ht4BJim9fsxaWigDgLE.jpg" mos="" align="middle" fullscreen="" width="3318" height="1867" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Regan Coule)</span></figcaption></figure><p>These tiny little buds might not look like much, but they pack in some great features for a bargain price. They're comfortable thanks to their diminutive size, and sound much better than you might initially expect. There's no ANC, given that they cost $9, but the rest of the package is well worth it.</p><p>Only a few colors are reduced, mind you — so choose carefully!</p><ul><li><strong>JLab Go Air Pop: </strong><a href="https://www.walmart.com/ip/JLab-Go-Air-Pop-True-Wireless-Earbuds-w-Charging-Case-Black/631193073?" target="_blank" rel="nofollow"><strong>was $29 now $9 at Best Buy</strong></a></li></ul><h2 id="something-for-runners">Something for runners</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WsiqVKTEof4Dosg5oCiyxa" name="Shokz OpenRun Pro 2 in hand.jpg" alt="Shokz OpenRun Pro 2 headphones in a person's hand in front of grass" src="https://cdn.mos.cms.futurecdn.net/WsiqVKTEof4Dosg5oCiyxa.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Brief caveat — I do not run. But I am told, on good authority, that the bone cunducting Shokz OpenRun Pro 2 are excellent for playing your audiobooks, podcasts and music on the go without blocking your peripheral sound-vision.</p><p>They're light and comfortable too, apparently — and they're currently $50 off. Not too shabby at all.</p><ul><li><strong>SHOKZ OpenRun Pro 2: </strong><a href="https://www.amazon.com/dp/B0D2HKCMBP?" target="_blank" rel="nofollow"><strong>was $179 now $124 @ Amazon</strong></a></li></ul><h2 id="more-true-wireless-deals">More true wireless deals</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3276px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="fMecuQGZGoB8UGQi7gsye8" name="JBL vibe beam.jpg" alt="The JBL Vibe Beam sitting on a lunch bag" src="https://cdn.mos.cms.futurecdn.net/fMecuQGZGoB8UGQi7gsye8.jpg" mos="" align="middle" fullscreen="" width="3276" height="1843" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Alex Bracetti/Future)</span></figcaption></figure><p>This deal brings a budget pair of earbuds down to an even budgetier price — they're super cheap! Expect solid sound, and up to 32 hours of battery life. There's only one color of buds at the moment on sale — the black — but they're still a solid option this Black Friday.</p><ul><li><strong>JBL Vibe Beam: </strong><a href="https://www.amazon.com/dp/B0BQPNMXQV/" target="_blank" rel="nofollow"><strong>was $49 now $29 @ Amazon</strong></a></li></ul><h2 id="airpods-4-are-back-down-to-their-lowest-price-to-date">AirPods 4 are back down to their lowest price to date</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uinAQicQ5SL3g9r7y2cdQ7" name="AirPods 4 BF Deal" alt="AirPods 4 deal" src="https://cdn.mos.cms.futurecdn.net/uinAQicQ5SL3g9r7y2cdQ7.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Amazon)</span></figcaption></figure><p>The AirPods 4 deliver the comfy, reliable experience we've come to expect from Apple's massively popular wireless earbuds, and they've just crashed to their lowest price to date at Walmart. With these buds, you're getting Spatial Audio support and the newest fit.</p><p>The newest sale price of just $69 is a good reminder that some of the best deals go live in the days leading up to Black Friday. If you've had AirPods on your holiday shopping list for a few weeks, now's a good time to act.</p><ul><li><strong>AirPods 4: </strong><a href="https://www.walmart.com/ip/Apple-AirPods-4/11381374703" target="_blank" rel="nofollow"><strong>was $129 now $69 @ Walmart</strong></a></li></ul><h2 id="something-super-premium">Something super premium</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1783px;"><p class="vanilla-image-block" style="padding-top:56.20%;"><img id="QRBPUbC6dM2m6YPoSnrrh5" name="Screenshot 2024-07-29 at 11.00.37 PM Cropped.png" alt="Bang & Olufsen Beoplay H95" src="https://cdn.mos.cms.futurecdn.net/QRBPUbC6dM2m6YPoSnrrh5.png" mos="" align="middle" fullscreen="" width="1783" height="1002" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Bang & Olufsen)</span></figcaption></figure><p>This pair of luxury headphones is still the most expensive thing I've found this Black Friday, even after a massive $400 discount. They're worth it though, smothered with high-quality leather and sumptuous metal. They sound excellent, as you might expect, and offer decent noise canceling. </p><p>This isn't their lowest price ever, though — although the last time we saw that was a couple of years ago.</p><ul><li><strong>Bang & Olufsen Beoplay H95: </strong><a href="https://www.amazon.com/dp/B091TM594V?" target="_blank" rel="nofollow"><strong>was $1,250 now $875 @ Amazon</strong></a><strong></strong></li></ul><h2 id="clearly-a-great-deal">Clearly, a great deal</h2><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="rH7GUjgYEa2axNZcTDHFM3" name="Nothing Ear (a) in casejpg.jpg" alt="Nothing Ear (a) in case on table" src="https://cdn.mos.cms.futurecdn.net/rH7GUjgYEa2axNZcTDHFM3.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Nothing's lowest price earbuds jus got a whole lot more affordable thanks to Black Friday – this deal brings them down to an even more affordable price. You get great ANC, super sound and AI integration for your money, along with that standout Nothing design.</p><p>42.5 hours of battery Nothing? You spoil us — especially at this price.</p><ul><li><strong>Nothing Ear (a): </strong><a href="https://www.amazon.com/dp/B0CXPR5412?" target="_blank" rel="nofollow"><strong>was $109 now $59 @ Amazon</strong></a><strong></strong></li></ul><h2 id="you-can-t-beats-this-deal">You can't 'Beats' this deal</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2963px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="m224k4GyfvxmYtFhSccy8M" name="Power Beats Pro 2" alt="A Powerbeats Pro 2 (2025) photo taken by Tom's Guide." src="https://cdn.mos.cms.futurecdn.net/m224k4GyfvxmYtFhSccy8M.jpg" mos="" align="middle" fullscreen="" width="2963" height="1667" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>These exercise buds have a secure hook to keep them in place when you're moving about, and buttons so that you can operate their controls when you're wearing gloves. They sound pretty good too, and there's a heart rate monitor so that you can track your fitness without taking your watch out and about with you.</p><ul><li><strong>Beats Powerbeats Pro 2: </strong><a href="https://www.amazon.com/dp/B0DT2344N3?" target="_blank" rel="nofollow"><strong>was $249 now $199 @ Amazon</strong></a></li></ul><h2 id="airpods-pro-2-are-the-cheapest-thing-since-a-really-cheap-thing">AirPods Pro 2 are the cheapest thing since... a really cheap thing</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ewoGctnmd5D58poHtA22ZD" name="TG_AirPods Pro 2 vs Sony WF-1000XM4-3.jpg" alt="Apple AirPods Pro in charging case in palm of reviewer's hand  with pool in the background" src="https://cdn.mos.cms.futurecdn.net/ewoGctnmd5D58poHtA22ZD.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The AirPods Pro 2 have snuck under the radar for a little while during the sale so far — but not anymore. I've spotted you, you sneaky little buds, and now I can show everyone how cheap you are. This deal brings them down to their lowest price ever. </p><p>Great sound, excellent ANC and a very comfortable fit — there's little more you could ask for!</p><ul><li><strong>AirPods Pro 2: </strong><a href="https://www.walmart.com/ip/Apple-AirPods-Pro-2-Wireless-Earbuds-Active-Noise-Cancellation-Hearing-Aid-Feature/5689919121?" target="_blank" rel="nofollow"><strong>was $249 now $139 @ Walmart</strong></a></li></ul><h2 id="more-un-beats-able-deals">More un'Beats'able deals</h2><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="W5p5XzEN4s5FJ7nMeQb2SV" name="headphones.png" alt="Beats Solo4" src="https://cdn.mos.cms.futurecdn.net/W5p5XzEN4s5FJ7nMeQb2SV.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This Beats deal is a massive saving, bringing them under half price with a $120 deal. That's a great deal on some headphones that sound good and offer a very comfortable fit. They may not be AirPods, but they offer a similar connection style for Apple users and Spatial Audio.</p><p>Oh, and 50 hours of battery life. That's lots.</p><ul><li><strong>Beats Solo 4: </strong><a href="https://www.walmart.com/ip/Beats-Solo4-Wireless-Headphones-On-Ear-Wireless-Headphones-Drenced-Gray/17203508556" target="_blank" rel="nofollow"><strong>was $199 now $179 @ Walmart</strong></a></li></ul><h2 id="budget-over-ears">Budget over-ears</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:750px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="ZrAvuBMp9CaUDsLvWr3aZi" name="JBL Tune 720BT.jpg" alt="JBL Tune 720BT" src="https://cdn.mos.cms.futurecdn.net/v2/t:155,l:483,cw:750,ch:422,q:80/ZrAvuBMp9CaUDsLvWr3aZi.jpg" mos="" align="middle" fullscreen="" width="1500" height="844" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: JBL)</span></figcaption></figure><p>This deal on some cheaper over-ear headphones is a great one. They're a light and comfortable pair of headphones, and offer an adjustable EQ so that you can tune the sound to your liking. There are some cool colors on offer as well, to go with their 76 hour battery life.</p><ul><li><strong>JBL Tune 720BT: </strong><a href="https://www.walmart.com/ip/JBL-T720-Black-Over-Ear-Wireless-Headphone/5114541492?" target="_blank" rel="nofollow"><strong>was $89 now $44 @ Walmart</strong></a></li></ul><h2 id="another-budget-bud">Another budget bud?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kLpaSaXujU5twJeSNpShVX" name="TG_Anker-Soundcore-Liberty-4-NC_1.jpg" alt="Anker Soundcore Liberty 4 NC in charging case with lid open placed on a wooden surface" src="https://cdn.mos.cms.futurecdn.net/kLpaSaXujU5twJeSNpShVX.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>These colorful little buds are a great way to save some money this Black Friday. They feature good ANC, great sound, and a comfortable fit thanks to Soundcore's well-shaped silicon tips. I like the case — there's a button on it so that it snaps open like a Tricorder in Star Trek.</p><p>No, the real nerds are the ones who <em>don't </em>like Star Trek. Or these buds. </p><ul><li><strong>Soundcore Liberty 4 NC: </strong><a href="https://www.amazon.com/dp/B0BZV4QFP8/" target="_blank" rel="nofollow"><strong>was $99 now $56 @ Amazon</strong></a></li></ul><h2 id="one-for-the-audiophiles">One for the audiophiles</h2><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="fCGr7oLWGDyE9BS4fU5aue" name="Sennheiser HD599 SE.jpg" alt="The Sennheiser HD 599 SE are seriously good headphones for serious audio enthusiasts." src="https://cdn.mos.cms.futurecdn.net/fCGr7oLWGDyE9BS4fU5aue.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sennheiser)</span></figcaption></figure><p>The HD 599 SE likely need no introduction — they're a well known pair of wired headphones, perfect for those who want to get really into listening to their music. They're light and comfortable, but they also sound stunning thanks to their open design and impeccable internals.</p><ul><li><strong>Sennheiser HD 599 SE: </strong><a href="https://www.amazon.com/dp/B07RFNZYJZ?" target="_blank" rel="nofollow"><strong>was $239 now $99 @ Amazon</strong></a></li></ul><h2 id="airpods-4-low-low-low-price">AirPods 4 — low, low, low 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:4842px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="Hmq4QSFLWMuaxhtshpSUtS" name="IMG_7876.jpg" alt="AirPods 4" src="https://cdn.mos.cms.futurecdn.net/Hmq4QSFLWMuaxhtshpSUtS.jpg" mos="" align="middle" fullscreen="" width="4842" height="2723" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Both AirPods models are down to their lowest prices, with discounts that bring them under $100. The AirPods 4 with no ANC is a particularly good deal, bringing them to a price that undercuts just about everything else.</p><p>What are the differences? The more expensive model features ANC and Find My — and cost $30 more.</p><ul><li><strong>AirPods 4 ANC: </strong><a href="https://www.amazon.com/dp/B0DGJ7HYG1/" target="_blank" rel="nofollow"><strong>was $179 now $99 @ Amazon</strong></a></li><li><strong>AirPods 4: </strong><a href="https://www.amazon.com/dp/B0DGHMNQ5Z/" target="_blank" rel="nofollow"><strong>was $129 now $69 @ Amazon</strong></a></li></ul><h2 id="designed-for-your-jeans-chain">Designed for your jeans chain</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="F3zHLUBpx4Hd6S5HRjwNM4" name="SkullCandy_Bose_Method360-12" alt="the skullcandy x bose method 360 anc earbuds in white, with a long charging case, a carabiner clip, and various silicone tip sizes" src="https://cdn.mos.cms.futurecdn.net/F3zHLUBpx4Hd6S5HRjwNM4.jpg" mos="" align="middle" fullscreen="" width="2048" height="1150" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This collaboration between Bose and Skullcandy gave us a wonderfully strange pair of earbuds. They've got great ANC, and the Bose-tuned sound is excellent. The charging case is large, but the clip on the side makes it easy to hang it off things. If you're feeling brave.</p><ul><li><strong>Skullcandy Method 360 ANC: </strong><a href="https://www.amazon.com/dp/B0DWC512JJ?" target="_blank" rel="nofollow"><strong>was $129 now $89 @ Amazon</strong></a></li></ul><h2 id="another-deal-you-can-t-beats-i-give-up">Another deal you can't 'Beats'... I give up</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1524px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="ZYHxmWCFMjcJ5Dbg6LSYxd" name="Beats Studio Pro.jpg" alt="Beats Studio Pro" src="https://cdn.mos.cms.futurecdn.net/ZYHxmWCFMjcJ5Dbg6LSYxd.jpg" mos="" align="middle" fullscreen="" width="1524" height="857" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Beats)</span></figcaption></figure><p>The Beats Studio Pro headphones are down to a great price thanks to Black Friday, with a nearly $200 saving. They're a comfortable pair of headphones that offer good noise canceling and solid sound — not one to be missed!</p><ul><li><strong>Beats Studio Pro: </strong><a href="https://www.walmart.com/ip/Beats-Studio-Pro-Wireless-Headphones-Black/1575006069" target="_blank" rel="nofollow"><strong>was $349 now $169 @ Walmart</strong></a></li></ul><h2 id="more-cheap-headphones">More cheap headphones</h2><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="V6J7maKNawgAUdG7c4wX2U" name="JLab_JBudsLux_03.JPG" alt="the jlab jbuds lux anc headphones in black photographed against a blue background" src="https://cdn.mos.cms.futurecdn.net/V6J7maKNawgAUdG7c4wX2U.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>These noise canceling headphones are a budget favorite of ours here at Tom's Guide. They're a comfortable pair of headphones, bringing loads of great features to a more affordable price. They block out lots of noise, sound good, and last for up to 70 hours. That's a great buy this Black Friday.</p><ul><li><strong>JLab JBuds Lux ANC: </strong><a href="https://www.amazon.com/dp/B0CRLXZ5J6?" target="_blank" rel="nofollow"><strong>was $79 now $39 @ Amazon</strong></a></li></ul><h2 id="the-best-noise-canceling-now-for-less">The best noise canceling, now for less</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wyKbTZuMyBgk8Db2ciq2zd" name="Bose QuietComfort Ultra headphones" alt="Bose QuietComfort Ultra" src="https://cdn.mos.cms.futurecdn.net/wyKbTZuMyBgk8Db2ciq2zd.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Want to block as much noise as possible without spend <em>all </em>the money? This deal on the Bose QuietComfort Ultra Headphones is the saving for you. It's a $130 saving on some of the best noise canceling headphones ever, that also happen to sound really good. Watch out for this deal — not every color is reduced as much as others.</p><ul><li><strong>Bose QuietComfort Ultra Headphones: </strong><a href="https://www.amazon.com/dp/B0D4ZC4XMT?" target="_blank" rel="nofollow"><strong>was $429 now $299 @ Amazon</strong></a></li></ul><h2 id="sony-s-noise-canceling-heroes">Sony's noise canceling heroes</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1914px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="DgdHknhwwnB6MinNMtJBQQ" name="Sony WH-1000XM5 hero.jpg" alt="Sony XM5 headphones in ecru being held in mid air with green plant in background" src="https://cdn.mos.cms.futurecdn.net/DgdHknhwwnB6MinNMtJBQQ.jpg" mos="" align="middle" fullscreen="" width="1914" height="1076" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Sony WH-1000XM5 are down to a very low price thanks to Black Friday — they're $150 off for their lowest price ever. Excellent noise canceling, the works. This is the deal I'd buy this Black Friday.</p><ul><li><strong>Sony Wh-1000XM5: </strong><a href="https://www.amazon.com/dp/B0BXYCS74H/" target="_blank" rel="nofollow"><strong>was $399 now $248 @ Amazon</strong></a></li></ul><h2 id="deals-on-workout-essential-open-earbuds">Deals on workout essential open earbuds</h2><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="53TvxxEQYnVgVLXa2kM9oY" name="Soundcore AeroClip earbuds" alt="Soundcore AeroClip open-ear earbuds in champagne mist against a blue backdrop" src="https://cdn.mos.cms.futurecdn.net/53TvxxEQYnVgVLXa2kM9oY.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Soundcore AeroClip earbuds are an essential for any fitness lover who values audio quality and comfort during their workouts. They may have a budget price tag, but they show no compromises in the comfort department. They have customizable EQ settings in the Soundcore app, and this can improve the already great sound quality. At their lowest ever price with $70 off, picking up these buds right now is a no-brainer.</p><ul><li><strong>Soundcore Aeroclip: </strong><a href="https://www.amazon.com/Soundcore-AeroClip-Open-Ear-Headphones-Open-Ring/dp/B0DLGCHL8M" target="_blank" rel="nofollow"><strong>was $169 now $99</strong></a></li></ul><h2 id="do-you-like-bass">Do you like... 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:931px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="T3wtXeBEpXtq6Yps79aiRf" name="Skullcandy Crusher Evo" alt="Skullcandy Crusher Evo" src="https://cdn.mos.cms.futurecdn.net/v2/t:72,l:511,cw:931,ch:524,q:80/T3wtXeBEpXtq6Yps79aiRf.png" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Skullcandy)</span></figcaption></figure><p>If you like the low stuff, then you've just found your perfect next pair of headphones. They're so dedicated to bass driver to make sure you're getting plenty of wobble. There's a reason they're called the "Crusher", after all. They sound pretty good to boot — and a $100 discount is certainly nothing to sniff at. </p><ul><li><strong>Skullcandy Crusher Evo: </strong><a href="https://www.amazon.com/dp/B0CBLM9MMC?" target="_blank" rel="nofollow"><strong>was $199 now $99 @ Amazon</strong></a></li></ul><h2 id="wireless-audiophiledom-is-but-179-away">Wireless audiophiledom is but $179 away</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2995px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="kVW5ihcEpkPKu8pYuTE9rT" name="Sennheiser Momentum 4.jpg" alt="Sennheiser Momentum 4 review" src="https://cdn.mos.cms.futurecdn.net/kVW5ihcEpkPKu8pYuTE9rT.jpg" mos="" align="middle" fullscreen="" width="2995" height="1684" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Alex Bracetti/Future)</span></figcaption></figure><p>The Momentum 4 are a fantastic pair of headphones with top notch sound and a very comfortable fit. They also block out loads of noise, and feature extensive EQ settings so that you can dial the sound in just so. This is their lowest price ever, with a massive $270 saving.</p><ul><li><strong>Sennheiser Momentum 4: </strong><a href="https://www.amazon.com/dp/B0CDH415QV?" target="_blank" rel="nofollow"><strong>was $449 now $179 @ Amazon</strong></a><strong></strong></li></ul><h2 id="affordable-sony-headphones">Affordable Sony headphones</h2><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="uYVZLUyiBBLnPmxpfQuHZa" name="Sony WH-CH720N" alt="Sony WH-CH720N" src="https://cdn.mos.cms.futurecdn.net/uYVZLUyiBBLnPmxpfQuHZa.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sony)</span></figcaption></figure><p>These Sony noise cancelers don't cost as much as their more expensive cousins, but they're still a great option if you want something that does everything <em>well. </em>They're comfortable, they sound good, and they've got great ANC — what more could you want from a pair of Black Friday headphoes?</p><ul><li><strong>Sony WH-CH720N: </strong><a href="https://www.amazon.com/dp/B0BS74M665?" target="_blank" rel="nofollow"><strong>was $179 now $88 @ Amazon</strong></a><strong></strong></li></ul><h2 id="plus-buds-for-minus">Plus buds for... minus?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="EnfUXQRxTVXP3VLnqBwuaf" name="Beats Studio Buds Plus.jpg" alt="Beats Studio Buds Plus in ivory held in hand with charging case" src="https://cdn.mos.cms.futurecdn.net/EnfUXQRxTVXP3VLnqBwuaf.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>These little Beats buds are an upgrade over the non plus version (as you might expect), and bring improved sound, good ANC and great comfort. They're also available in a very cool transparent color — I love them.</p><ul><li><strong>Beats Studio Buds+: </strong><a href="https://www.amazon.com/dp/B0BZK2Z2TC?ref=fs_a_bt2_us4&th=1" target="_blank" rel="nofollow"><strong>was $149 now $169 @ Amazon</strong></a></li></ul><h2 id="which-budget-headphones-should-i-buy">Which budget headphones should I buy?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GGA5m2d4fvfzrdmxg7W3T4" name="headphones comparison" alt="the soundcore space one pro headphones and jlab jbuds lux anc headphones on a split background with a tom's guide black friday deal badge" src="https://cdn.mos.cms.futurecdn.net/GGA5m2d4fvfzrdmxg7W3T4.png" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>My two favorite budget headphones are the Soundcore Space One Pro and the JLab JBuds Lux ANC. Thankfully, both of these models are on sale for Black Friday. </p><p>If you're trying to save megabucks, I'd go for the <a href="https://www.amazon.com/JLab-Headphones-Cancelling-Customizable-Compatible/dp/B0CRMB9Z84" target="_blank" rel="nofollow">JLab JBuds Lux ANC — they're just $39</a> right now. With super-comfy ear cups and surprisingly excellent sound, this is my go-to budget headphone recommendation. Always. </p><p>If you want something a little fancier, why not go for the <a href="https://www.amazon.com/Soundcore-Space-FlexiCurve-Over-Ear-Headphone/dp/B0CZ8G716J" target="_blank" rel="nofollow">Soundcore Space One Pro</a>? These $113 headphones are also incredibly comfortable and have amazing features in the app. </p><div class="product"><a data-dimension112="1a8f2cdf-4c6b-4264-9495-5d771d901092" data-action="Deal Block" data-label="The Soundcore Space One Pro got a lovely 4.5-star rating in our review, with our reviewer praising the rich, nuanced sound quality and the incredibly comfortable ear cups. The ANC is also fantastic, and we consider these headphones some of the best mid-range cans on the market." data-dimension48="The Soundcore Space One Pro got a lovely 4.5-star rating in our review, with our reviewer praising the rich, nuanced sound quality and the incredibly comfortable ear cups. The ANC is also fantastic, and we consider these headphones some of the best mid-range cans on the market." data-dimension25="$113" href="https://www.amazon.com/Soundcore-Space-FlexiCurve-Over-Ear-Headphone/dp/B0CZ8G716J" 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:120.00%;"><img id="wwqGY4KYdsaVWfkmnBJXYo" name="Soundcore space one pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wwqGY4KYdsaVWfkmnBJXYo.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Soundcore Space One Pro got a lovely 4.5-star rating in our review, with our reviewer praising the rich, nuanced sound quality and the incredibly comfortable ear cups. The ANC is also fantastic, and we consider these headphones some of the best mid-range cans on the market. <a class="view-deal button" href="https://www.amazon.com/Soundcore-Space-FlexiCurve-Over-Ear-Headphone/dp/B0CZ8G716J" target="_blank" rel="nofollow" data-dimension112="1a8f2cdf-4c6b-4264-9495-5d771d901092" data-action="Deal Block" data-label="The Soundcore Space One Pro got a lovely 4.5-star rating in our review, with our reviewer praising the rich, nuanced sound quality and the incredibly comfortable ear cups. The ANC is also fantastic, and we consider these headphones some of the best mid-range cans on the market." data-dimension48="The Soundcore Space One Pro got a lovely 4.5-star rating in our review, with our reviewer praising the rich, nuanced sound quality and the incredibly comfortable ear cups. The ANC is also fantastic, and we consider these headphones some of the best mid-range cans on the market." data-dimension25="$113">View Deal</a></p></div><div class="product"><a data-dimension112="9a41aaad-25f6-416b-83a6-21ab9f1b411e" data-action="Deal Block" data-label="The JLab JBuds Lux ANC are some of our highest-rated budget headphones. The sound quality punches way above its $80 weight, and the ANC isn't half bad either. There's a reason why these headphones are so popular — they're good and cheap. What more could you want?" data-dimension48="The JLab JBuds Lux ANC are some of our highest-rated budget headphones. The sound quality punches way above its $80 weight, and the ANC isn't half bad either. There's a reason why these headphones are so popular — they're good and cheap. What more could you want?" data-dimension25="$39" href="https://www.amazon.com/JLab-Headphones-Cancelling-Customizable-Compatible/dp/B0CRMB9Z84" 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:120.00%;"><img id="Ma3BZza59fUJ2isHLpzvSo" name="JLab JBuds Lux ANC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Ma3BZza59fUJ2isHLpzvSo.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The JLab JBuds Lux ANC are some of our highest-rated budget headphones. The sound quality punches way above its $80 weight, and the ANC isn't half bad either. There's a reason why these headphones are so popular — they're good and cheap. What more could you want? <a class="view-deal button" href="https://www.amazon.com/JLab-Headphones-Cancelling-Customizable-Compatible/dp/B0CRMB9Z84" target="_blank" rel="nofollow" data-dimension112="9a41aaad-25f6-416b-83a6-21ab9f1b411e" data-action="Deal Block" data-label="The JLab JBuds Lux ANC are some of our highest-rated budget headphones. The sound quality punches way above its $80 weight, and the ANC isn't half bad either. There's a reason why these headphones are so popular — they're good and cheap. What more could you want?" data-dimension48="The JLab JBuds Lux ANC are some of our highest-rated budget headphones. The sound quality punches way above its $80 weight, and the ANC isn't half bad either. There's a reason why these headphones are so popular — they're good and cheap. What more could you want?" data-dimension25="$39">View Deal</a></p></div><h2 id="my-favorite-budget-earbuds">My favorite budget earbuds</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iDBkBMpoXJP2UkGfo7WEEh" name="jlab go pods anc deal" alt="the jlab go pods anc in purple on a pink background with a tom's guide black friday deal badge" src="https://cdn.mos.cms.futurecdn.net/iDBkBMpoXJP2UkGfo7WEEh.png" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: JLab / Future)</span></figcaption></figure><p>I'm a professional earbud and headphone reviewer, which means I get my hands on loads of fresh tech. However, little stays in my mind as long as the JLab Go Pods ANC. These earbuds are, without a doubt, the best earbuds $20 can buy. </p><div class="product"><a data-dimension112="2e1914a9-4876-4837-8c3f-e0ea64e7f58f" data-action="Deal Block" data-label="$20 is incomprehensibly cheap for a set of earbuds this good. Don't look at the price and assume these earbuds are garbage — that's just wrong. When I tested the Go Pods ANC, I was blown away by the surprisingly meaty bass and customizable features in the JLab app. Every other pair of budget earbuds has to beat these now." data-dimension48="$20 is incomprehensibly cheap for a set of earbuds this good. Don't look at the price and assume these earbuds are garbage — that's just wrong. When I tested the Go Pods ANC, I was blown away by the surprisingly meaty bass and customizable features in the JLab app. Every other pair of budget earbuds has to beat these now." data-dimension25="$20" href="https://www.amazon.com/JLab-Wireless-Bluetooth-canceling-Listening/dp/B0DWCGZZWD" 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="7gpuj7prE2W29ucfKk5LYD" name="jlab go pods anc deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7gpuj7prE2W29ucfKk5LYD.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>$20 is incomprehensibly cheap for a set of earbuds this good. Don't look at the price and assume these earbuds are garbage — that's just wrong. When I tested the Go Pods ANC, I was blown away by the surprisingly meaty bass and customizable features in the JLab app. Every other pair of budget earbuds has to beat these now. <a class="view-deal button" href="https://www.amazon.com/JLab-Wireless-Bluetooth-canceling-Listening/dp/B0DWCGZZWD" target="_blank" rel="nofollow" data-dimension112="2e1914a9-4876-4837-8c3f-e0ea64e7f58f" data-action="Deal Block" data-label="$20 is incomprehensibly cheap for a set of earbuds this good. Don't look at the price and assume these earbuds are garbage — that's just wrong. When I tested the Go Pods ANC, I was blown away by the surprisingly meaty bass and customizable features in the JLab app. Every other pair of budget earbuds has to beat these now." data-dimension48="$20 is incomprehensibly cheap for a set of earbuds this good. Don't look at the price and assume these earbuds are garbage — that's just wrong. When I tested the Go Pods ANC, I was blown away by the surprisingly meaty bass and customizable features in the JLab app. Every other pair of budget earbuds has to beat these now." data-dimension25="$20">View Deal</a></p></div><h2 id="if-you-want-to-treat-yo-self">If you want to treat yo'self... </h2><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="weCSFHqEbnZgrD83ro4mMg" name="AirPods Max" alt="AirPods Max" src="https://cdn.mos.cms.futurecdn.net/weCSFHqEbnZgrD83ro4mMg.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple, Tom's Guide)</span></figcaption></figure><p>It's got to be the AirPods Max at just $399 for Black Friday 2025. This is the AirPods Max's <strong>LOWEST EVER PRICE. </strong>If you've been uhm-ing and ah-ing about getting Apple's flagship cans, now is the best time to bite the bullet. </p><div class="product"><a data-dimension112="341b5188-2f40-47df-94a8-ed0fa926aeaf" data-action="Deal Block" data-label="Price Check: $399 @ Amazon (certain colors)" data-dimension48="Price Check: $399 @ Amazon (certain colors)" data-dimension25="$399" href="https://www.bestbuy.com/product/apple-airpods-max-usb-c-midnight/JJGCQ3ZZ3Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1509px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="YXPxtrVgnPf6SLRVijpsJi" name="AirPods Max.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YXPxtrVgnPf6SLRVijpsJi.jpg" mos="" align="middle" fullscreen="" width="1509" height="1509" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The AirPods Max with USB-C are the headphones to get if you want the ultimate in sound and noise cancelation in once package. You also get a premium design with five color options, personalized Spatial Audio and a decent 20 hours of battery life.</p><p><strong>Price Check: </strong><a href="https://www.amazon.com/dp/B0DGJC52FP/ref=fs_a_mdt2_us2?th=1" target="_blank" rel="nofollow" data-dimension112="341b5188-2f40-47df-94a8-ed0fa926aeaf" data-action="Deal Block" data-label="Price Check: $399 @ Amazon (certain colors)" data-dimension48="Price Check: $399 @ Amazon (certain colors)" data-dimension25="$399"><strong>$399 @ Amazon (certain colors)</strong></a><a class="view-deal button" href="https://www.bestbuy.com/product/apple-airpods-max-usb-c-midnight/JJGCQ3ZZ3Q" target="_blank" rel="nofollow" data-dimension112="341b5188-2f40-47df-94a8-ed0fa926aeaf" data-action="Deal Block" data-label="Price Check: $399 @ Amazon (certain colors)" data-dimension48="Price Check: $399 @ Amazon (certain colors)" data-dimension25="$399">View Deal</a></p></div><h2 id="the-best-airpods-competitor-is">The best AirPods competitor is...</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kwmWUYqJgB9kxmxh8zGXZj" name="earfun air pro 4+ deal" alt="the earfun air pro 4+ earbuds on a purple background with a toms guide deal badge for black friday" src="https://cdn.mos.cms.futurecdn.net/kwmWUYqJgB9kxmxh8zGXZj.png" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: EarFun / Future)</span></figcaption></figure><p>The EarFun Air Pro 4+. I tested these earbuds in October, when they came out. With a balanced yet punchy sound signature and fantastic features for the price, the EarFun Air Pro 4+ are my go-to recommendation for AirPods-like performance for very little money. </p><div class="product"><a data-dimension112="d7062cc2-56d3-4894-ad53-8e1c6ceff196" data-action="Deal Block" data-label="The EarFun Air Pro 4+ perform like much pricier earbuds. With an unkillable 45+ hour battery life and dual drivers for rich bass and melodic treble, these earbuds are the best option for audiophiles on a serious budget." data-dimension48="The EarFun Air Pro 4+ perform like much pricier earbuds. With an unkillable 45+ hour battery life and dual drivers for rich bass and melodic treble, these earbuds are the best option for audiophiles on a serious budget." data-dimension25="$74" href="https://www.amazon.com/EarFun-Adaptive-Cancelling-Snapdragon-Bluetooth/dp/B0FSKRJFKT" 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:120.00%;"><img id="6osKnUYAmrQXowPHgdGud9" name="EarFun Air Pro 4+" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6osKnUYAmrQXowPHgdGud9.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The EarFun Air Pro 4+ perform like much pricier earbuds. With an unkillable 45+ hour battery life and dual drivers for rich bass and melodic treble, these earbuds are the best option for audiophiles on a serious budget. <a class="view-deal button" href="https://www.amazon.com/EarFun-Adaptive-Cancelling-Snapdragon-Bluetooth/dp/B0FSKRJFKT" target="_blank" rel="nofollow" data-dimension112="d7062cc2-56d3-4894-ad53-8e1c6ceff196" data-action="Deal Block" data-label="The EarFun Air Pro 4+ perform like much pricier earbuds. With an unkillable 45+ hour battery life and dual drivers for rich bass and melodic treble, these earbuds are the best option for audiophiles on a serious budget." data-dimension48="The EarFun Air Pro 4+ perform like much pricier earbuds. With an unkillable 45+ hour battery life and dual drivers for rich bass and melodic treble, these earbuds are the best option for audiophiles on a serious budget." data-dimension25="$74">View Deal</a></p></div><h2 id="which-deal-is-the-most-surprising">Which deal is the most surprising? </h2><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="uMC6EuorLRWuzC2HQqYXXB" name="AirPods Pro 3 deals" alt="AirPods Pro 3" src="https://cdn.mos.cms.futurecdn.net/uMC6EuorLRWuzC2HQqYXXB.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I'm actually really shocked to see the AirPods Pro 3 discounted already. These earbuds only came out two months ago, and they're already at their lowest ever price. Having some trouble shifting them, Apple? </p><p>I jest, I jest, but seriously, if you've been after the brand-new flagship AirPods, then you're not going to find them anywhere cheaper. </p><div class="product"><a data-dimension112="adac03dd-c67c-4926-b934-862d777f03bb" data-action="Deal Block" data-label="The AirPods Pro 3 just got their first Black Friday discount, and they offer the best noise cancelation ever for AirPods. Plus, you get up to 8 hours of battery life with ANC on (10 hours in Transparency), heart rate sensing and live translation. But my favorite feature is the comfier redesign." data-dimension48="The AirPods Pro 3 just got their first Black Friday discount, and they offer the best noise cancelation ever for AirPods. Plus, you get up to 8 hours of battery life with ANC on (10 hours in Transparency), heart rate sensing and live translation. But my favorite feature is the comfier redesign." data-dimension25="$219" href="https://www.amazon.com/dp/B0FQFB8FMG/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:842px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="FYzcjQSdtuwidVacXmMNL5" name="AirPods Pro 3.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FYzcjQSdtuwidVacXmMNL5.jpg" mos="" align="middle" fullscreen="" width="842" height="842" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The AirPods Pro 3 just got their first Black Friday discount, and they offer the best noise cancelation ever for AirPods. Plus, you get up to 8 hours of battery life with ANC on (10 hours in Transparency), heart rate sensing and live translation. But my favorite feature is the comfier redesign. <a class="view-deal button" href="https://www.amazon.com/dp/B0FQFB8FMG/" target="_blank" rel="nofollow" data-dimension112="adac03dd-c67c-4926-b934-862d777f03bb" data-action="Deal Block" data-label="The AirPods Pro 3 just got their first Black Friday discount, and they offer the best noise cancelation ever for AirPods. Plus, you get up to 8 hours of battery life with ANC on (10 hours in Transparency), heart rate sensing and live translation. But my favorite feature is the comfier redesign." data-dimension48="The AirPods Pro 3 just got their first Black Friday discount, and they offer the best noise cancelation ever for AirPods. Plus, you get up to 8 hours of battery life with ANC on (10 hours in Transparency), heart rate sensing and live translation. But my favorite feature is the comfier redesign." data-dimension25="$219">View Deal</a></p></div><h2 id="don-t-underestimate-the">Don't underestimate the...</h2><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="yB52zNLjPNbSo8wj3PPFHL" name="Sony_WF_C710N_ 8 deal hero" alt="the sony wfc710n earbuds in blue with a tom's guide deal badge" src="https://cdn.mos.cms.futurecdn.net/yB52zNLjPNbSo8wj3PPFHL.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Sony WF-C710N! When we reviewed these earlier in the year, we loved them. The sound quality is miles better than the $129 price tag and at just $99? It feels illegal. If you want earbuds that have it all — including a vaguely y2k-themed transparent design — I think you might like these Sony buds. </p><div class="product"><a data-dimension112="8f5bf9aa-27d4-434f-b68a-a0a6f5355b13" data-action="Deal Block" data-label="The WF-C710N are some of the best noise-canceling earbuds under $200, so grabbing them for a sub-$100 price feels like theft. Great sound, excellent ANC, and a very comfortable fit. That Jolly Ranchers transparent blue is the icing on the cake." data-dimension48="The WF-C710N are some of the best noise-canceling earbuds under $200, so grabbing them for a sub-$100 price feels like theft. Great sound, excellent ANC, and a very comfortable fit. That Jolly Ranchers transparent blue is the icing on the cake." data-dimension25="$79" href="https://www.bestbuy.com/product/sony-wf-c710n-truly-wireless-noise-canceling-earbuds-glass-blue/J7XSRH5Q5T/sku/6620464" 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:120.00%;"><img id="r3fsKfXfrYb8dNBNK7cdoP" name="Sony C710N" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/r3fsKfXfrYb8dNBNK7cdoP.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The WF-C710N are some of the best noise-canceling earbuds under $200, so grabbing them for a sub-$100 price feels like theft. Great sound, excellent ANC, and a very comfortable fit. That Jolly Ranchers transparent blue is the icing on the cake.<a class="view-deal button" href="https://www.bestbuy.com/product/sony-wf-c710n-truly-wireless-noise-canceling-earbuds-glass-blue/J7XSRH5Q5T/sku/6620464" target="_blank" rel="nofollow" data-dimension112="8f5bf9aa-27d4-434f-b68a-a0a6f5355b13" data-action="Deal Block" data-label="The WF-C710N are some of the best noise-canceling earbuds under $200, so grabbing them for a sub-$100 price feels like theft. Great sound, excellent ANC, and a very comfortable fit. That Jolly Ranchers transparent blue is the icing on the cake." data-dimension48="The WF-C710N are some of the best noise-canceling earbuds under $200, so grabbing them for a sub-$100 price feels like theft. Great sound, excellent ANC, and a very comfortable fit. That Jolly Ranchers transparent blue is the icing on the cake." data-dimension25="$79">View Deal</a></p></div><h2 id="sony-s-flagship-earbuds">Sony's flagship earbuds </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qq46dM7cM4oWPFnr3D3BuN" name="Sony WF-1000XM5-hero image Black Friday Best deals.jpg" alt="Sony WF-1000XM5 hero image with Black Friday deals tag" src="https://cdn.mos.cms.futurecdn.net/qq46dM7cM4oWPFnr3D3BuN.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Sony WF-1000XM5 are Sony's premium earbuds, and right now they're just $228. This isn't their lowest-ever price, but it's still a nice deal on these amazing earbuds. When we reviewed them last year, we called them the "best-ever earbuds." That's a mighty bold claim, but it's true. </p><div class="product"><a data-dimension112="90d146a2-e6f1-4802-87a1-b0324ae12de2" data-action="Deal Block" data-label="This deal on the WF-1000XM5 brings them down to a spectacular price. They're a great bud that offers 8 hours of battery life, a comfortable fit, and great sound quality." data-dimension48="This deal on the WF-1000XM5 brings them down to a spectacular price. They're a great bud that offers 8 hours of battery life, a comfortable fit, and great sound quality." data-dimension25="$228" href="https://www.amazon.com/dp/B0C345M3T7/" 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:120.00%;"><img id="6oSE83nxZPUtfim4Zye29J" name="Sony WF-1000XM5 BG image.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6oSE83nxZPUtfim4Zye29J.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This deal on the WF-1000XM5 brings them down to a spectacular price. They're a great bud that offers 8 hours of battery life, a comfortable fit, and great sound quality.<a class="view-deal button" href="https://www.amazon.com/dp/B0C345M3T7/" target="_blank" rel="nofollow" data-dimension112="90d146a2-e6f1-4802-87a1-b0324ae12de2" data-action="Deal Block" data-label="This deal on the WF-1000XM5 brings them down to a spectacular price. They're a great bud that offers 8 hours of battery life, a comfortable fit, and great sound quality." data-dimension48="This deal on the WF-1000XM5 brings them down to a spectacular price. They're a great bud that offers 8 hours of battery life, a comfortable fit, and great sound quality." data-dimension25="$228">View Deal</a></p></div><h2 id="and-the-award-for-probably-the-biggest-headphones-release-of-the-year-goes-to">And the award for (probably) the biggest headphones release of the year goes to...</h2><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="Uvfhp5MQdXWs23NdiMfRzZ" name="sony xm6 deal post" alt="the sony wh-1000xm6 headphones with a black friday badge" src="https://cdn.mos.cms.futurecdn.net/Uvfhp5MQdXWs23NdiMfRzZ.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Sony WH-1000XM6 released earlier this year to a whole Medieval city's worth of fanfare. Like, so much fanfare that you need the awesome ANC on these cans just to block it all out. </p><p>That's why I was so surprised to see the XM6s on sale this year. Although it's only a $61 discount, this is still an amazing saving considering how brand-spanking-new the XM6s are. </p><div class="product"><a data-dimension112="5c94fad7-5c30-4061-9216-e85f18b32c4d" data-action="Deal Block" data-label="Sony's latest ANC cans bring a whole host of great features. A more comfortable fit, better sound, and improved ANC as well as 30 hours of battery life. This deal is the first we've seen, and it's a great saving." data-dimension48="Sony's latest ANC cans bring a whole host of great features. A more comfortable fit, better sound, and improved ANC as well as 30 hours of battery life. This deal is the first we've seen, and it's a great saving." data-dimension25="$398" href="https://www.amazon.com/dp/B0F3QJLD3B/?th=1" 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:120.00%;"><img id="x3hpHUb8bPXUJsBkoevKDN" name="Sony WH-1000XM6" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/x3hpHUb8bPXUJsBkoevKDN.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Sony's latest ANC cans bring a whole host of great features. A more comfortable fit, better sound, and improved ANC as well as 30 hours of battery life. This deal is the first we've seen, and it's a great saving.<a class="view-deal button" href="https://www.amazon.com/dp/B0F3QJLD3B/?th=1" target="_blank" rel="nofollow" data-dimension112="5c94fad7-5c30-4061-9216-e85f18b32c4d" data-action="Deal Block" data-label="Sony's latest ANC cans bring a whole host of great features. A more comfortable fit, better sound, and improved ANC as well as 30 hours of battery life. This deal is the first we've seen, and it's a great saving." data-dimension48="Sony's latest ANC cans bring a whole host of great features. A more comfortable fit, better sound, and improved ANC as well as 30 hours of battery life. This deal is the first we've seen, and it's a great saving." data-dimension25="$398">View Deal</a></p></div><h2 id="let-s-show-the-older-models-some-love-too">Let's show the older models some love, 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7MvkR9v3VrqJihwxKWemwK" name="Earfun_AirPro4_13.JPG" alt="A photo of the EarFun Air Pro 4 earbuds in hand" src="https://cdn.mos.cms.futurecdn.net/7MvkR9v3VrqJihwxKWemwK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>We've covered the fantastic EarFun Air Pro 4+ here, but their slightly older sibling is also on sale! The <a href="https://www.amazon.com/EarFun-Canceling-Snapdragon-Bluetooth-Detection/dp/B0D5M9SH1X" target="_blank" rel="nofollow">EarFun Air Pro 4 earbuds are also on sale for just $53 at Amazon</a>. That's 35% off and a whole $21 cheaper than the sale price of the <a href="https://www.amazon.com/EarFun-Adaptive-Cancelling-Snapdragon-Bluetooth/dp/B0FSKRJFKT" target="_blank" rel="nofollow">Air Pro 4+ ($74)</a>.</p><p>Just like the newer model, we gave the original <a href="https://www.tomsguide.com/audio-headphones/earbuds/earfun-air-pro-4-review">EarFun Air Pro 4</a>s a 4.5-star rating in our review, praising the bass performance and sound quality, not to mention the ANC and comfort. They're fantastic budget buds.</p><h2 id="it-s-here-it-s-finally-here">It's here, it's finally here!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1524px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="ZYHxmWCFMjcJ5Dbg6LSYxd" name="Beats Studio Pro.jpg" alt="Beats Studio Pro" src="https://cdn.mos.cms.futurecdn.net/ZYHxmWCFMjcJ5Dbg6LSYxd.jpg" mos="" align="middle" fullscreen="" width="1524" height="857" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Beats)</span></figcaption></figure><p>Black Friday has finally started — and what better way to kick things off than a massive saving on some wicked Beats headphoes? They're now less than half price (57% off, to be exact), bringing them down to that low, low price. For this price they're an excellent pair of headphones, with good ANC, a comfortable fit, and solid sound. Don't miss this one!</p><ul><li><strong>Beats Studio Pro: </strong><a href="https://www.amazon.com/dp/B0FHM61VTK?" target="_blank" rel="nofollow"><strong>was $349 now $149 @ Amazon</strong></a></li></ul><h2 id="in-ear-noise-canceling-savings">In-ear noise canceling savings</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:986px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="nqWoeXGmGczFkTtn6A8rnD" name="Bose QuietComfort Ultra Earbuds gen 2" alt="Bose QuietComfort Ultra Earbuds gen 2" src="https://cdn.mos.cms.futurecdn.net/v2/t:505,l:417,cw:986,ch:555,q:80/nqWoeXGmGczFkTtn6A8rnD.png" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Bose)</span></figcaption></figure><p>The Bose QuietComfort Ultra earbuds gen 2 are some seriously impressive earbuds. They've got Bose's incredible noise canceling, sprinkle in some excellent sound, and have a comfortable fit thanks to some wicked little fitting wings. They don't have the most battery life around — 6 hours — but they're a great pair of noise canceling earbuds to pick up this Black Friday.</p><p>Note: Only the black color are reduced this much, the other colors are a little more expensive.</p><ul><li><strong>Bose QuietComfort Ultra Earbuds gen 2: </strong><a href="https://www.amazon.com/dp/B0F7M3HPBD?" target="_blank" rel="nofollow"><strong>was $299 now $216 @ Amazon</strong></a></li></ul><h2 id="clearly-you-should-buy-this-deal">"Clearly," you should buy this deal</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.13%;"><img id="ZSNnTE82aNesZFfV2wBnHg" name="Nothing Headphone (1)" alt="Nothing Headphone (1)" src="https://cdn.mos.cms.futurecdn.net/ZSNnTE82aNesZFfV2wBnHg.jpg" mos="" align="middle" fullscreen="" width="6000" height="3368" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Wait, I've already said that one before, haven't I? Oh well. This is a great deal on some solid headphones. They look absolutely insane with their see through covers and metal build, belying their otherwise low price. They sound ok too, although you'll need to work with the EQ settings inside to make sure they sound their best. Comfort is good and so is the ANC — for a first pair of headphones, they're a great effort.</p><p>And at this price they're a solid buy too, especially if you're after something different to the cans that most people slip over their heads.</p><ul><li><strong>Nothing Headphone (1): </strong><a href="https://www.amazon.com/dp/B0F66XD5LF?" target="_blank" rel="nofollow"><strong>was $299 now $399 @ Amazon</strong></a></li></ul><h2 id="this-deal-is-ace">This deal is ACE</h2><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="U45mLFuCwJm7ywMyxuHeoL" name="Sonos Ace 1-2.jpg" alt="Sonos Ace" src="https://cdn.mos.cms.futurecdn.net/U45mLFuCwJm7ywMyxuHeoL.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Sonos Ace were something of a surprise when I tested them — I wasn't expecting much for a brands first headphones, but they turned out to be a great pair of cans. The ANC is very good, the sound warm and enveloping, and the Spatial Audio second to none. 30 hours of battery makes sure they last a long time, and the hard case keeps them safe from damage.</p><p>I have come to adore the Sonos Ace, and this deal makes them a whole lot more affordable thanks to a new lowest price.</p><ul><li><strong>Sonos Ace: </strong><a href="https://www.amazon.com/dp/B0CYHGTMNH?" target="_blank" rel="nofollow"><strong>was $399 now $279 @ Amazon</strong></a></li></ul><h2 id="our-best-headphones-just-dropped-in-price">Our Best headphones just dropped in 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="xzrWQzGSpX7w3U4QPJvazA" name="Bowers & Wilkins PX7 S3-16" alt="Bowers & Wilkins PX7 S3" src="https://cdn.mos.cms.futurecdn.net/xzrWQzGSpX7w3U4QPJvazA.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The best headphones we've tested this year, the Bowers & Wilkins PX7 S3, are down to a new lowest price, but there's a couple of things to consider. First — they rose in price a couple of months ago to $479 from $459, making this deal not quite as strong as it might first appear. Second — they're excellent and you really need a pair.</p><p>They sound impeccable, they're supremely comfortable, all while blocking out loads of noise. If I was buying some flagship headphones today, I'd buy these ones. </p><ul><li><strong>Bowers & Wilkins PX7 S3: </strong><a href="https://www.amazon.com/dp/B0F45CTLMM/" target="_blank" rel="nofollow"><strong>was $479 now $429 @ Amazon</strong></a></li></ul><h2 id="budget-samsung-buds">Budget Samsung buds</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2449px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="HfpDsihZb4TQNs7P69Zhm7" name="Samsung Galaxy Buds FE_list.jpg" alt="Samsung Galaxy Buds FE in charging case" src="https://cdn.mos.cms.futurecdn.net/HfpDsihZb4TQNs7P69Zhm7.jpg" mos="" align="middle" fullscreen="" width="2449" height="1377" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Samsung Galaxy Buds FE are for the fans — of Galaxy devices. That means they've got loads of different features aimed directly at Galaxy users, like AI integration and some sound modes. They're small and comfortable and feature loads of battery life.</p><ul><li><strong>Samsung Galaxy Buds FE: </strong><a href="https://www.amazon.com/dp/B0CF7GYNW2?" target="_blank" rel="nofollow"><strong>was $99 now $59 @ Amazon</strong></a></li></ul><h2 id="flagship-features-not-a-flagship-price">Flagship features, not a flagship 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="emyi23dBF5Yw6updbm6jmX" name="JLab Lab Epic man" alt="JLab Epic Lab edition" src="https://cdn.mos.cms.futurecdn.net/emyi23dBF5Yw6updbm6jmX.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: JLab)</span></figcaption></figure><p>These little buds don't cost the world, but they're still an excellent option if you're looking for something filled with features. I enjoyed their sound when they hit my testbench, and I was big fan of the ANC. The battery life is good too — although the spatial audio implementation is worth leaving turned off. Not worth your time.</p><p>The buds though? well worth picking up.</p><ul><li><strong>JLab Epic Lab Edition: </strong><a href="https://www.amazon.com/dp/B0CGGM1CQ9?" target="_blank" rel="nofollow"><strong>was $199 now $99 @ Amazon</strong></a></li></ul><h2 id="brand-new-buds-small-discount">Brand new buds, small discount</h2><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="m7t8CX5jC8GYgv7afJfHDj" name="Beats Powerbeats Fit" alt="Beats Powerbeats Fit" src="https://cdn.mos.cms.futurecdn.net/m7t8CX5jC8GYgv7afJfHDj.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It's not been long since the Powerbeats fit joined the earbuds fold, but they've alreay got their first discount. It's not much, but if you were already planning on picking some up, then this is a great saving that'll help you get a pair. They're perfect for runners looking for some tiny buds to fill their ears while they exercise. </p><ul><li><strong>Beats Powerbeat Fit: </strong><a href="https://www.amazon.com/dp/B0FRN71389/" target="_blank" rel="nofollow"><strong>was $228 now $218 @ Amazon</strong></a></li></ul><h2 id="sony-s-best-headphones-now-reduced">Sony's best headphones, now reduced</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-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="FP8ouWYoG2nhsxPHVnRArb" name="Sony WH-1000XM6" alt="Sony WH-1000XM6" src="https://cdn.mos.cms.futurecdn.net/FP8ouWYoG2nhsxPHVnRArb.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Sony's most recent headphones, the WH-1000XM6 are a great pair of cans if you're looking for the perfect jack of all trades. They're good at pretty much everything — good sound, good ANC, good comfort — and provide a decent 30 hours of battery life. They've recently become my favorite headphones when I'm out and about, beating out Bose's headphones with better sound quality.</p><p>This is their first saving — and it's well worth picking a pair up if you're in the market.</p><ul><li><strong>Sony WH-1000XM6: </strong><a href="https://www.amazon.com/dp/B0F3PT1VBL/" target="_blank" rel="nofollow"><strong>was $459 now $398 @ Amazon</strong></a></li></ul><h2 id="shhhhh-it-s-a-gaming-headset">Shhhhh, it's a gaming headset...</h2><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="zwgpcPuKYvsJmKMwaVDqRf" name="HyperX_Cloud_III_S_ 9.JPG" alt="A black and red HyperX Cloud III S Wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/zwgpcPuKYvsJmKMwaVDqRf.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I won't tell if you don't. It's a very good gaming headset as well, with great sound and absolutely buckets of battery. 120 hours, to be exact. The mic sounds good, and the headset is comfortable for long periods of time. You can even connect them to your phone as normal headphones. Nice.</p><ul><li><strong>HyperX Cloud III S: </strong><a href="https://www.amazon.com/dp/B0F6NZWPTC?" target="_blank" rel="nofollow"><strong>was $179 now $119 @ Amazon</strong></a></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:2963px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="m224k4GyfvxmYtFhSccy8M" name="Power Beats Pro 2" alt="A Powerbeats Pro 2 (2025) photo taken by Tom's Guide." src="https://cdn.mos.cms.futurecdn.net/m224k4GyfvxmYtFhSccy8M.jpg" mos="" align="middle" fullscreen="" width="2963" height="1667" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you're after a new set of <a href="https://www.tomsguide.com/wellness/fitness/best-workout-headphones">workout headphones</a>, our Buying Guide Editor (and former Fitness Editor) used to rate the Jabra Elite Active range, which are now sadly discontinued. His new favorite pick are the Beats Powerbeats Pro 2, as they sound great, have good battery life and stay firmly in place with ear hooks. And, lucky for you, they're now $50 off at Amazon for Black Friday, dropping the price below $200. </p><ul><li><strong>Beasts Powerbeats Pro 2: </strong><a href="https://www.amazon.com/dp/B0DT2LTRL7" target="_blank" rel="nofollow"><strong>was $249 now $199 @ Amazon</strong></a><strong></strong></li></ul><h2 id="massive-bose-savings">Massive Bose savings</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2680px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="Jbq8YEGVxyAhVGA9S9XPNC" name="Bose QC Headphones-5.jpg" alt="Bose QuietComfort Headphones on grass" src="https://cdn.mos.cms.futurecdn.net/Jbq8YEGVxyAhVGA9S9XPNC.jpg" mos="" align="middle" fullscreen="" width="2680" height="1508" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>These are some truly epic headphones, now at an even better price. They're super light and comfortable, so you can wear them for hours and hours on end, and the noise canceling (as you might expect from something Bose makes) is top-notch. This saving is still one of the best we've ever seen on the headphones, making them their lowest price ever.</p><ul><li><strong>Bose QuietComfort headphones: </strong><a href="https://www.amazon.com/dp/B0DZHR44J9?" target="_blank" rel="nofollow"><strong>was $349 now $199 @ Amazon</strong></a></li></ul><h2 id="premium-headphones-big-deal">Premium headphones, big deal</h2><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="9sw96AtpzhMdZ26YXb2esQ" name="IMG_2300 (2).JPG" alt="Bang & Olufsen Beoplay HX headphones in an open case on picnic bench" src="https://cdn.mos.cms.futurecdn.net/9sw96AtpzhMdZ26YXb2esQ.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Beoplay HX are a stunning pair of headphones. They're wrapped in leather, covered with metal, and sound like nothing you've ever heard before. This deal chops $100 off their price for a great deal, but not quite a new lowest price. Here's to hoping they drop even more!</p><ul><li><strong>Bang & Olufsen Beoplay HX: </strong><a href="https://www.amazon.com/dp/B08YJ3W1HB?" target="_blank" rel="nofollow"><strong>was $599 now $499 @ Amazon</strong></a></li></ul><h2 id="how-about-something-cheap">How about something cheap?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:933px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="hNb5P3a4vZdEEMtHfNw9k6" name="JLab Go Lux ANC" alt="JLab Go Lux ANC" src="https://cdn.mos.cms.futurecdn.net/v2/t:78,l:88,cw:933,ch:525,q:80/hNb5P3a4vZdEEMtHfNw9k6.png" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: JLab)</span></figcaption></figure><p>"Tammy!" I hear you cry. "We're sick of all the expensive headphones!" I hear you, I hear you — so here's a nice cheap pair. These noise canceling on-ears are a cool, inexpensive headphones that offer loads of features for a great price. They're super light and compact as well, so you can pop them in a backpack nice and easily.</p><ul><li><strong>JLab Go Lux ANC: </strong><a href="https://www.amazon.com/dp/B0DRDSJXNF?" target="_blank" rel="nofollow"><strong>was $49 now $33 @ Amazon</strong></a></li></ul><h2 id="sennheiser-savings-for-days-or-at-least-today">Sennheiser savings for days (or at least today)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sYESMJ7vUWqEVQZFkt6kuY" name="TG_Sennheiser-Accentum_4.jpg" alt="Sennheiser Accentum headphones held up in front of a painting" src="https://cdn.mos.cms.futurecdn.net/sYESMJ7vUWqEVQZFkt6kuY.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I've been tracking this deal for a long time now, waiting for them to drop under $100 — and what have they done today? Dropped under $100! This is a stunning deal on some excellent headphones, giving you great sound for less. Their ANC is very good as well. This is not a deal to be missed if you're a big fan of top-notch sound quality.</p><ul><li><strong>Sennheiser ACCENTUM: </strong><a href="" target="_blank" rel="nofollow"><strong>was $199 now $99 @ Amazon</strong></a></li></ul><h2 id="google-pixel-buds-pro-2-don-t-mind-if-we-do">Google Pixel Buds Pro 2? Don't mind if we do...</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3639px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="Bi4mmMRTFPmCtW2uMfLkid" name="Google Pixel Buds 2 LEDE.jpg" alt="The Google Pixel Buds Pro 2 unboxed" src="https://cdn.mos.cms.futurecdn.net/Bi4mmMRTFPmCtW2uMfLkid.jpg" mos="" align="middle" fullscreen="" width="3639" height="2046" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Alex Bracetti/Future)</span></figcaption></figure><p>There are lowest prices everywhere at the moment — how about something from Google? The Google Pixel Buds Pro 2 are down to a new lowest price, making them more affordable than ever. They're a great pair of buds if you're looking for something to go with your pixel device, if you just want some super solid earbuds.</p><ul><li><strong>Google Pixel Buds Pro 2: </strong><a href="https://www.amazon.com/dp/B0FGKMZBZC?" target="_blank" rel="nofollow"><strong>was $229 now $133 @ Amazon</strong></a></li></ul><h2 id="earbuds-to-help-you-get-40-winks">Earbuds to help you get 40 winks</h2><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="prxWcBYPTmtyBbiZYAHqCb" name="Soundcore_SleepA20_10.JPG" alt="A photo of the Soundcore Sleep A20 earbuds in their open case being held in hand with a blue wall in the background." src="https://cdn.mos.cms.futurecdn.net/prxWcBYPTmtyBbiZYAHqCb.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Want to get some better sleep? Try out these funky little earbuds that are designed to help you get to the land of nod a little easier. They're comfortable (as you'd hope), and offer some solid sound quality for the things that help you get to sleep quicker.</p><ul><li><strong>Soundcore Sleep A20: </strong><a href="https://www.amazon.com/dp/B0CRGR2TS5?" target="_blank" rel="nofollow"><strong>was $179 now $107 @ Amazon</strong></a></li></ul><h2 id="exercise-headphones-for-all">Exercise headphones for 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="okFHP57J8SB3PSHFudtbLP" name="Beats Powerbeats Pro 2--1-LEDE" alt="Beats Powerbeats Pro 2" src="https://cdn.mos.cms.futurecdn.net/okFHP57J8SB3PSHFudtbLP.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Powerbeats Pro 2 are the perfect earbuds for athletes and fitness fanatics. They're very comfortable, and stay in place thanks to the earhook on the outside. The offer 45 hours of battery life to get them through the day, and very solid sound to make all your music sound good. Great buds, great price.</p><ul><li><strong>Beats Powerbeats Pro 2: </strong><a href="https://www.amazon.com/dp/B0DT2344N3?" target="_blank" rel="nofollow"><strong>was $249 now $199 @ Amazon</strong></a></li></ul><h2 id="my-most-recommended-over-ear-budget-headphones">My most-recommended over-ear budget headphones</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cLw5RCtXEtotHk9akGCKPf" name="jlab jbuds lux anc deal hero" alt="the jlab jbuds lux anc headphones with a blue tom's guide price drop badge" src="https://cdn.mos.cms.futurecdn.net/cLw5RCtXEtotHk9akGCKPf.png" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you want headphones that pack a serious punch for very little money, I highly recommend the JLab JBuds Lux ANC. These headphones are at their <strong>LOWEST PRICE</strong> ever. I love the comfy ear cups, the weighty bass, and the price tag can't be beaten. </p><ul><li><a href="https://www.amazon.com/JLab-Headphones-Cancelling-Customizable-Compatible/dp/B0CRMB9Z84" target="_blank" rel="nofollow">Grab the JLab JBuds Lux ANC for just $39 at Amazon now</a></li></ul><h2 id="bass-lovers-listen-up">Bass lovers, listen up </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oimuciWF4h9rjdNxzmNCC3" name="jbl live 770nc hero" alt="the jbl live 770 nc headphones" src="https://cdn.mos.cms.futurecdn.net/oimuciWF4h9rjdNxzmNCC3.png" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: JBL / Future)</span></figcaption></figure><p>These are my favorite headphones for ear-splitting bass. And I mean that in the best way possible. I <a href="https://www.tomsguide.com/audio/headphones/jbl-live-770nc-review" target="_blank" rel="nofollow">reviewed the JBL Live 770NC</a> earlier this year, and they're some of the loudest bass headphones money can buy. </p><div class="product"><a data-dimension112="dc2e888c-5baf-47e7-84d7-3554e96d0c70" data-action="Deal Block" data-label="The JBL Live 770 NC are fantastic headphones for bassheads. With fabric mesh earcups and app compatibility with JBL's app, these headphones are great entry-level cans for bassheads." data-dimension48="The JBL Live 770 NC are fantastic headphones for bassheads. With fabric mesh earcups and app compatibility with JBL's app, these headphones are great entry-level cans for bassheads." data-dimension25="$119" href="https://www.amazon.com/JBL-LIVE-770NC-Headphones-Comfort-fit/dp/B0CT6D6Q27" 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="JtpeH6pD6RthkLKXaP6RWC" name="jbl live 770nc" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/JtpeH6pD6RthkLKXaP6RWC.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The JBL Live 770 NC are fantastic headphones for bassheads. With fabric mesh earcups and app compatibility with JBL's app, these headphones are great entry-level cans for bassheads. <a class="view-deal button" href="https://www.amazon.com/JBL-LIVE-770NC-Headphones-Comfort-fit/dp/B0CT6D6Q27" target="_blank" rel="nofollow" data-dimension112="dc2e888c-5baf-47e7-84d7-3554e96d0c70" data-action="Deal Block" data-label="The JBL Live 770 NC are fantastic headphones for bassheads. With fabric mesh earcups and app compatibility with JBL's app, these headphones are great entry-level cans for bassheads." data-dimension48="The JBL Live 770 NC are fantastic headphones for bassheads. With fabric mesh earcups and app compatibility with JBL's app, these headphones are great entry-level cans for bassheads." data-dimension25="$119">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Sony WH-1000XM6 vs Bose QuietComfort Ultra Headphones — this is the pair you should buy for Black Friday ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/over-ear-headphones/sony-wh-1000xm6-vs-bose-quietcomfort-ultra-headphones-this-is-the-pair-you-should-buy-for-black-friday</link>
                                                                            <description>
                            <![CDATA[ Two hero headphones are vying for your cash this Black Friday —  but which should you buy? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">J7AeNcyN5BWLPaLqocLyee</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/rEGuNQ2dXee7gPQ5gGwTAM-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 21 Nov 2025 09:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Over-Ear Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Headphones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/rEGuNQ2dXee7gPQ5gGwTAM-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Headphones deals]]></media:description>                                                            <media:text><![CDATA[Headphones deals]]></media:text>
                                <media:title type="plain"><![CDATA[Headphones deals]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/rEGuNQ2dXee7gPQ5gGwTAM-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>So you've been saving for months to get the newest pair of noise canceling headphones around — but which do you buy? <a href="https://www.tomsguide.com/live/news/ive-picked-the-best-early-black-friday-deals-november-2025">Black Friday</a> has just dropped prices, so you're going to need to make a decision. Fast.</p><p>Is it the <a href="https://www.tomsguide.com/audio/over-ear-headphones/sony-wh-1000xm6-3-months-later-heres-my-honest-verdict-on-how-sonys-flagship-cans-hold-up">Sony WH-1000XM6</a>? The jack of all trades of headphones that block out loads of noise and offer 30 hours of battery. Or is it the <a href="https://www.tomsguide.com/audio/over-ear-headphones/ive-been-testing-the-second-generation-bose-quietcomfort-ultra-headphones-whats-new">second-generation Bose QuietComfort Ultra Headphones</a>, which block out <em>even more </em>noise but don't quite have as many features? Don't worry, I have the answer for you.</p><div class="product"><a data-dimension112="155a139f-1ef4-45ab-8e98-70ce981d7461" data-action="Deal Block" data-label="The latest Sony flagship headphones offer great sound, excellent ANC, and 30 hours of battery life. They're also packed with features, like spatial audio and a customizable EQ." data-dimension48="The latest Sony flagship headphones offer great sound, excellent ANC, and 30 hours of battery life. They're also packed with features, like spatial audio and a customizable EQ." data-dimension25="$398" href="https://www.amazon.com/dp/B0F3PQHWTZ/" 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:120.00%;"><img id="x3hpHUb8bPXUJsBkoevKDN" name="Sony WH-1000XM6" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/x3hpHUb8bPXUJsBkoevKDN.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The latest Sony flagship headphones offer great sound, excellent ANC, and 30 hours of battery life. They're also packed with features, like spatial audio and a customizable EQ. <a class="view-deal button" href="https://www.amazon.com/dp/B0F3PQHWTZ/" target="_blank" rel="nofollow" data-dimension112="155a139f-1ef4-45ab-8e98-70ce981d7461" data-action="Deal Block" data-label="The latest Sony flagship headphones offer great sound, excellent ANC, and 30 hours of battery life. They're also packed with features, like spatial audio and a customizable EQ." data-dimension48="The latest Sony flagship headphones offer great sound, excellent ANC, and 30 hours of battery life. They're also packed with features, like spatial audio and a customizable EQ." data-dimension25="$398">View Deal</a></p></div><div class="product"><a data-dimension112="11541d1d-75d5-4fdc-b3ff-5058e1a3b591" data-action="Deal Block" data-label="Bose's flagship headphones are the best way to block noise. Their noise canceling is the very best around, and they offer strong audio quality with up to 30 hours of battery life." data-dimension48="Bose's flagship headphones are the best way to block noise. Their noise canceling is the very best around, and they offer strong audio quality with up to 30 hours of battery life." data-dimension25="$399" href="https://www.amazon.com/dp/B0FDKR293G/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:816px;"><p class="vanilla-image-block" style="padding-top:124.39%;"><img id="YCmxJDRLZYcSDoxQ8fMynC" name="QuietComfort Ultra Gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YCmxJDRLZYcSDoxQ8fMynC.png" mos="" align="middle" fullscreen="" width="816" height="1015" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Bose's flagship headphones are the best way to block noise. Their noise canceling is the very best around, and they offer strong audio quality with up to 30 hours of battery life.<a class="view-deal button" href="https://www.amazon.com/dp/B0FDKR293G/" target="_blank" rel="nofollow" data-dimension112="11541d1d-75d5-4fdc-b3ff-5058e1a3b591" data-action="Deal Block" data-label="Bose's flagship headphones are the best way to block noise. Their noise canceling is the very best around, and they offer strong audio quality with up to 30 hours of battery life." data-dimension48="Bose's flagship headphones are the best way to block noise. Their noise canceling is the very best around, and they offer strong audio quality with up to 30 hours of battery life." data-dimension25="$399">View Deal</a></p></div><h3 class="article-body__section" id="section-do-you-want-the-best-noise-canceling"><span>Do you want the best noise canceling?</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vPkNbWYWPGMsPLVmRQbSu4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/vPkNbWYWPGMsPLVmRQbSu4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Sony WH-1000XM6 are very good at blocking noise. Their ANC is amongst the <a href="https://www.tomsguide.com/us/best-noise-cancelling-headphones,review-5566.html">best noise-canceling headphones</a>, doing a great job of keeping the outside world at bay.</p><p>But they're simply not as impressive as the Bose QuietComfort Ultra Headphones gen 2. They have the best ANC of any pair of headphones you can buy. There is no noise that the Bose headphones struggle with — it's hard to imagine noise canceling getting better.</p><ul><li><strong>You should buy — </strong><a href="https://www.amazon.com/dp/B0FDKR293G/" target="_blank" rel="nofollow"><strong>Bose QuietComfort Ultra Headphones gen 2 @ Amazon</strong></a></li></ul><h3 class="article-body__section" id="section-do-you-want-the-best-sound-quality"><span>Do you want the best sound quality?</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-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="MoNdTfXh66cbTdFsGMk7rb" name="Sony WH-1000XM6" alt="Sony WH-1000XM6" src="https://cdn.mos.cms.futurecdn.net/MoNdTfXh66cbTdFsGMk7rb.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Both headphones sound good, with warm sound signatures and plenty of detail. Neither will disappoint you if you pick them and stick them on your head.</p><p>But the Sony headphones sound better. They pay more attention to the finer parts of your music, with better vocal clarity and more control in the low end. If you care about the way that your music sounds, you should buy the WH-1000XM6.</p><ul><li><strong>You should buy — </strong><a href="https://www.amazon.com/dp/B0F3PQHWTZ/" target="_blank" rel="nofollow"><strong>Sony WH-1000XM6 @ Amazon</strong></a></li></ul><h3 class="article-body__section" id="section-do-you-want-the-best-comfort"><span>Do you want the best comfort?</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kqx5zRCDhnfa7o79Z8cru4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/kqx5zRCDhnfa7o79Z8cru4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Both headphones are very light and comfortable, and you won't have any problems with wearing them for longer periods of time. </p><p>The QuietComfort Ultra Headphones take the prize though. They feature plusher foam, and a more comfortable fit overall. I've been able to wear them all day before without them feeling uncomfortable. Want cushy cans? Buy the QC Ultra.</p><ul><li><strong>You should buy — </strong><a href="https://www.amazon.com/dp/B0FDKR293G/" target="_blank" rel="nofollow"><strong>Bose QuietComfort Ultra Headphones gen 2 @ Amazon</strong></a></li></ul><h3 class="article-body__section" id="section-do-you-want-the-best-battery-life"><span>Do you want the best battery life?</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4LCDTaJFXZvUgrNsQGjsyC" name="Sony WH-1000XM6--07" alt="A man wearing black Sony WH-1000XM6 noise-cancelling headphones with sunglasses" src="https://cdn.mos.cms.futurecdn.net/4LCDTaJFXZvUgrNsQGjsyC.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>With ANC turned on, both headphones offer ample 30 hours of battery life. That's plenty of juice to get you through a few days use.</p><p>Sony does offer more battery life overall though. If you turn off the ANC, you can bring the battery life up to 40 hours, giving you more staying power in a pinch. If you want the longer lasting headphones, then get the Sony cans.</p><ul><li><strong>You should buy — </strong><a href="https://www.amazon.com/dp/B0F3PQHWTZ/" target="_blank" rel="nofollow"><strong>Sony WH-1000XM6 @ Amazon</strong></a></li></ul><h3 class="article-body__section" id="section-do-you-want-the-most-features"><span>Do you want the most features?</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="m9nwmLgnDVg4LnMDCcNetb" name="Sony WH-1000XM6" alt="Sony WH-1000XM6" src="https://cdn.mos.cms.futurecdn.net/m9nwmLgnDVg4LnMDCcNetb.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Being flagship headphones, both the Sony and Bose are packed with features. EQ, spatial audio, noise control settings, and more.</p><p>But the Sony WH-1000XM6 simply have more options. There's more granular EQ, and better ANC modes. The application is also easier to use than the Bose app. </p><ul><li><strong>You should buy — </strong><a href="https://www.amazon.com/dp/B0F3PQHWTZ/" target="_blank" rel="nofollow"><strong>Sony WH-1000XM6 @ Amazon</strong></a></li></ul><h3 class="article-body__section" id="section-which-headphones-should-you-buy"><span>Which headphones should you buy?</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="e94eDhwrTmbmewFaVvrQ3D" name="Sony WH-1000XM6--01-LIST" alt="Black and white models of the Sony WH-1000XM6 noise-cancelling headphones outdoors in sunshine" src="https://cdn.mos.cms.futurecdn.net/e94eDhwrTmbmewFaVvrQ3D.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>No matter which pair of headphones you go for, you're going to have a good time. They're both comfortable cans that offer great ANC and excellent sound. But there can be only one that you take home this Black Friday — and that pair should be the Sony WH-1000XM6.</p><p>They offer more battery life, better sound, and more options in the app. The ANC gets close to the Bose headphones, and they're still very comfortable. As Black Friday settles in, the XM6 are the headphones you should buy. But keep an eye on further price drops to help you decide. </p><p><em>For more discounts, check out our </em><a href="https://www.tomsguide.com/live/news/amazon-black-friday-2025-lego-yeti-dyson"><em>Amazon Black Friday deals live blog</em></a><em> and our main </em><a href="https://www.tomsguide.com/live/news/ive-been-covering-black-friday-deals-for-18-years-my-top-picks"><em>Black Friday deals live blog</em></a><em>.</em></p><h3 class="article-body__section" id="section-shop-today-s-best-black-friday-deals"><span>Shop today's best Black Friday deals</span></h3><ul><li><strong>Amazon: </strong><a href="https://www.amazon.com/b?node=210998206011" target="_blank" rel="nofollow"><strong>50% off Ring, Ninja, AirPods and more</strong></a><strong></strong></li><li><strong>Walmart Plus: </strong><a href="https://www.walmart.com/plus" target="_blank" rel="nofollow"><strong>50% off @ Walmart</strong></a></li><li><strong>REI: </strong><a href="https://www.rei.com/f/scd-deals" target="_blank" rel="nofollow"><strong>half-off Arc'teryx, Patagonia, more</strong></a><strong></strong></li><li><strong>Dell: </strong><a href="https://www.dell.com/en-us/shop/deals?sortBy=price-ascending" target="_blank" rel="nofollow"><strong>monitors from $69, laptops from $299</strong></a><strong></strong></li><li><strong>Nectar: </strong><a href="https://www.nectarsleep.com/" target="_blank" rel="nofollow"><strong>50% off mattresses + bundles</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/all-electronics-on-sale/all-computers-tablets-on-sale/pcmcat1632941704767.c?id=pcmcat1632941704767" target="_blank" rel="nofollow"><strong>laptops from $149</strong></a><strong></strong></li><li><strong>Lenovo: </strong><a href="https://www.lenovo.com/us/en/d/deals/laptops/?IPromoID=LEN380027&sortBy=priceUp" target="_blank" rel="nofollow"><strong>doorbuster deals from $319</strong></a><strong></strong></li><li><strong>Wayfair: </strong><a href="https://www.wayfair.com/daily-sales" target="_blank" rel="nofollow"><strong>up to 80% off home decor</strong></a><strong></strong></li><li><strong>Lululemon: </strong><a href="https://shop.lululemon.com/c/we-made-too-much/n18mhd?Ns=price%7C0" target="_blank" rel="nofollow"><strong>top picks from $9</strong></a><strong></strong></li><li><strong>Newegg: </strong><a href="https://www.newegg.com/Black-November-Early-Access/EventSaleStore/ID-1132" target="_blank" rel="nofollow"><strong>Doorbuster deals from $6</strong></a></li><li><strong>Walmart: </strong><a href="https://www.walmart.com/cp/gifts/3131907" target="_blank" rel="nofollow"><strong>holiday gifts from $15</strong></a></li><li><strong>Birkenstock: </strong><a href="https://www.nordstrom.com/browse/sale?sort=PercentOff&filterByBrand=birkenstock" target="_blank" rel="nofollow"><strong>deals from $20 @ Nordstrom</strong></a><strong></strong></li><li><strong>Saatva: </strong><a href="https://www.saatva.com/mattresses/saatva-classic?utm_source=futurepublishing&utm_medium=affiliate&coupon=awyqqgzvxqicebab" target="_blank" rel="nofollow"><strong>luxury mattresses from $1,099</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Best early Bose Black Friday deals — save over 40% right now on these top noise canceling headphones  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/best-bose-black-friday-deals-save-up-to-usd170-on-noise-canceling-headphones-bluetooth-speakers-soundbars-and-more</link>
                                                                            <description>
                            <![CDATA[ Looking for something for a pair of QuietComfort Headphones or a Dolby Atmos soundbar this Black Friday? Here are the best Bose deals available right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">kRejqcFGskAjUVWZawrED8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mfAfrKDEKiQEh8oFt4Q8KQ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 18 Nov 2025 09:01:00 +0000</pubDate>                                                                                                                                <updated>Tue, 18 Nov 2025 22:38:40 +0000</updated>
                                                                                                                                            <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/mfAfrKDEKiQEh8oFt4Q8KQ-1280-80.jpg">
                                                            <media:credit><![CDATA[Bose, Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose deals]]></media:description>                                                            <media:text><![CDATA[Bose deals]]></media:text>
                                <media:title type="plain"><![CDATA[Bose deals]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mfAfrKDEKiQEh8oFt4Q8KQ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Bose makes some of my favorite audio devices, from its soundbars and Bluetooth speakers to the noise-canceling headphones and earbuds that make my commute more comfortable. But they tend to come with lofty price tags...Not right now! </p><p>The best way to get a great Bose deal? <a href="https://www.tomsguide.com/black-friday-deals-and-sales">Black Friday deals</a> — and this year the deals are especially good. For example, the <a href="https://www.amazon.com/dp/B0CCZ26B5V/" target="_blank" rel="nofollow">Bose QuietComfort Headphones are down to $169 at Amazon</a> after a massive $180 discount and the <a href="https://www.amazon.com/dp/B08VL5S148/" target="_blank" rel="nofollow">Bose SoundLink Revolve+ speaker is just to $179 at Amazon</a> after a 40% price drop. Looking for even more options? Here are all the best Bose Black Friday deals so far.</p><h2 id="best-bose-black-friday-deals-quick-links">Best Bose Black Friday deals: Quick links</h2><ul><li><strong>Bose SoundLink Flex (2nd Gen): </strong><a href="https://www.amazon.com/dp/B0DV5H3S16/" target="_blank" rel="nofollow"><strong>was $149 now $119 @ Amazon</strong></a><strong></strong></li><li><strong>Bose QuietComfort Earbuds: </strong><a href="https://www.amazon.com/dp/B0DZHQHDWR/" target="_blank" rel="nofollow"><strong>was $179 now $129 @ Amazon</strong></a><strong></strong></li><li><strong>Bose QuietComfort Headphones: </strong><a href="https://www.amazon.com/dp/B0CCZ26B5V/" target="_blank" rel="nofollow"><strong>was $349 now $199 @ Amazon</strong></a><strong></strong></li><li><strong>Bose SoundLink Home Speaker: </strong><a href="https://www.amazon.com/dp/B0DT7FT7BC/" target="_blank" rel="nofollow"><strong>was $219 now $179 @ Amazon</strong></a><strong></strong></li><li><strong>Bose SoundLink Revolve+: </strong><a href="https://www.amazon.com/dp/B08VL5S148/" target="_blank" rel="nofollow"><strong>was $299 now $179 @ Amazon</strong></a><strong></strong></li><li><strong>Bose SoundLink Plus: </strong><a href="https://www.amazon.com/dp/B0F7HVC62G/" target="_blank" rel="nofollow"><strong>was $269 now $199 @ Amazon</strong></a><strong></strong></li><li><strong>Bose TV Speaker: </strong><a href="https://www.amazon.com/dp/B088KRPCQJ/" target="_blank" rel="nofollow"><strong>was $279 now $199 @ Amazon</strong></a><strong></strong></li><li><strong>Bose New QuietComfort Ultra Earbuds (2nd Gen): </strong><a href="https://www.amazon.com/dp/B0FDKS5NN7/" target="_blank" rel="nofollow"><strong>was $299 now $249 @ Amazon</strong></a><strong></strong></li><li><strong>Bose QuietComfort Ultra headphones: </strong><a href="https://www.amazon.com/dp/B0CCZ1L489/" target="_blank" rel="nofollow"><strong>was $429 now $298 @ Amazon</strong></a><strong></strong></li><li><strong>Bose Smart Dolby Atmos Soundbar: </strong><a href="https://www.amazon.com/dp/B0D6W8XQ6J/" target="_blank" rel="nofollow"><strong>was $499 now $399 @ Amazon</strong></a><strong></strong></li></ul><h2 id="bose-earbuds-and-headphones-deals">Bose earbuds and headphones deals</h2><div class="product"><a data-dimension112="b373af53-fe2f-4655-8356-7ff16a132d1a" data-action="Deal Block" data-label="The Bose QuietComfort Earbuds are a great way to get stunning ANC without spending loads of money — and they're even better at this price. 8.5 hours of battery life, combined with great sound and a comfortable fit, make for some excellent portable music companions." data-dimension48="The Bose QuietComfort Earbuds are a great way to get stunning ANC without spending loads of money — and they're even better at this price. 8.5 hours of battery life, combined with great sound and a comfortable fit, make for some excellent portable music companions." data-dimension25="$129" href="https://www.amazon.com/dp/B0DZHQHDWR/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:95.55%;"><img id="gng2pmSiBsvdSJEfE2mEde" name="Bose QuietComfort Earbuds" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/gng2pmSiBsvdSJEfE2mEde.png" mos="" align="middle" fullscreen="" width="1280" height="1223" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Earbuds are a great way to get stunning ANC without spending loads of money — and they're even better at this price. 8.5 hours of battery life, combined with great sound and a comfortable fit, make for some excellent portable music companions.<a class="view-deal button" href="https://www.amazon.com/dp/B0DZHQHDWR/" target="_blank" rel="nofollow" data-dimension112="b373af53-fe2f-4655-8356-7ff16a132d1a" data-action="Deal Block" data-label="The Bose QuietComfort Earbuds are a great way to get stunning ANC without spending loads of money — and they're even better at this price. 8.5 hours of battery life, combined with great sound and a comfortable fit, make for some excellent portable music companions." data-dimension48="The Bose QuietComfort Earbuds are a great way to get stunning ANC without spending loads of money — and they're even better at this price. 8.5 hours of battery life, combined with great sound and a comfortable fit, make for some excellent portable music companions." data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="f74b499f-c9d0-4062-b6c3-e546483373f0" data-action="Deal Block" data-label="The excellent QuietComfort Headphones are over 40% off right now, bringing their wicked ANC and comfortable fit to a much more affordable price point.You also get an richer sound profile, as well as up to 24 hours of battery life." data-dimension48="The excellent QuietComfort Headphones are over 40% off right now, bringing their wicked ANC and comfortable fit to a much more affordable price point.You also get an richer sound profile, as well as up to 24 hours of battery life." data-dimension25="$199" href="https://www.amazon.com/dp/B0CCZ26B5V/" 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="YmXJvbwXhi7xr7vPRU4WYg" name="Bose QuietComfort Headphones on white.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YmXJvbwXhi7xr7vPRU4WYg.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The excellent QuietComfort Headphones are over 40% off right now, bringing their wicked ANC and comfortable fit to a much more affordable price point.You also get an richer sound profile, as well as up to 24 hours of battery life. </p><p><a class="view-deal button" href="https://www.amazon.com/dp/B0CCZ26B5V/" target="_blank" rel="nofollow" data-dimension112="f74b499f-c9d0-4062-b6c3-e546483373f0" data-action="Deal Block" data-label="The excellent QuietComfort Headphones are over 40% off right now, bringing their wicked ANC and comfortable fit to a much more affordable price point.You also get an richer sound profile, as well as up to 24 hours of battery life." data-dimension48="The excellent QuietComfort Headphones are over 40% off right now, bringing their wicked ANC and comfortable fit to a much more affordable price point.You also get an richer sound profile, as well as up to 24 hours of battery life." data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="d0077924-8475-4e01-ba01-ecb8ce1ec92b" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 are the newest buds Bose makes, and they're a great way to block out the noise when traveling. They sound good (as you'd expect), and offer 6 hours of battery life. This $50 saving brings them down to their lowest price ever." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 are the newest buds Bose makes, and they're a great way to block out the noise when traveling. They sound good (as you'd expect), and offer 6 hours of battery life. This $50 saving brings them down to their lowest price ever." data-dimension25="$249" href="https://www.amazon.com/dp/B0FDKS5NN7/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1021px;"><p class="vanilla-image-block" style="padding-top:120.47%;"><img id="dPBaXRmeVmBu9WvD58rU87" name="QuietComfort Ultra Earbuds (2nd Gen)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dPBaXRmeVmBu9WvD58rU87.png" mos="" align="middle" fullscreen="" width="1021" height="1230" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Ultra Earbuds gen 2 are the newest buds Bose makes, and they're a great way to block out the noise when traveling. They sound good (as you'd expect), and offer 6 hours of battery life. This $50 saving brings them down to their lowest price ever.<a class="view-deal button" href="https://www.amazon.com/dp/B0FDKS5NN7/" target="_blank" rel="nofollow" data-dimension112="d0077924-8475-4e01-ba01-ecb8ce1ec92b" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 are the newest buds Bose makes, and they're a great way to block out the noise when traveling. They sound good (as you'd expect), and offer 6 hours of battery life. This $50 saving brings them down to their lowest price ever." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 are the newest buds Bose makes, and they're a great way to block out the noise when traveling. They sound good (as you'd expect), and offer 6 hours of battery life. This $50 saving brings them down to their lowest price ever." data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="254b42bb-bf89-4eb0-aaec-edbefc6dba89" data-action="Deal Block" data-label="This deal on the QuietComfort Ultra Headphones brings them down to their lowest price ever. They're the best headphones at blocking out noise at this price, and deliver excellent sound and 24 hours of battery. In terms of comfort, they can't be beat." data-dimension48="This deal on the QuietComfort Ultra Headphones brings them down to their lowest price ever. They're the best headphones at blocking out noise at this price, and deliver excellent sound and 24 hours of battery. In terms of comfort, they can't be beat." data-dimension25="$298" href="https://www.amazon.com/dp/B0CCZ1L489/" 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:120.00%;"><img id="g64SDV3bmD2tcgopiiNgP6" name="Bose QuietComfort Ultra headphones Versus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g64SDV3bmD2tcgopiiNgP6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This deal on the QuietComfort Ultra Headphones brings them down to their lowest price ever. They're the best headphones at blocking out noise at this price, and deliver excellent sound and 24 hours of battery. In terms of comfort, they can't be beat.<a class="view-deal button" href="https://www.amazon.com/dp/B0CCZ1L489/" target="_blank" rel="nofollow" data-dimension112="254b42bb-bf89-4eb0-aaec-edbefc6dba89" data-action="Deal Block" data-label="This deal on the QuietComfort Ultra Headphones brings them down to their lowest price ever. They're the best headphones at blocking out noise at this price, and deliver excellent sound and 24 hours of battery. In terms of comfort, they can't be beat." data-dimension48="This deal on the QuietComfort Ultra Headphones brings them down to their lowest price ever. They're the best headphones at blocking out noise at this price, and deliver excellent sound and 24 hours of battery. In terms of comfort, they can't be beat." data-dimension25="$298">View Deal</a></p></div><h2 id="bose-black-friday-bluetooth-speaker-deals">Bose Black Friday Bluetooth speaker deals</h2><div class="product"><a data-dimension112="da73936c-c2a5-48cb-8d63-73c747cebcf3" data-action="Deal Block" data-label="This portable Bluetooth speaker deal saves you a bundle on a solid speaker. It sounds good, and you can customize the sound in the Bose app. Plus, 12 hours of battery should keep the party going all night." data-dimension48="This portable Bluetooth speaker deal saves you a bundle on a solid speaker. It sounds good, and you can customize the sound in the Bose app. Plus, 12 hours of battery should keep the party going all night." data-dimension25="$119" href="https://www.amazon.com/dp/B0DV5H3S16/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="kV2Dneqhh92s4K4ypy7spA" name="Bose Soundlink Flex.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kV2Dneqhh92s4K4ypy7spA.jpeg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This portable Bluetooth speaker deal saves you a bundle on a solid speaker. It sounds good, and you can customize the sound in the Bose app. Plus, 12 hours of battery should keep the party going all night.<a class="view-deal button" href="https://www.amazon.com/dp/B0DV5H3S16/" target="_blank" rel="nofollow" data-dimension112="da73936c-c2a5-48cb-8d63-73c747cebcf3" data-action="Deal Block" data-label="This portable Bluetooth speaker deal saves you a bundle on a solid speaker. It sounds good, and you can customize the sound in the Bose app. Plus, 12 hours of battery should keep the party going all night." data-dimension48="This portable Bluetooth speaker deal saves you a bundle on a solid speaker. It sounds good, and you can customize the sound in the Bose app. Plus, 12 hours of battery should keep the party going all night." data-dimension25="$119">View Deal</a></p></div><div class="product"><a data-dimension112="7b769c04-f544-4648-a079-3a840027241f" data-action="Deal Block" data-label="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension48="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension25="$179" href="https://www.amazon.com/dp/B08VL5S148/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:871px;"><p class="vanilla-image-block" style="padding-top:172.22%;"><img id="e6o2rGs8aAMyy3SPFHLwNK" name="SoundLink Revolve+" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/e6o2rGs8aAMyy3SPFHLwNK.png" mos="" align="middle" fullscreen="" width="871" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever.<a class="view-deal button" href="https://www.amazon.com/dp/B08VL5S148/" target="_blank" rel="nofollow" data-dimension112="7b769c04-f544-4648-a079-3a840027241f" data-action="Deal Block" data-label="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension48="Bose's cylindrical smart speaker brings great sound quality to your home. It lasts for 17 hours, and you can even connect two together for stereo sound. This deal brings the speaker down to its lowest price ever." data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="daac6e84-f1e7-4603-bfc9-3327416cd717" data-action="Deal Block" data-label="I love my pair of Soundlink Home speakers thanks to their handsome looks and solid sound profile. You can connect them together for stereo mode as well. More than 9 hours of battery would be nice, though. Still, this is an excellent deal price on a lovely speaker." data-dimension48="I love my pair of Soundlink Home speakers thanks to their handsome looks and solid sound profile. You can connect them together for stereo mode as well. More than 9 hours of battery would be nice, though. Still, this is an excellent deal price on a lovely speaker." data-dimension25="$179" href="https://www.amazon.com/dp/B0DT7FT7BC/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:827px;"><p class="vanilla-image-block" style="padding-top:58.65%;"><img id="b9zi7aAFzqby3DuaeGuEKX" name="SoundLink Home Speaker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/b9zi7aAFzqby3DuaeGuEKX.png" mos="" align="middle" fullscreen="" width="827" height="485" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>I love my pair of Soundlink Home speakers thanks to their handsome looks and solid sound profile. You can connect them together for stereo mode as well. More than 9 hours of battery would be nice, though. Still, this is an excellent deal price on a lovely speaker.<a class="view-deal button" href="https://www.amazon.com/dp/B0DT7FT7BC/" target="_blank" rel="nofollow" data-dimension112="daac6e84-f1e7-4603-bfc9-3327416cd717" data-action="Deal Block" data-label="I love my pair of Soundlink Home speakers thanks to their handsome looks and solid sound profile. You can connect them together for stereo mode as well. More than 9 hours of battery would be nice, though. Still, this is an excellent deal price on a lovely speaker." data-dimension48="I love my pair of Soundlink Home speakers thanks to their handsome looks and solid sound profile. You can connect them together for stereo mode as well. More than 9 hours of battery would be nice, though. Still, this is an excellent deal price on a lovely speaker." data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="127105a8-b3c5-4704-b4b1-a15411be91da" data-action="Deal Block" data-label="This relatively new Bluetooth speaker is only just seeing its first discounts, and they're really good. This is a big saving on a speaker that offers great sound quality and 20 hours of battery life." data-dimension48="This relatively new Bluetooth speaker is only just seeing its first discounts, and they're really good. This is a big saving on a speaker that offers great sound quality and 20 hours of battery life." data-dimension25="$199" href="https://www.amazon.com/dp/B0F7HVC62G/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1225px;"><p class="vanilla-image-block" style="padding-top:65.14%;"><img id="CkhRCcUrnpVYz3tSK5uJJk" name="SoundLink Plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CkhRCcUrnpVYz3tSK5uJJk.png" mos="" align="middle" fullscreen="" width="1225" height="798" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This relatively new Bluetooth speaker is only just seeing its first discounts, and they're really good. This is a big saving on a speaker that offers great sound quality and 20 hours of battery life.<a class="view-deal button" href="https://www.amazon.com/dp/B0F7HVC62G/" target="_blank" rel="nofollow" data-dimension112="127105a8-b3c5-4704-b4b1-a15411be91da" data-action="Deal Block" data-label="This relatively new Bluetooth speaker is only just seeing its first discounts, and they're really good. This is a big saving on a speaker that offers great sound quality and 20 hours of battery life." data-dimension48="This relatively new Bluetooth speaker is only just seeing its first discounts, and they're really good. This is a big saving on a speaker that offers great sound quality and 20 hours of battery life." data-dimension25="$199">View Deal</a></p></div><h2 id="bose-black-friday-soundbar-deals">Bose Black Friday soundbar deals</h2><div class="product"><a data-dimension112="5bad68d2-fec7-4a75-ab47-941431bba1e1" data-action="Deal Block" data-label="This is a great deal if you're looking to get better sound for your TV at a more affordable price point. The Bose TV Speaker focuses on dialogue to make it easier to hear what people are saying on-screen. Not only does it boost your TV sound, but you can also connect with Bluetooth so that you can listen to your music wirelessly." data-dimension48="This is a great deal if you're looking to get better sound for your TV at a more affordable price point. The Bose TV Speaker focuses on dialogue to make it easier to hear what people are saying on-screen. Not only does it boost your TV sound, but you can also connect with Bluetooth so that you can listen to your music wirelessly." data-dimension25="$199" href="https://www.amazon.com/dp/B088KRPCQJ/" 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:39.47%;"><img id="AHTTmLHs5odVXSuSHG9SB9" name="TV speaker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AHTTmLHs5odVXSuSHG9SB9.png" mos="" align="middle" fullscreen="" width="1500" height="592" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is a great deal if you're looking to get better sound for your TV at a more affordable price point. The Bose TV Speaker focuses on dialogue to make it easier to hear what people are saying on-screen. Not only does it boost your TV sound, but you can also connect with Bluetooth so that you can listen to your music wirelessly.<a class="view-deal button" href="https://www.amazon.com/dp/B088KRPCQJ/" target="_blank" rel="nofollow" data-dimension112="5bad68d2-fec7-4a75-ab47-941431bba1e1" data-action="Deal Block" data-label="This is a great deal if you're looking to get better sound for your TV at a more affordable price point. The Bose TV Speaker focuses on dialogue to make it easier to hear what people are saying on-screen. Not only does it boost your TV sound, but you can also connect with Bluetooth so that you can listen to your music wirelessly." data-dimension48="This is a great deal if you're looking to get better sound for your TV at a more affordable price point. The Bose TV Speaker focuses on dialogue to make it easier to hear what people are saying on-screen. Not only does it boost your TV sound, but you can also connect with Bluetooth so that you can listen to your music wirelessly." data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="61f5ec99-62de-43db-be53-919f19132d0f" data-action="Deal Block" data-label="This medium-sized Dolby Atmos soundbar offers great sound and loads of smart features. You can stream music over a WiFi connection and watch surround sound movies. This $100 deal is a great way to get improved sound quality for your TV at a reasonable price." data-dimension48="This medium-sized Dolby Atmos soundbar offers great sound and loads of smart features. You can stream music over a WiFi connection and watch surround sound movies. This $100 deal is a great way to get improved sound quality for your TV at a reasonable price." data-dimension25="$399" href="https://www.amazon.com/dp/B0D6W8XQ6J/" 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="XT9aaiGZoDf6MtibTHXgr6" name="bose smart soundbar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XT9aaiGZoDf6MtibTHXgr6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This medium-sized Dolby Atmos soundbar offers great sound and loads of smart features. You can stream music over a WiFi connection and watch surround sound movies. This $100 deal is a great way to get improved sound quality for your TV at a reasonable price.<a class="view-deal button" href="https://www.amazon.com/dp/B0D6W8XQ6J/" target="_blank" rel="nofollow" data-dimension112="61f5ec99-62de-43db-be53-919f19132d0f" data-action="Deal Block" data-label="This medium-sized Dolby Atmos soundbar offers great sound and loads of smart features. You can stream music over a WiFi connection and watch surround sound movies. This $100 deal is a great way to get improved sound quality for your TV at a reasonable price." data-dimension48="This medium-sized Dolby Atmos soundbar offers great sound and loads of smart features. You can stream music over a WiFi connection and watch surround sound movies. This $100 deal is a great way to get improved sound quality for your TV at a reasonable price." data-dimension25="$399">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Not a typo! Bose QuietComfort Ultra Headphones just hit their lowest price ever — save $130 now ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/over-ear-headphones/act-fast-this-early-black-friday-deal-brings-the-bose-quietcomfort-ultra-headphones-down-to-their-lowest-price-ever</link>
                                                                            <description>
                            <![CDATA[ The Bose QuietComfort Ultra Headphones just dropped to their lowest price ever, and Black Friday hasn't even started yet. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">yHXgcWwzGKhxciVPVxWVfa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/RcjKPQMagzKhdxX4XNJbBU-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 17 Nov 2025 16:54:57 +0000</pubDate>                                                                                                                                <updated>Tue, 18 Nov 2025 18:28:56 +0000</updated>
                                                                                                                                            <category><![CDATA[Over-Ear Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Headphones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/RcjKPQMagzKhdxX4XNJbBU-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose QuietComfort Ultra Headphones]]></media:description>                                                            <media:text><![CDATA[Bose QuietComfort Ultra Headphones]]></media:text>
                                <media:title type="plain"><![CDATA[Bose QuietComfort Ultra Headphones]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/RcjKPQMagzKhdxX4XNJbBU-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Bose QuietComfort Ultra Headphones were (until the gen 2 came out) my favorite pair of noise-canceling headphones. There's very little better at blocking out noise, and not much more comfortable. Unfortunately, such performance used to come at a high price.</p><p>Not anymore, though. The <a href="https://www.amazon.com/dp/B0CCZ1L489/" target="_blank" rel="nofollow">Bose QuietComfort Ultra Headphones are currently just $298 at Amazon</a>, thanks to a stunning $130 discount. That's their lowest price ever, and makes them much cheaper than the competition from Sony. Don't delay — Amazon says they're "selling fast," so you might want to be quick on the trigger.</p><div class="product"><a data-dimension112="095400cb-fb31-42cf-a15b-f81906fa5024" data-action="Deal Block" data-label="This is the best price I've ever seen on the Bose QuietComfort Ultra Headphones. What do you get in return? Epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension48="This is the best price I've ever seen on the Bose QuietComfort Ultra Headphones. What do you get in return? Epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension25="$298" href="https://www.amazon.com/dp/B0CCZ1L489/" 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:120.00%;"><img id="g64SDV3bmD2tcgopiiNgP6" name="Bose QuietComfort Ultra headphones Versus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g64SDV3bmD2tcgopiiNgP6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is the best price I've ever seen on the Bose QuietComfort Ultra Headphones. What do you get in return? Epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else.<a class="view-deal button" href="https://www.amazon.com/dp/B0CCZ1L489/" target="_blank" rel="nofollow" data-dimension112="095400cb-fb31-42cf-a15b-f81906fa5024" data-action="Deal Block" data-label="This is the best price I've ever seen on the Bose QuietComfort Ultra Headphones. What do you get in return? Epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension48="This is the best price I've ever seen on the Bose QuietComfort Ultra Headphones. What do you get in return? Epic ANC, super sound, and the most comfortable fit this side of wrapping your head in a snood that plays music. 24 hours of battery life isn't the best, but they make up for it with just about everything else." data-dimension25="$298">View Deal</a></p></div><p>Bose is the king of noise canceling, and until the second generation Ultra Headphones came out, the <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-ultra-headphones">Bose QuietComfort Ultra Headphones</a> were the top of the tree. They redefined a headphone's ability to block noise, silencing anything that might come close to disturbing your peace. Or the Backstreet Boys.</p><p>My pair never left my side, and they topped our list of the <a href="https://www.tomsguide.com/us/best-noise-cancelling-headphones,review-5566.html">best noise-canceling headphones</a>. There's more to love beyond their excellent noise canceling, of course. The fit, for example, is lightweight and comfortable for hours on end. Once, my music stopped playing, and I forgot I was wearing them. I searched for a good 10 minutes before I remembered they were still on my head.</p><p>Whether that says more about me or the headphones is up to you.</p><p>The sound is solid, and their "Immersive Sound" feature is one of the best versions of Spatial Audio around. Rather than using a Dolby mix like other headphones (<a href="https://www.tomsguide.com/audio/ive-road-tested-the-airpods-max-with-usb-c-the-good-the-bad-and-the-ugly">AirPods Max</a>, for example), it takes a normal stereo recording and places parts of it around you for the spatial effect. It works well, although it does sap the battery.</p><p>A battery that only lasts for 24 hours — the only real drawback of the headphones. While more battery would be nice, for just under $300, this might just be the best deal I've seen during Black Friday season. Get 'em while they're hot!</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Not a typo! Bose QuietComfort Headphones are 51% off now in early Black Friday deal  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-headphones-drop-to-their-lowest-price-in-this-early-black-friday-deal-save-43-percent</link>
                                                                            <description>
                            <![CDATA[ The Bose QuietComfort Headphones drop to their lowest price ever thanks to this massive saving. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">pQMAEmhwU8zZF6CYuxWNt</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mFdFKziC4LRfZ5BHQYkzGY-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 17 Nov 2025 10:04:21 +0000</pubDate>                                                                                                                                <updated>Mon, 17 Nov 2025 15:37:56 +0000</updated>
                                                                                                                                            <category><![CDATA[Over-Ear Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Headphones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/mFdFKziC4LRfZ5BHQYkzGY-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose QuietComfort Headphones outside with TG deals badge]]></media:description>                                                            <media:text><![CDATA[Bose QuietComfort Headphones outside with TG deals badge]]></media:text>
                                <media:title type="plain"><![CDATA[Bose QuietComfort Headphones outside with TG deals badge]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mFdFKziC4LRfZ5BHQYkzGY-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Bose's noise-canceling headphones likely need no introduction. They're renowned for their incredibly ANC, no matter which model you slide off the shelf and into your shopping cart. However, they're known for being particularly affordable — something that this monster deal fixes. </p><p>Right now you can pick up the <a href="https://www.amazon.com/dp/B0DZHR44J9?" target="_blank" rel="nofollow">QuietComfort Headphones for $169 at Amazon</a>, thanks to a massive $180 discount. That's a new lowest price ever, making them the perfect early Black Friday buy. This is a very low price, and they're flying off the shelves — better get in there quick! </p><div class="product"><a data-dimension112="3e2fe362-f164-4076-aefb-bf84c5e57946" data-action="Deal Block" data-label="The Bose QuietComfort Headphones bring the firm's signature noise canceling and warm sound to a more affordable price. They've got 24 hours of battery life, a great hardcase, and their ample padding and light weight make them very comfortable. This is their lowest price ever." data-dimension48="The Bose QuietComfort Headphones bring the firm's signature noise canceling and warm sound to a more affordable price. They've got 24 hours of battery life, a great hardcase, and their ample padding and light weight make them very comfortable. This is their lowest price ever." data-dimension25="$169" href="https://www.amazon.com/dp/B0CCZ26B5V/" 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="YmXJvbwXhi7xr7vPRU4WYg" name="Bose QuietComfort Headphones on white.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YmXJvbwXhi7xr7vPRU4WYg.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Headphones bring the firm's signature noise canceling and warm sound to a more affordable price. They've got 24 hours of battery life, a great hardcase, and their ample padding and light weight make them very comfortable. This is their lowest price ever.<a class="view-deal button" href="https://www.amazon.com/dp/B0CCZ26B5V/" target="_blank" rel="nofollow" data-dimension112="3e2fe362-f164-4076-aefb-bf84c5e57946" data-action="Deal Block" data-label="The Bose QuietComfort Headphones bring the firm's signature noise canceling and warm sound to a more affordable price. They've got 24 hours of battery life, a great hardcase, and their ample padding and light weight make them very comfortable. This is their lowest price ever." data-dimension48="The Bose QuietComfort Headphones bring the firm's signature noise canceling and warm sound to a more affordable price. They've got 24 hours of battery life, a great hardcase, and their ample padding and light weight make them very comfortable. This is their lowest price ever." data-dimension25="$169">View Deal</a></p></div><ul><li><strong>Earbuds deals: </strong><a href="https://www.bestbuy.com/site/promo/headphone-and-speaker-deals" target="_blank" rel="nofollow"><strong>Best Buy</strong></a><strong> | </strong><a href="https://www.walmart.com/browse/electronics/shop-headphones-by-type/3944_133251_1095191_1230614?sort=best_match&cat_id=3944_133251_1095191_1230614_1230476&stores=3081&ps=40" target="_blank" rel="nofollow"><strong>Walmart</strong></a><strong> | </strong><a href="https://www.amazon.com/s?k=earbuds&crid=2RWE1G9N1EIF&sprefix=earbuds%2Caps%2C161&ref=nb_sb_noss_1" target="_blank" rel="nofollow"><strong>Amazon</strong></a><strong> | </strong><a href="https://www.samsung.com/us/mobile/audio/all-audio/" target="_blank" rel="nofollow"><strong>Samsung</strong></a><strong> | </strong><a href="https://www.dell.com/en-us/search/earbuds" target="_blank" rel="nofollow"><strong>Dell</strong></a></li></ul><p>I can think of few ways cheaper than this to get ANC as good as you'll find with the Bose QuietComfort Headphones. It's not quite as good as the noise canceling in Bose's premium model, the <a href="https://www.tomsguide.com/audio/ive-used-the-bose-quietcomfort-ultra-headphones-for-6-months-heres-what-i-like-and-dont-like">QuietComfort Ultra Headphones</a>, but they do a spectacular job of keeping out the noise of the outside world.</p><p>Wailing baby on the plane? Silenced. Those shouting teenagers on the bus? But a whisper. The noisy sports fans cluttering up the train? As if they were never there. </p><p>With a press of a button and a quick orchestral swell, the noise canceling kicks in, and you're in your own cocoon of music. Or an audiobook. Whatever floats your audio boat.</p><p>They sound good too, with a warm sound signature. Best of all, though, is their comfort. They're extremely light, and there's loads of soft padding on the earcups and the headband, so they never feel uncomfortable. I've been able to wear them for hours and hours on end as a result. </p><p>They're some of the <a href="https://www.tomsguide.com/us/best-noise-cancelling-headphones,review-5566.html">best noise-canceling headphones</a> you can buy right now, and at this price, they're well worth it.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Best early Black Friday headphones deals under $150 — save big on Sony, Soundcore, JBL and more ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/headphones/best-early-black-friday-headphones-deals-under-usd150-save-up-to-usd200-on-sony-soundcore-jbl-and-more</link>
                                                                            <description>
                            <![CDATA[ There are loads of ways to save on headphones at the moment, especially if you want to pay under $150. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">pH4HcDxsXeZUGdcS9yAuue</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/pXjBzkPzzwZnyHLJjzN4jT-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 17 Nov 2025 08:01:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/pXjBzkPzzwZnyHLJjzN4jT-1280-80.jpg">
                                                            <media:credit><![CDATA[Soundcore, JBL, Sony, Skullcandy, Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Headphones deals]]></media:description>                                                            <media:text><![CDATA[Headphones deals]]></media:text>
                                <media:title type="plain"><![CDATA[Headphones deals]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/pXjBzkPzzwZnyHLJjzN4jT-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Good headphones are generally considered "expensive." But what if I told you there where loads of ways to get a pair of decent headphones without spending loads and loads of money? Something wireless that you can take on the go, so that you can listen to your favorite tunes wherever you are. </p><p>Well let me tell you about some excellent <a href="https://www.tomsguide.com/live/news/best-early-black-friday-deals-2025-tech-apparel-smart-home-holiday">early Black Friday deals</a> that have arrived before Black Friday proper. If you're looking for something super cheap, then make sure you don't miss the <a href="https://www.amazon.com/dp/B092CP8ZH4?" target="_blank" rel="nofollow">JBL Tune 510BT, which are $24 at Amazon</a>. That's half price! Want something a bit shinier? The <a href="https://www.bestbuy.com/product/beats-studio3-wireless-noise-cancelling-headphones-white/JJ8XJL7QP2" target="_blank" rel="nofollow">Beats Studio 3 are down to $149 at Best Buy</a>, thanks to a massive $200 saving. These are the best early Black Friday headphones deals.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong>JBL Tune 510BT: </strong><a href="https://www.amazon.com/dp/B092CP8ZH4?" target="_blank" rel="nofollow"><strong>was $49 now $24 @ Amazon</strong></a><strong></strong></li><li><strong>Soundcore Q20i: </strong><a href="https://www.amazon.com/dp/B0CQXMXJC5/" target="_blank" rel="nofollow"><strong>was $69 now $39 @ Amazon</strong></a><strong></strong></li><li><strong>JBL Tune 720BT: </strong><a href="https://www.amazon.com/dp/B0CTBCDD6D?" target="_blank" rel="nofollow"><strong>was $89 now $44 @ Amazon</strong></a><strong></strong></li><li><strong>JLab JBuds Lux: </strong><a href="https://www.amazon.com/dp/B0CRM9LQW2/" target="_blank" rel="nofollow"><strong>was $79 now $49 @ Amazon</strong></a><strong></strong></li><li><strong>Sony WH-CH720N: </strong><a href="https://www.amazon.com/dp/B0BS74M665?" target="_blank" rel="nofollow"><strong>was $179 now $99 @ Amazon</strong></a><strong></strong></li><li><strong>TREBLAB Z7 Pro: </strong><a href="https://www.amazon.com/dp/B08V1VKMLS?" target="_blank" rel="nofollow"><strong>was $199 now $107 @ Amazon</strong></a><strong></strong></li><li><strong>Skullcandy Crusher ANC 2: </strong><a href="https://www.bestbuy.com/product/skullcandy-crusher-anc-2-over-the-ear-noise-canceling-wireless-headphones-black-tan/J3GWL576GL" target="_blank" rel="nofollow"><strong>was $239 now $119 @ Best Buy</strong></a><strong></strong></li><li><strong>Sennheiser ACCENTUM: </strong><a href="https://www.bestbuy.com/product/sennheiser-accentum-wireless-bluetooth-around-the-ear-headphones-hybrid-noise-cancelling-anc-all-day-comfort-blue/J3GW2LHPFY" target="_blank" rel="nofollow"><strong>was $189 now $129 @ Best Buy</strong></a><strong></strong></li><li><strong>Beats Studio³: </strong><a href="https://www.bestbuy.com/product/beats-studio3-wireless-noise-cancelling-headphones-white/JJ8XJL7QP2" target="_blank" rel="nofollow"><strong>was $349 now $141 @ Best Buy</strong></a></li><li><strong>More Headphone deals: </strong><a href="https://www.walmart.com/browse/3944_133251_1095191_1230614_1230477" target="_blank" rel="nofollow"><strong>Walmart</strong></a><strong> | </strong><a href="https://www.bestbuy.com/site/promo/headphone-and-speaker-deals" target="_blank" rel="nofollow"><strong>Best Buy</strong></a><strong> | </strong><a href="https://www.amazon.com/s?k=headphones&crid=3JN832N1C6WXP&sprefix=headphones%2Caps%2C172&ref=nb_sb_noss_1" target="_blank" rel="nofollow"><strong>Amazon</strong></a><strong> | </strong><a href="https://www.dell.com/en-us/search/headphones?p=1&c=8310%2C8318&f=true&ac=categoryfacetselect" target="_blank" rel="nofollow"><strong>Dell</strong></a></li></ul><h3 class="article-body__section" id="section-best-headphones-deals-under-150"><span>Best headphones deals under $150</span></h3><div class="product"><a data-dimension112="402ef5ac-2778-454a-8590-ab8d1d5e245f" data-action="Deal Block" data-label="These headphones feature 40 hours of battery life, a light and comfortable fit, and a bassy sound signature. There's no case in the box, but for this incredible deal price they're unmissable." data-dimension48="These headphones feature 40 hours of battery life, a light and comfortable fit, and a bassy sound signature. There's no case in the box, but for this incredible deal price they're unmissable." data-dimension25="$24" href="https://www.amazon.com/dp/B092CP8ZH4?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1027px;"><p class="vanilla-image-block" style="padding-top:117.43%;"><img id="E2jMqnyiBfpNZQYNBkXnPC" name="JBL Tune 510BT.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/E2jMqnyiBfpNZQYNBkXnPC.jpg" mos="" align="middle" fullscreen="" width="1027" height="1206" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These headphones feature 40 hours of battery life, a light and comfortable fit, and a bassy sound signature. There's no case in the box, but for this incredible deal price they're unmissable.<a class="view-deal button" href="https://www.amazon.com/dp/B092CP8ZH4?" target="_blank" rel="nofollow" data-dimension112="402ef5ac-2778-454a-8590-ab8d1d5e245f" data-action="Deal Block" data-label="These headphones feature 40 hours of battery life, a light and comfortable fit, and a bassy sound signature. There's no case in the box, but for this incredible deal price they're unmissable." data-dimension48="These headphones feature 40 hours of battery life, a light and comfortable fit, and a bassy sound signature. There's no case in the box, but for this incredible deal price they're unmissable." data-dimension25="$24">View Deal</a></p></div><div class="product"><a data-dimension112="5d2d7fe3-b966-4edd-9269-f279615fdf25" data-action="Deal Block" data-label="This is a fully featured pair of ANC headphones for a very low cost. 40 hours of battery life is excellent, and the sound is great for something that costs so little. You can even customize the way they sound with the Soundcore app." data-dimension48="This is a fully featured pair of ANC headphones for a very low cost. 40 hours of battery life is excellent, and the sound is great for something that costs so little. You can even customize the way they sound with the Soundcore app." data-dimension25="$39" href="https://www.amazon.com/dp/B0CQXMXJC5/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:864px;"><p class="vanilla-image-block" style="padding-top:138.77%;"><img id="MPPbPTVQCCLDS3RUPyCdoe" name="Soundcore by Anker Q20i.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/MPPbPTVQCCLDS3RUPyCdoe.jpg" mos="" align="middle" fullscreen="" width="864" height="1199" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is a fully featured pair of ANC headphones for a very low cost. 40 hours of battery life is excellent, and the sound is great for something that costs so little. You can even customize the way they sound with the Soundcore app.<a class="view-deal button" href="https://www.amazon.com/dp/B0CQXMXJC5/" target="_blank" rel="nofollow" data-dimension112="5d2d7fe3-b966-4edd-9269-f279615fdf25" data-action="Deal Block" data-label="This is a fully featured pair of ANC headphones for a very low cost. 40 hours of battery life is excellent, and the sound is great for something that costs so little. You can even customize the way they sound with the Soundcore app." data-dimension48="This is a fully featured pair of ANC headphones for a very low cost. 40 hours of battery life is excellent, and the sound is great for something that costs so little. You can even customize the way they sound with the Soundcore app." data-dimension25="$39">View Deal</a></p></div><div class="product"><a data-dimension112="e6d8840c-6c44-4f9b-8595-48d2e58ef3b9" data-action="Deal Block" data-label="This pair of headphones offers 76 hours of battery life — that's some of the most you'll find in any headphones. They fold up for easy storage, and charge up super quickly if the battery runs. This half price deal brings them down to their lowest price ever." data-dimension48="This pair of headphones offers 76 hours of battery life — that's some of the most you'll find in any headphones. They fold up for easy storage, and charge up super quickly if the battery runs. This half price deal brings them down to their lowest price ever." data-dimension25="$44" href="https://www.amazon.com/dp/B0CTBCDD6D?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1190px;"><p class="vanilla-image-block" style="padding-top:113.61%;"><img id="kYA8RY5ohsqVvc9Ki7zKfL" name="JBL Tune 720BT.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kYA8RY5ohsqVvc9Ki7zKfL.jpg" mos="" align="middle" fullscreen="" width="1190" height="1352" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This pair of headphones offers 76 hours of battery life — that's some of the most you'll find in any headphones. They fold up for easy storage, and charge up super quickly if the battery runs. This half price deal brings them down to their lowest price ever.<a class="view-deal button" href="https://www.amazon.com/dp/B0CTBCDD6D?" target="_blank" rel="nofollow" data-dimension112="e6d8840c-6c44-4f9b-8595-48d2e58ef3b9" data-action="Deal Block" data-label="This pair of headphones offers 76 hours of battery life — that's some of the most you'll find in any headphones. They fold up for easy storage, and charge up super quickly if the battery runs. This half price deal brings them down to their lowest price ever." data-dimension48="This pair of headphones offers 76 hours of battery life — that's some of the most you'll find in any headphones. They fold up for easy storage, and charge up super quickly if the battery runs. This half price deal brings them down to their lowest price ever." data-dimension25="$44">View Deal</a></p></div><div class="product"><a data-dimension112="97b0e9a9-a2f8-4299-8ea9-1ba9a76b04ed" data-action="Deal Block" data-label="The JLab JBuds Lux are a great pair of ANC headphones. The noise canceling is good for the price, and the sound is top-notch. There's no case, but they do fold down small to fit into your bag. This deal is only for the light gray color." data-dimension48="The JLab JBuds Lux are a great pair of ANC headphones. The noise canceling is good for the price, and the sound is top-notch. There's no case, but they do fold down small to fit into your bag. This deal is only for the light gray color." data-dimension25="$49" href="https://www.amazon.com/dp/B0CRM9LQW2/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:932px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="WGegDqwQmSDe5J9L4mtenP" name="jlab jbuds lux anc deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WGegDqwQmSDe5J9L4mtenP.jpg" mos="" align="middle" fullscreen="" width="932" height="932" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The JLab JBuds Lux are a great pair of ANC headphones. The noise canceling is good for the price, and the sound is top-notch. There's no case, but they do fold down small to fit into your bag. This deal is only for the light gray color.<a class="view-deal button" href="https://www.amazon.com/dp/B0CRM9LQW2/" target="_blank" rel="nofollow" data-dimension112="97b0e9a9-a2f8-4299-8ea9-1ba9a76b04ed" data-action="Deal Block" data-label="The JLab JBuds Lux are a great pair of ANC headphones. The noise canceling is good for the price, and the sound is top-notch. There's no case, but they do fold down small to fit into your bag. This deal is only for the light gray color." data-dimension48="The JLab JBuds Lux are a great pair of ANC headphones. The noise canceling is good for the price, and the sound is top-notch. There's no case, but they do fold down small to fit into your bag. This deal is only for the light gray color." data-dimension25="$49">View Deal</a></p></div><div class="product"><a data-dimension112="bcdbba4c-cebb-4809-99c3-b611e92a9d73" data-action="Deal Block" data-label="This pair of Sony headphones are a steal at this price. You get ANC derived from some of the best headphones money can buy, a comfortable fit, and great sound quality.  35 hours of battery is plenty to get you through the day." data-dimension48="This pair of Sony headphones are a steal at this price. You get ANC derived from some of the best headphones money can buy, a comfortable fit, and great sound quality.  35 hours of battery is plenty to get you through the day." data-dimension25="$99" href="https://www.amazon.com/dp/B0BS74M665?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:715px;"><p class="vanilla-image-block" style="padding-top:135.52%;"><img id="EgXs4tJqH6ZcAbzxZCZCdV" name="41tp0JPPlmL._AC_SL1200_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EgXs4tJqH6ZcAbzxZCZCdV.jpg" mos="" align="middle" fullscreen="" width="715" height="969" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This pair of Sony headphones are a steal at this price. You get ANC derived from some of the best headphones money can buy, a comfortable fit, and great sound quality.  35 hours of battery is plenty to get you through the day.<a class="view-deal button" href="https://www.amazon.com/dp/B0BS74M665?" target="_blank" rel="nofollow" data-dimension112="bcdbba4c-cebb-4809-99c3-b611e92a9d73" data-action="Deal Block" data-label="This pair of Sony headphones are a steal at this price. You get ANC derived from some of the best headphones money can buy, a comfortable fit, and great sound quality.  35 hours of battery is plenty to get you through the day." data-dimension48="This pair of Sony headphones are a steal at this price. You get ANC derived from some of the best headphones money can buy, a comfortable fit, and great sound quality.  35 hours of battery is plenty to get you through the day." data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="9ddd5388-a0c7-4fbe-938b-7e1b164d83c8" data-action="Deal Block" data-label="There's a case in the box! That'll make sure they're safe from damage when you put them in your bag. The ANC is effective, the is sound decent, and 45 hours of battery will keep them going through your workday." data-dimension48="There's a case in the box! That'll make sure they're safe from damage when you put them in your bag. The ANC is effective, the is sound decent, and 45 hours of battery will keep them going through your workday." data-dimension25="$104" href="https://www.amazon.com/dp/B08V1VKMLS?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:97.87%;"><img id="zrtr6pAbCZsSDwothKg5sY" name="Z7 Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zrtr6pAbCZsSDwothKg5sY.png" mos="" align="middle" fullscreen="" width="1500" height="1468" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>There's a case in the box! That'll make sure they're safe from damage when you put them in your bag. The ANC is effective, the is sound decent, and 45 hours of battery will keep them going through your workday.<a class="view-deal button" href="https://www.amazon.com/dp/B08V1VKMLS?" target="_blank" rel="nofollow" data-dimension112="9ddd5388-a0c7-4fbe-938b-7e1b164d83c8" data-action="Deal Block" data-label="There's a case in the box! That'll make sure they're safe from damage when you put them in your bag. The ANC is effective, the is sound decent, and 45 hours of battery will keep them going through your workday." data-dimension48="There's a case in the box! That'll make sure they're safe from damage when you put them in your bag. The ANC is effective, the is sound decent, and 45 hours of battery will keep them going through your workday." data-dimension25="$104">View Deal</a></p></div><div class="product"><a data-dimension112="36d45452-7d51-4db3-82a3-16234668ad1f" data-action="Deal Block" data-label="So we heard you like bass? Well, these are the headphones for you. Thanks to Skullcandy's love of the low stuff, these are some bassy cans. They're also comfortable despite a heavier weight, and they offer some great physical controls. 49 hours of battery life is excellent as well." data-dimension48="So we heard you like bass? Well, these are the headphones for you. Thanks to Skullcandy's love of the low stuff, these are some bassy cans. They're also comfortable despite a heavier weight, and they offer some great physical controls. 49 hours of battery life is excellent as well." data-dimension25="$119" href="https://www.bestbuy.com/product/skullcandy-crusher-anc-2-over-the-ear-noise-canceling-wireless-headphones-black-tan/J3GWL576GL" 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:109.00%;"><img id="ZhXB5vSgaqRGtP8JN5hYCm" name="Crusher ANC 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ZhXB5vSgaqRGtP8JN5hYCm.png" mos="" align="middle" fullscreen="" width="900" height="981" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>So we heard you like bass? Well, these are the headphones for you. Thanks to Skullcandy's love of the low stuff, these are some bassy cans. They're also comfortable despite a heavier weight, and they offer some great physical controls. 49 hours of battery life is excellent as well.<a class="view-deal button" href="https://www.bestbuy.com/product/skullcandy-crusher-anc-2-over-the-ear-noise-canceling-wireless-headphones-black-tan/J3GWL576GL" target="_blank" rel="nofollow" data-dimension112="36d45452-7d51-4db3-82a3-16234668ad1f" data-action="Deal Block" data-label="So we heard you like bass? Well, these are the headphones for you. Thanks to Skullcandy's love of the low stuff, these are some bassy cans. They're also comfortable despite a heavier weight, and they offer some great physical controls. 49 hours of battery life is excellent as well." data-dimension48="So we heard you like bass? Well, these are the headphones for you. Thanks to Skullcandy's love of the low stuff, these are some bassy cans. They're also comfortable despite a heavier weight, and they offer some great physical controls. 49 hours of battery life is excellent as well." data-dimension25="$119">View Deal</a></p></div><div class="product"><a data-dimension112="60700a71-d297-4386-aed2-a52bdd8389b3" data-action="Deal Block" data-label="The Sennheiser Accentum offer great sound, ANC, and a lovely fit for a great price. 50 hours of battery is excellent as well, letting them last for your full work week. This Blue colorway features lovely blue accents amongst the black paneling." data-dimension48="The Sennheiser Accentum offer great sound, ANC, and a lovely fit for a great price. 50 hours of battery is excellent as well, letting them last for your full work week. This Blue colorway features lovely blue accents amongst the black paneling." data-dimension25="$129" href="https://www.bestbuy.com/product/sennheiser-accentum-wireless-bluetooth-around-the-ear-headphones-hybrid-noise-cancelling-anc-all-day-comfort-blue/J3GW2LHPFY" 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:120.00%;"><img id="w4h5rQZx5FFLCZKLXqRqEn" name="Sennheiser Accentum wireless prod image.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/w4h5rQZx5FFLCZKLXqRqEn.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Sennheiser Accentum offer great sound, ANC, and a lovely fit for a great price. 50 hours of battery is excellent as well, letting them last for your full work week. This Blue colorway features lovely blue accents amongst the black paneling.<a class="view-deal button" href="https://www.bestbuy.com/product/sennheiser-accentum-wireless-bluetooth-around-the-ear-headphones-hybrid-noise-cancelling-anc-all-day-comfort-blue/J3GW2LHPFY" target="_blank" rel="nofollow" data-dimension112="60700a71-d297-4386-aed2-a52bdd8389b3" data-action="Deal Block" data-label="The Sennheiser Accentum offer great sound, ANC, and a lovely fit for a great price. 50 hours of battery is excellent as well, letting them last for your full work week. This Blue colorway features lovely blue accents amongst the black paneling." data-dimension48="The Sennheiser Accentum offer great sound, ANC, and a lovely fit for a great price. 50 hours of battery is excellent as well, letting them last for your full work week. This Blue colorway features lovely blue accents amongst the black paneling." data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="239f1294-e422-47d5-a247-6ac104296453" data-action="Deal Block" data-label="Beats' older model of ANC headphones are still a decent option, especially at this reduced price. The ANC is solid, they sound pretty good, and the padding is comfortable. They have a good hardcase as well." data-dimension48="Beats' older model of ANC headphones are still a decent option, especially at this reduced price. The ANC is solid, they sound pretty good, and the padding is comfortable. They have a good hardcase as well." data-dimension25="$141" href="https://www.bestbuy.com/product/beats-studio3-wireless-noise-cancelling-headphones-white/JJ8XJL7QP2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:672px;"><p class="vanilla-image-block" style="padding-top:118.90%;"><img id="EXoMb2NWgbaM2TLT4P7iSn" name="Capture.PNG" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EXoMb2NWgbaM2TLT4P7iSn.png" mos="" align="middle" fullscreen="" width="672" height="799" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Beats' older model of ANC headphones are still a decent option, especially at this reduced price. The ANC is solid, they sound pretty good, and the padding is comfortable. They have a good hardcase as well. <a class="view-deal button" href="https://www.bestbuy.com/product/beats-studio3-wireless-noise-cancelling-headphones-white/JJ8XJL7QP2" target="_blank" rel="nofollow" data-dimension112="239f1294-e422-47d5-a247-6ac104296453" data-action="Deal Block" data-label="Beats' older model of ANC headphones are still a decent option, especially at this reduced price. The ANC is solid, they sound pretty good, and the padding is comfortable. They have a good hardcase as well." data-dimension48="Beats' older model of ANC headphones are still a decent option, especially at this reduced price. The ANC is solid, they sound pretty good, and the padding is comfortable. They have a good hardcase as well." data-dimension25="$141">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I ditched my Bose QuietComfort Ultra Headphones for no headphones — and I've never felt better ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/over-ear-headphones/i-ditched-my-quietcomfort-ultra-headphones-and-went-anc-free-and-ive-never-felt-safer</link>
                                                                            <description>
                            <![CDATA[ My noise-canceling experiment continues, as I try to be safer while out and about. But how am I doing? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">vmqDKQdq55LEdaj2pVW3Gi</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/NZSaQVTjyyQAUhvWeRw8u4-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 13 Nov 2025 11:41:55 +0000</pubDate>                                                                                                                                <updated>Thu, 13 Nov 2025 12:36:30 +0000</updated>
                                                                                                                                            <category><![CDATA[Over-Ear Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Headphones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/NZSaQVTjyyQAUhvWeRw8u4-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose QuietComfort Ultra Gen 2]]></media:description>                                                            <media:text><![CDATA[Bose QuietComfort Ultra Gen 2]]></media:text>
                                <media:title type="plain"><![CDATA[Bose QuietComfort Ultra Gen 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/NZSaQVTjyyQAUhvWeRw8u4-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/audio/over-ear-headphones/ive-ditched-my-bose-headphones-why-im-going-anc-free-for-a-week">I have now been ANC-free for a month</a>. A long month of hearing traffic noise, of dodging pedestrians with their faces buried in their phones, and being heckled by people with books on the side of the street. But I am resolute, knowing that I am safer without ANC while walking around, so that I can hear cars before they hit me. I am a pinball at train stations no longer.</p><p>But the <a href="https://www.tomsguide.com/audio/over-ear-headphones/ive-been-testing-the-second-generation-bose-quietcomfort-ultra-headphones-whats-new">Bose QuietComfort Ultra Headphones Gen 2</a> look at me with a sultry gaze, tempting me back to the noise-canceling fold. But I stand firm, my inhuman will to hear the outside world stronger than the quiet comfort of Bose's headphones. I will resist. I <em>must</em> resist.</p><p>So, how have I really done, and has my experience been worth the lack of noise canceling? Let me tell you of a noisy month, and one that's revealed how I handle quitting something.</p><div class="product"><a data-dimension112="3db2f518-069f-4644-9624-cc785b3e7c55" data-action="Deal Block" data-label="These are the headphones I've given up using while walking about and at home. They're truly the best way to listen to music on the go, thanks to that game-changing ANC. It's a bit like magic. If magic blocked noise. and lived in your headphones." data-dimension48="These are the headphones I've given up using while walking about and at home. They're truly the best way to listen to music on the go, thanks to that game-changing ANC. It's a bit like magic. If magic blocked noise. and lived in your headphones." data-dimension25="$449" href="https://www.amazon.com/dp/B0FDKR293G/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:816px;"><p class="vanilla-image-block" style="padding-top:124.39%;"><img id="YCmxJDRLZYcSDoxQ8fMynC" name="QuietComfort Ultra Gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YCmxJDRLZYcSDoxQ8fMynC.png" mos="" align="middle" fullscreen="" width="816" height="1015" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These are the headphones I've given up using while walking about and at home. They're truly the best way to listen to music on the go, thanks to that game-changing ANC. It's a bit like magic. If magic blocked noise. and lived in your headphones.<a class="view-deal button" href="https://www.amazon.com/dp/B0FDKR293G/" target="_blank" rel="nofollow" data-dimension112="3db2f518-069f-4644-9624-cc785b3e7c55" data-action="Deal Block" data-label="These are the headphones I've given up using while walking about and at home. They're truly the best way to listen to music on the go, thanks to that game-changing ANC. It's a bit like magic. If magic blocked noise. and lived in your headphones." data-dimension48="These are the headphones I've given up using while walking about and at home. They're truly the best way to listen to music on the go, thanks to that game-changing ANC. It's a bit like magic. If magic blocked noise. and lived in your headphones." data-dimension25="$449">View Deal</a></p></div><h3 class="article-body__section" id="section-i-feel-safer-everywhere-i-go"><span>I feel safer everywhere I go</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DotViRVTNuwAYv7AnHEkt4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/DotViRVTNuwAYv7AnHEkt4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of the primary reasons I gave up ANC was because I felt unsafe while wearing the <a href="https://www.tomsguide.com/us/best-noise-cancelling-headphones,review-5566.html">best noise-canceling headphones</a>. While sealed in a musical cocoon, I found that I couldn't handle what was happening around me, and I was terrified of being hit by a car. Stations and underground stops were particularly gnarly as I dodged my fellow passengers while trying to listen out for station and train announcements. </p><p>Now, without ANC over my ears, I do feel safer. Many would call me a pansy (some did, and to you I say, "I hope you don't get hit by a car with your ANC headphones on"), but I am more aware of the world around me than I ever have been before.</p><p>I am more grounded, my senses more rounded and less dulled. Turns out, when crossing the road, I don't just use my eyes — I also seem to use my ears, as I listen out for cars that might not stop when they're supposed to. I don't hesitate at the crosswalk, unsure if it's actually safe to go.</p><p>I just <em>know.</em></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="oaXkLCf9wPBantf4EeNz3R" name="Bose QuietComfort Ultra Earbuds 2" alt="Bose QuietComfort Ultra Earbuds 2" src="https://cdn.mos.cms.futurecdn.net/oaXkLCf9wPBantf4EeNz3R.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>But it's not just that. When I go to the shop or a fast food joint, I don't have to turn anything off for the cashier. I just, like, talk to them. It's so much more natural, so much more human. There's nothing in the way between me and my conversation partner. They don't have to speak up — and, perhaps crucially, there's no horrible digital filter thing making them sound like they're a computer.</p><p>I notice the small things now more than ever. The birds singing in the park I walk through every day, and the sound of cool sports cars that use the roads nearby. I was able to strike up a conversation with an old dude the other day who seemed like he needed the company — with ANC turned on, I don't think I'd have noticed any of those things.</p><h3 class="article-body__section" id="section-it-s-been-harder-than-i-expected"><span>It's been harder than I expected</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="axicsMz6R3mA72PCiFiZv4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/axicsMz6R3mA72PCiFiZv4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I am no stranger to quitting. I gave up smoking in 2020, and I've not picked up a death stick since. I've ditched social media to help improve my headspace and avoid toxicity. Quitting is something I'm generally quite good at, so it surprised me how difficult it has been to leave my ANC headphones at home when I go for a walk.</p><p>I think part of it is down to my job. I test headphones, and that means I have to see how they perform when you're out and about outside. I need to make sure that the ANC blocks out the noise of traffic, other pedestrians, and other noises that might disturb a potential user's day.</p><p>So there are times when I can't avoid ANC outside. And I think that makes it very easy just to grab my headphones when I wander on past the table by the door, stuffing my earbuds in my pocket as I've always done.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wTXbQGFHJoipVP9x4bY7u4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/wTXbQGFHJoipVP9x4bY7u4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Then there's my promise not to use ANC when I'm at home working. When I don't need it, I have reams upon reams of wired headphones that don't feature ANC and generally sound better than wireless options. But the best wireless headphones are so <em>easy. </em></p><p>I just pick up my headphones, put them on my head, and press play. They connect instantly and play music without having to plug anything in or change any device settings. Forgive me, father, I have sinned — I have used my ANC headphones at home. It's too simple, too easy.</p><p>And there are no cars in my office to avoid.</p><h3 class="article-body__section" id="section-it-s-not-for-everyone"><span>It's not for everyone</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MrMZCAm5VaGopn5CKLU9v4" name="Bose QuietComfort Ultra Gen 2" alt="Bose QuietComfort Ultra Gen 2" src="https://cdn.mos.cms.futurecdn.net/MrMZCAm5VaGopn5CKLU9v4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It was pointed out to me when I first wrote about giving ANC up that a world without noise-canceling headphones is not for everyone. For some neurodiverse people, the world can be overwhelming, buffeting them with millions of different things to divide their attention. Noise-canceling headphones give them at least some form of respite, allowing them a calm mind.</p><p>But for those who can give up ANC headphones, I would thoroughly suggest you give it a try. The last month for me has been eye (and ear) opening, and I've felt freer than ever without noise-canceling blocking out half the world. </p><p>I feel safer and more involved with what's happening around me — and I can only see that as a good thing.</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/gaming/pc-gaming/steam-machine-vs-ps5-vs-xbox-series-x-s-vs-mac-mini-how-does-valves-new-console-compare">Steam Machine vs PS5 vs Xbox Series X/S vs Mac mini: How does Valve's new console compare?</a></li><li><a href="https://www.tomsguide.com/live/news/best-black-friday-deals-sales-picked-by-experts">I'm vetting the best Black Friday deals LIVE from Amazon, Hulu, Walmart, Best Buy and more</a></li><li><a href="https://www.tomsguide.com/tvs/i-found-all-the-best-tv-deals-ahead-of-black-friday-over-50-percent-slashed-on-sony-samsung-lg-and-more-at-best-buy">I found all the best TV deals ahead of Black Friday — over 50% slashed on Sony, Samsung, LG, and more at Best Buy</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Act fast! This early Black Friday deal brings the Bose QuietComfort Ultra Earbuds down to their lowest price yet ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/earbuds/hurry-this-massive-bose-quietcomfort-ultra-earbuds-deal-makes-them-the-same-price-as-the-airpods-pro-3</link>
                                                                            <description>
                            <![CDATA[ The second generation of Bose's QuietComfort Ultra Earbuds gen 2 has just dropped to a price comparable to the AirPods Pro 3 — and I know which I'd buy. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Czaeg4HJHsapVMBCzJNWdk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HQq4CG6iFVzjJEmGroidWX-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 12 Nov 2025 10:06:20 +0000</pubDate>                                                                                                                                <updated>Thu, 13 Nov 2025 18:09:35 +0000</updated>
                                                                                                                                            <category><![CDATA[Earbuds]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Headphones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/HQq4CG6iFVzjJEmGroidWX-1280-80.jpg">
                                                            <media:credit><![CDATA[Future/Bose]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose QuietComfort Ulta Earbuds gen 2 with deal tag ]]></media:description>                                                            <media:text><![CDATA[Bose QuietComfort Ulta Earbuds gen 2 with deal tag ]]></media:text>
                                <media:title type="plain"><![CDATA[Bose QuietComfort Ulta Earbuds gen 2 with deal tag ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HQq4CG6iFVzjJEmGroidWX-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The AirPods Pro 3 are great, but if you're looking for something that blocks even more noise and does it with a secure, and perhaps more comfortable fit, then the QuietComfort Ultra Earbuds gen 2 from Bose are a great option. One problem — they're usually about $50 more expensive than Apple's flagship earbuds.</p><p>But that's not the case right now! You can pick up the <a href="https://www.amazon.com/dp/B0FDKS5NN7/" target="_blank" rel="nofollow">QuietComfort Ultra Earbuds gen 2 for $249 at Amazon</a>. That's $50 off and the lowest price ever, and makes them the same price as the AirPods Pro 3. If given the choice between the two, I know where I'd be dropping my $249.</p><div class="product"><a data-dimension112="44c5d5f6-8bff-4dad-a76c-ecba534fb17b" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly. This is the bud's lowest price yet." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly. This is the bud's lowest price yet." data-dimension25="$249" href="https://www.amazon.com/dp/B0FDKS5NN7/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:934px;"><p class="vanilla-image-block" style="padding-top:124.20%;"><img id="a9jV9Xm3AhpGwNWnqABVVP" name="Bose QuietComfort Ultra Earbuds gen 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/a9jV9Xm3AhpGwNWnqABVVP.png" mos="" align="middle" fullscreen="" width="934" height="1160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly. This is the bud's lowest price yet.<a class="view-deal button" href="https://www.amazon.com/dp/B0FDKS5NN7/" target="_blank" rel="nofollow" data-dimension112="44c5d5f6-8bff-4dad-a76c-ecba534fb17b" data-action="Deal Block" data-label="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly. This is the bud's lowest price yet." data-dimension48="The Bose QuietComfort Ultra Earbuds gen 2 bring some big improvements to the table. They fit even better than the outgoing model, contain even better ANC, and there are increased sound modes for even more immersive listening. Six hours of battery might not be earth-shattering, but you can now charge the case wirelessly. This is the bud's lowest price yet." data-dimension25="$249">View Deal</a></p></div><ul><li><strong>Earbuds deals: </strong><a href="https://www.bestbuy.com/site/promo/headphone-and-speaker-deals" target="_blank" rel="nofollow"><strong>Best Buy</strong></a><strong> | </strong><a href="https://www.walmart.com/browse/electronics/shop-headphones-by-type/3944_133251_1095191_1230614?sort=best_match&cat_id=3944_133251_1095191_1230614_1230476&stores=3081&ps=40" target="_blank" rel="nofollow"><strong>Walmart</strong></a><strong> | </strong><a href="https://www.amazon.com/s?k=earbuds&crid=2RWE1G9N1EIF&sprefix=earbuds%2Caps%2C161&ref=nb_sb_noss_1" target="_blank" rel="nofollow"><strong>Amazon</strong></a><strong> | </strong><a href="https://www.samsung.com/us/mobile/audio/all-audio/" target="_blank" rel="nofollow"><strong>Samsung</strong></a><strong> | </strong><a href="https://www.dell.com/en-us/search/earbuds" target="_blank" rel="nofollow"><strong>Dell</strong></a></li></ul><p>The <a href="https://www.tomsguide.com/audio/earbuds/bose-quietcomfort-ultra-earbuds-2-review">QuietComfort Ultra Earbuds gen 2</a> are my earbuds of choice when I want something to block out as much noise as possible. They live in my pocket whenever I leave the house, standing ready to guard my ears from the sounds of bus trips and noisy train carriages. </p><p>Even though my <a href="https://www.tomsguide.com/audio/airpods/apple-airpods-pro-3-review">AirPods Pro 3</a> connect effortlessly with my iPhone and bring a whole bunch of features to the table, there are a couple of key ways that the QuietComfort Ultra Earbuds beat them out.</p><p>The first is the ANC performance. The AirPods Pro 3 are very good, but the Bose buds are <em>better</em> — they're our pick of the <a href="https://www.tomsguide.com/us/best-noise-cancelling-headphones,review-5566.html">best noise-canceling earbuds</a> for a reason. They don't struggle so much with higher range sounds, so you won't hear voices and other chatter. Both are good for bus engines and other low-range rumbles, of course.</p><p>Secondly, I'm a big fan of the way that the QuietComfort Ultra Earbuds fit. The AirPods line has always been one that my larger ears have struggled with, but the extra fitting wings in the Bose box make sure they stay in without any problems at all. </p><p>While I'll concede that the sound and battery life of the AirPods are better, it's not enough to make me drop my QuietComfort Ultra Earbuds recommendation. When the prices are this neck and neck, I know which buds I'd choose every single time — the QC Ultra Earbuds gen 2.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Hurry! Don't miss $100 off these Bose QuietComfort noise canceling headphones — they've never been cheaper ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/over-ear-headphones/hurry-dont-miss-usd100-off-these-bose-quietcomfort-noise-canceling-headphones-theyve-never-been-cheaper</link>
                                                                            <description>
                            <![CDATA[ The Bose QuietComfort Ultra Headphones are a fantastic pair of wireless headphones, made even better by this monster deal at Amazon. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">y7rcaEFuC7fYL6CdhvnkUj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/az8RbNV4TNTh5V7FNnCmF6-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 07 Nov 2025 10:04:27 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Over-Ear Headphones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Headphones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/az8RbNV4TNTh5V7FNnCmF6-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bose QuietComfort Ultra headphones]]></media:description>                                                            <media:text><![CDATA[Bose QuietComfort Ultra headphones]]></media:text>
                                <media:title type="plain"><![CDATA[Bose QuietComfort Ultra headphones]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/az8RbNV4TNTh5V7FNnCmF6-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Bose is the name to beat when it comes to noise canceling, and there have been few headphones as synonymous with ANC as the Bose QuietComfort Ultra Headphones. They've been dethroned by their sequel now, but they're still a silencing force to be reckoned with.</p><p>A force that you can now get at a great price, thanks to a $100 discount. The <a href="https://www.amazon.com/dp/B0CCZ1L489/" target="_blank" rel="nofollow">Bose QuietComfort Ultra Headphones are now just $329 at Amazon</a>, marking a return to their lowest price ever. This deal won't be around forever — better be quick!</p><div class="product"><a data-dimension112="caad6f78-83c9-48c2-ba1c-f9967c1d24cf" data-action="Deal Block" data-label="The QuietComfort Ultra Headphones are a great way to block noise. They're very comfortable to boot, and offer some solid sound. 24 hours of battery life isn't epic, but this $100 off certainly is. We've seen this deal before, and it didn't last very long — it might be a similar story this time around." data-dimension48="The QuietComfort Ultra Headphones are a great way to block noise. They're very comfortable to boot, and offer some solid sound. 24 hours of battery life isn't epic, but this $100 off certainly is. We've seen this deal before, and it didn't last very long — it might be a similar story this time around." data-dimension25="$329" href="https://www.amazon.com/dp/B0CCZ1L489/" 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:120.00%;"><img id="g64SDV3bmD2tcgopiiNgP6" name="Bose QuietComfort Ultra headphones Versus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g64SDV3bmD2tcgopiiNgP6.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The QuietComfort Ultra Headphones are a great way to block noise. They're very comfortable to boot, and offer some solid sound. 24 hours of battery life isn't epic, but this $100 off certainly is. We've seen this deal before, and it didn't last very long — it might be a similar story this time around.<a class="view-deal button" href="https://www.amazon.com/dp/B0CCZ1L489/" target="_blank" rel="nofollow" data-dimension112="caad6f78-83c9-48c2-ba1c-f9967c1d24cf" data-action="Deal Block" data-label="The QuietComfort Ultra Headphones are a great way to block noise. They're very comfortable to boot, and offer some solid sound. 24 hours of battery life isn't epic, but this $100 off certainly is. We've seen this deal before, and it didn't last very long — it might be a similar story this time around." data-dimension48="The QuietComfort Ultra Headphones are a great way to block noise. They're very comfortable to boot, and offer some solid sound. 24 hours of battery life isn't epic, but this $100 off certainly is. We've seen this deal before, and it didn't last very long — it might be a similar story this time around." data-dimension25="$329">View Deal</a></p></div><p>The <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-ultra-headphones">Bose QuietComfort Ultra Headphones</a> had a permanent place in my backpack for a long time thanks to their epic ANC. They block out just about every bit of noise, keeping the sounds of engines, tire rumbles, and other annoying commute noises at bay. They were our pick for the <a href="https://www.tomsguide.com/us/best-noise-cancelling-headphones,review-5566.html">best noise-canceling headphones</a> for a long time before the new model was released.</p><p>Their lightness and soft, plentiful foam make them super comfortable, so you won't have any complaints if you wear them for longer trips. They might need a charge to get through lengthier journeys — there's only 24 hours of battery life on board — but there's a quick charge to keep you going.</p><p>They sound good too, with plenty of bass to keep you moving along to your favorite tunes. You can change the sound profile with the helpful three-band EQ. A little more detail would be nice, but they're still a wicked audio experience.</p><p>The protective case is also one of the best, making sure that your expensive headphones won't get damaged when you toss them in your bag. It doesn't take up much space either. They're a great travel companion — and at this price, more affordable than ever.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I test earbuds for a living — and these are my favorites that aren't made by Apple ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/earbuds/i-test-headphones-for-a-living-and-these-are-the-best-wireless-earbuds-not-from-apple</link>
                                                                            <description>
                            <![CDATA[ There are loads of earbuds out there that are "better" than AirPods — and these are the ones I recommend instead. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">a5T72ZyJsfTGTs4pdRPXBd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/zQMX7tZFu5FVsZ6AP237qd-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 06 Nov 2025 10:30:00 +0000</pubDate>                                                                                                                                <updated>Fri, 07 Nov 2025 17:50:24 +0000</updated>
                                                                                                                                            <category><![CDATA[Earbuds]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Headphones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tammy Rogers ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/n8MswK9ZvXC9mSb5incU44.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Tammy and her generous collection of headphones have found a new home — Tom&#039;s Guide! After a two-and-a-half-year stint as iMore&#039;s resident audiophile, Tammy&#039;s reviews and buying guide expertise have more focus than ever on Tom&#039;s Guide, helping buyers find the audio gear that works best for them. Tammy has worked with some of the most desirable audio brands on the planet in her time writing about headphones, speakers, and more, bringing a consumer focussed approach to critique and buying advice. Away from her desk, you&#039;ll probably find her in the countryside writing (extremely bad) poetry, or putting her screenwriting Masters to good use creating screenplays that&#039;ll never see the light of day.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/zQMX7tZFu5FVsZ6AP237qd-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[the nothing cmf buds pro 2 cmf by nothing buds pro 2 in bright orange shown in the smart dial charging case against a blue tom&#039;s guide background]]></media:description>                                                            <media:text><![CDATA[the nothing cmf buds pro 2 cmf by nothing buds pro 2 in bright orange shown in the smart dial charging case against a blue tom&#039;s guide background]]></media:text>
                                <media:title type="plain"><![CDATA[the nothing cmf buds pro 2 cmf by nothing buds pro 2 in bright orange shown in the smart dial charging case against a blue tom&#039;s guide background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/zQMX7tZFu5FVsZ6AP237qd-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>AirPods are great. They have that magical connection to Apple devices, great build quality, and (quite unlike Apple) relatively affordable price points. Not looking at you, <a href="https://www.tomsguide.com/audio/ive-road-tested-the-airpods-max-with-usb-c-the-good-the-bad-and-the-ugly">AirPods Max</a>. </p><p>But what if you're looking for some of the <a href="https://www.tomsguide.com/us/best-wireless-earbuds,review-6160.html">best earbuds</a> to pair with your shiny new iPhone that don't come in white plastic, or what if you've got an Android phone and don't want something from the Apple ecosystem?</p><p>Well, you're in luck — as much as I love AirPods, I've tried out enough other earbuds to tell you that there is great sound, comfort and build beyond something designed in Cupertino. So let me talk you through the best earbuds around that <em>aren't </em>made by Apple.</p><h3 class="article-body__section" id="section-on-a-budget-cmf-buds-pro-2"><span>On a budget: CMF Buds Pro 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="F575HCpFpJ5dcUqEottGAA" name="CMF Buds Pro 2" alt="CMF Buds Pro 2" src="https://cdn.mos.cms.futurecdn.net/F575HCpFpJ5dcUqEottGAA.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This pair of buds is currently on the Tom's Guide's reviews team test bench, but things are going very well indeed for the inexpensive orange wonders. They're very comfortable and pack in some excellent ANC and good sound. All for much less than just about any pair of AirPods you can buy today — even the <a href="https://www.tomsguide.com/audio/earbuds/apple-airpods-4-review">AirPods 4</a>. </p><p>The 5 hours of battery life you'll get out of Apple's buds is handily beaten here as well, with 11 hours of ANC off time. They're IP55 for fitness fanatics, and even feature dual drivers for the audiophile on a budget.</p><p>And they're <em>orange. </em>Or blue, or black, or white. But why wouldn't you go for that wonderful sunshine hue? It's a lot more interesting than white.</p><div class="product"><a data-dimension112="18babfd3-2637-4cea-9ada-20ecf592df4c" data-action="Deal Block" data-label="43 hours of battery life, an orange colorway, excellent sound and ANC, all for less than $70. Is there anything else I really have to say? Oh yeah — how about 43 hours of battery life? That should seal the deal." data-dimension48="43 hours of battery life, an orange colorway, excellent sound and ANC, all for less than $70. Is there anything else I really have to say? Oh yeah — how about 43 hours of battery life? That should seal the deal." data-dimension25="$59" href="https://www.amazon.com/CMF-Buds-Pro-Cancelling-Technology/dp/B0D81S532L" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:980px;"><p class="vanilla-image-block" style="padding-top:122.04%;"><img id="QwHKM9e9PMPsyM5A57896c" name="CMF Buds Pro 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QwHKM9e9PMPsyM5A57896c.png" mos="" align="middle" fullscreen="" width="980" height="1196" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>43 hours of battery life, an orange colorway, excellent sound and ANC, all for less than $70. Is there anything else I really have to say? Oh yeah — how about 43 hours of battery life? That should seal the deal.<a class="view-deal button" href="https://www.amazon.com/CMF-Buds-Pro-Cancelling-Technology/dp/B0D81S532L" target="_blank" rel="nofollow" data-dimension112="18babfd3-2637-4cea-9ada-20ecf592df4c" data-action="Deal Block" data-label="43 hours of battery life, an orange colorway, excellent sound and ANC, all for less than $70. Is there anything else I really have to say? Oh yeah — how about 43 hours of battery life? That should seal the deal." data-dimension48="43 hours of battery life, an orange colorway, excellent sound and ANC, all for less than $70. Is there anything else I really have to say? Oh yeah — how about 43 hours of battery life? That should seal the deal." data-dimension25="$59">View Deal</a></p></div><h3 class="article-body__section" id="section-a-step-up-cambridge-audio-melomania-a100"><span>A step up: Cambridge Audio Melomania A100</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mMUTi47bjKQ9AKYTrLcpmg" name="Cambridge Audio Melomania A100" alt="Cambridge Audio Melomania A100" src="https://cdn.mos.cms.futurecdn.net/mMUTi47bjKQ9AKYTrLcpmg.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p><a href="https://www.tomsguide.com/audio/earbuds/cambridge-melomania-a100-review">Cambridge Audio's Melomania A100</a> are some of my favorite buds of 2025. They're very comfortable thanks to loads of different fitting options and are lightweight. The case is nice and small so that it more easily fits into your pocket, or a section in your backpack. Add that all to the 39-hour battery life and you've a pair of buds that takes the AirPods 4 ANC to school.</p><p>The best bit, though, is the sound and the customization options in Cambridge Audio's app. There's buckets of detail on offer, so you can really dive deep into the music you're listening to. The bass is deep and well-formed, and the mids are wide. They're great-sounding buds, made even better with the addition of the EQ options. Not a fan of the sound? Dial it in yourself with the EQ.</p><p>I'd say they match up better with the <a href="https://www.tomsguide.com/audio/airpods/apple-airpods-pro-3-review">AirPods Pro 3</a> — only they cost $100 less.</p><div class="product"><a data-dimension112="0ca8f2dd-5f58-4c8b-a4a4-2369460825ff" data-action="Deal Block" data-label="These little buds beat out the similarly price AirPods 4 ANC with better sound, a more comfortable and sealing fit, and way more battery life. They're also $30 less than the ANC-equipped AirPods — the perfect buds if you don't want to spend loads of money to get the AirPods' form factor with better sound and features." data-dimension48="These little buds beat out the similarly price AirPods 4 ANC with better sound, a more comfortable and sealing fit, and way more battery life. They're also $30 less than the ANC-equipped AirPods — the perfect buds if you don't want to spend loads of money to get the AirPods' form factor with better sound and features." data-dimension25="$149" href="https://www.amazon.com/dp/B0F9PFM5PV/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:690px;"><p class="vanilla-image-block" style="padding-top:100.87%;"><img id="PzQAuEbg5ULYUYbVR3vHjC" name="melomania A100.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PzQAuEbg5ULYUYbVR3vHjC.jpg" mos="" align="middle" fullscreen="" width="690" height="696" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These little buds beat out the similarly price AirPods 4 ANC with better sound, a more comfortable and sealing fit, and way more battery life. They're also $30 less than the ANC-equipped AirPods — the perfect buds if you don't want to spend loads of money to get the AirPods' form factor with better sound and features.<a class="view-deal button" href="https://www.amazon.com/dp/B0F9PFM5PV/" target="_blank" rel="nofollow" data-dimension112="0ca8f2dd-5f58-4c8b-a4a4-2369460825ff" data-action="Deal Block" data-label="These little buds beat out the similarly price AirPods 4 ANC with better sound, a more comfortable and sealing fit, and way more battery life. They're also $30 less than the ANC-equipped AirPods — the perfect buds if you don't want to spend loads of money to get the AirPods' form factor with better sound and features." data-dimension48="These little buds beat out the similarly price AirPods 4 ANC with better sound, a more comfortable and sealing fit, and way more battery life. They're also $30 less than the ANC-equipped AirPods — the perfect buds if you don't want to spend loads of money to get the AirPods' form factor with better sound and features." data-dimension25="$149">View Deal</a></p></div><h3 class="article-body__section" id="section-the-flagship-sony-wf-1000xm5"><span>The flagship: Sony WF-1000XM5</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JdmuRT4udYZzWmQcgNRgTJ" name="TG_Sony-WF-1000XM5-hands-on_1.jpg" alt="Sony WF-1000XM5" src="https://cdn.mos.cms.futurecdn.net/JdmuRT4udYZzWmQcgNRgTJ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/reviews/sony-wf-1000xm5">WF-1000XM5</a> are a well-known pair of earbuds that secured Sony's spot at the top of everyone's list by offering comfortable, great-sounding buds that block out loads of noise with great ANC. There's little more you could want, to be honest — apart from like, a free million dollars in the box.</p><p>They're a worthy competitor to the <a href="https://www.tomsguide.com/audio/airpods/apple-airpods-pro-3-review">AirPods Pro 3</a>, that's for sure. Een iPhone users will want to check them out thanks to more extensive EQ options and better sound. </p><p>They might not have the magic Apple connection, but they do pretty much everything else better.</p><div class="product"><a data-dimension112="9d3f3080-48d0-4315-9c2f-936511e696e7" data-action="Deal Block" data-label="They're the one to beat — Sony's buds are still some of the best wireless earbuds you can buy today. They're comfortable, sound great, and offer 8 hours of battery per bud for some great longevity. They also feature amazing ANC — Apple, eat your heart out." data-dimension48="They're the one to beat — Sony's buds are still some of the best wireless earbuds you can buy today. They're comfortable, sound great, and offer 8 hours of battery per bud for some great longevity. They also feature amazing ANC — Apple, eat your heart out." data-dimension25="$228" href="https://www.amazon.com/dp/B0C33XXS56/" 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:120.00%;"><img id="6oSE83nxZPUtfim4Zye29J" name="Sony WF-1000XM5 BG image.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6oSE83nxZPUtfim4Zye29J.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>They're the one to beat — Sony's buds are still some of the best wireless earbuds you can buy today. They're comfortable, sound great, and offer 8 hours of battery per bud for some great longevity. They also feature amazing ANC — Apple, eat your heart out.<a class="view-deal button" href="https://www.amazon.com/dp/B0C33XXS56/" target="_blank" rel="nofollow" data-dimension112="9d3f3080-48d0-4315-9c2f-936511e696e7" data-action="Deal Block" data-label="They're the one to beat — Sony's buds are still some of the best wireless earbuds you can buy today. They're comfortable, sound great, and offer 8 hours of battery per bud for some great longevity. They also feature amazing ANC — Apple, eat your heart out." data-dimension48="They're the one to beat — Sony's buds are still some of the best wireless earbuds you can buy today. They're comfortable, sound great, and offer 8 hours of battery per bud for some great longevity. They also feature amazing ANC — Apple, eat your heart out." data-dimension25="$228">View Deal</a></p></div><h3 class="article-body__section" id="section-money-no-object-noble-fokus-rex5"><span>Money no object: Noble Fokus Rex5</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Ewm3xLCFzZw7entT3LuVY4" name="Noble Fokus Rex5-06" alt="Noble Fokus Rex5" src="https://cdn.mos.cms.futurecdn.net/Ewm3xLCFzZw7entT3LuVY4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you've got around $500 burning a hole in your pocket and you want some shiny new earbuds to slot into your earholes, I've got just the thing. These are the <a href="https://www.tomsguide.com/audio/noble-fokus-rex5-review">Noble Fokus Rex5</a>, and they are currently my favorite pair of wireless earbuds — bar none. And yes, before you ask, they're worth every penny of that high asking price. </p><p>They're comfortable thanks to perfectly shaped buds made of resin. They're premium, thanks to a range of lovely materials that go into their construction. They've got battery life aplenty, with 50 hours of juice in the case. They're <em>green. </em></p><p>But, best of all, they sound mind-blowing. There's little that comes close to the sonic characteristics of the Rex5 before you start looking at wired options. They're crystal clear, but not fatiguing. Vocals are perfectly formed, and the sub-bass goes all the way down. They're a sight for sore ears, that's for sure.</p><div class="product"><a data-dimension112="9a277cbf-1c11-4808-9268-aa680a9cf393" data-action="Deal Block" data-label="They're expensive, but they're worth it. They're super premium feeling with a lovely metal case and gold accents everywhere. They're very comfortable, and sound better than just about anything else that costs the same or more. The ANC isn't quite up there with the alternatives, but it's plenty to keep the sound of the outside world out when you need to." data-dimension48="They're expensive, but they're worth it. They're super premium feeling with a lovely metal case and gold accents everywhere. They're very comfortable, and sound better than just about anything else that costs the same or more. The ANC isn't quite up there with the alternatives, but it's plenty to keep the sound of the outside world out when you need to." data-dimension25="$449" href="https://www.amazon.com/dp/B0FL153D56/" 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:120.00%;"><img id="g3hq2b3ePrPxNHWnqbQ4Lf" name="Noble Fokus rex5" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g3hq2b3ePrPxNHWnqbQ4Lf.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>They're expensive, but they're worth it. They're super premium feeling with a lovely metal case and gold accents everywhere. They're very comfortable, and sound better than just about anything else that costs the same or more. The ANC isn't quite up there with the alternatives, but it's plenty to keep the sound of the outside world out when you need to.<a class="view-deal button" href="https://www.amazon.com/dp/B0FL153D56/" target="_blank" rel="nofollow" data-dimension112="9a277cbf-1c11-4808-9268-aa680a9cf393" data-action="Deal Block" data-label="They're expensive, but they're worth it. They're super premium feeling with a lovely metal case and gold accents everywhere. They're very comfortable, and sound better than just about anything else that costs the same or more. The ANC isn't quite up there with the alternatives, but it's plenty to keep the sound of the outside world out when you need to." data-dimension48="They're expensive, but they're worth it. They're super premium feeling with a lovely metal case and gold accents everywhere. They're very comfortable, and sound better than just about anything else that costs the same or more. The ANC isn't quite up there with the alternatives, but it's plenty to keep the sound of the outside world out when you need to." data-dimension25="$449">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>