<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="https://purl.org/dc/elements/1.1/"
     xmlns:dcterms="http://purl.org/dc/terms/"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:cf="https://www.futureplc.com/rss/content-flags"
>
    <channel>
                    <atom:link href="https://www.tomsguide.com/feeds/tag/gardening" rel="self" type="application/rss+xml" />
                            <title><![CDATA[ Latest from Tom's Guide in Gardening ]]></title>
                <link>https://www.tomsguide.com/home/outdoors/gardening</link>
        <description><![CDATA[ All the latest gardening content from the Tom's Guide team ]]></description>
                                    <lastBuildDate>Mon, 20 Jul 2026 11:04:26 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ Skunks in your yard? Banish them with this unusual item — and it's not coffee grounds ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/skunks-in-your-yard-banish-them-with-this-unusual-item-and-its-not-coffee-grounds</link>
                                                                            <description>
                            <![CDATA[ Ditch the coffee grounds — this is the secret scent that instantly repels skunks in your yard. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">W2vqsYCgLYCSRnudrj8MU6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/smLBLRAVnDaAn8zZWPgFNi-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 20 Jul 2026 11:04:26 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/smLBLRAVnDaAn8zZWPgFNi-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Skunk by overturned garbage can]]></media:description>                                                            <media:text><![CDATA[Skunk by overturned garbage can]]></media:text>
                                <media:title type="plain"><![CDATA[Skunk by overturned garbage can]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/smLBLRAVnDaAn8zZWPgFNi-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When it comes to common pests in our backyard, skunks are probably the worst kind. Not only can they destroy your plants and lawn by digging for food sources such as grubs, but they can unleash a pungent, sulfuric odor that lingers throughout your entire property.</p><p>To make matters worse, while these striped critters may look harmless, they can carry diseases such as rabies and salmonella. They can also spread canine distemper, a condition that can be deadly for dogs. </p><p>That’s why it’s so important to know <a href="https://www.tomsguide.com/how-to/how-to-get-rid-of-a-skunk">how to get rid of skunks </a>and keep them away for good. Since they are primarily nocturnal, they can be harder to spot while feeding at night. </p><p>What’s more, even though humans find their stench unbearable, these pests are actually repelled by a specific, surprising scent — and it’s not coffee grounds. </p><p>So if you want to banish skunks immediately, use this trick to drive them away from your property today.</p><h3 class="article-body__section" id="section-how-to-use-kitty-litter-to-repel-skunks"><span>How to use kitty litter to repel skunks </span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5243px;"><p class="vanilla-image-block" style="padding-top:54.55%;"><img id="vYCRXit55Rm3Z7tHvMQkiH" name="shutterstock_1782013634ex.jpg" alt="Grey kitten standing in purple litter tray" src="https://cdn.mos.cms.futurecdn.net/vYCRXit55Rm3Z7tHvMQkiH.jpg" mos="" align="middle" fullscreen="" width="5243" height="2860" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Grey kitten standing in purple litter tray </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>For cat parents out there, your pet’s bathroom habits could actually be a game-changer. It turns out that <strong>skunks hate the pungent smell of used kitty litter</strong>, thanks to the strong ammonia found in cat urine.</p><p>To use kitty litter effectively, place the tray or container at the entry points where skunks are getting through. If in doubt, thoroughly inspect your yard, in particular any tucked-away spots like the areas beneath porches, sheds, or garden corners. </p><p>Alternatively, if you’d rather not have kitty litter scattered across your yard, simply place it inside a perforated plastic bag. This keeps things tidy while still allowing those repulsive ammonia fumes to escape and deter the skunks.</p><p>Bear in mind that this repulsive scent will eventually fade. So to maintain its effectiveness, you’ll need to regularly swap out the old litter for a fresh supply when possible. Plus, it’s a great way to repurpose and put your kitty litter to good use — a win-win!</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X7AEQW"></div>                            </div>                            <script src="https://kwizly.com/embed/X7AEQW.js" async></script><h3 class="article-body__section" id="section-top-tips-to-get-rid-of-skunks"><span>Top tips to get rid of skunks</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3741px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="zxkrwT7gxEgzyZJ9Kxa84j" name="shutterstock_183075305 (1).jpg" alt="Overflowing garbage" src="https://cdn.mos.cms.futurecdn.net/zxkrwT7gxEgzyZJ9Kxa84j.jpg" mos="" align="middle" fullscreen="" width="3741" height="2104" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Overflowing garbage </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Of course, you don’t have to invest in a cat just to repel skunks from your yard. There are other, practical things you can do to make your yard less inviting for such pests. </p><p>First of all, secure your garbage/trash cans and don't let them overflow. Since <strong>skunks are attracted to areas where they can find food sources</strong>, you’ll often find them turning over trash cans and generally making a mess. The same goes for other food sources you might leave out for birds or other pets, and remove stagnant water that serves as another major skunk magnet.  </p><p>Another top tip is to block any visible entry points, as such pests are notorious for digging dens beneath sheds, porches, foundations, and even under AC unit pads. Experts suggest sealing these crevices using metal flashing or sturdy hardware cloth. Just ensure every connection is tight and flush to keep them out for good.</p><p>Alternatively, if you’re dealing with a persistent skunk issue, it’s always best to call in the professionals and <strong>NEVER </strong>try to handle a skunk yourself. </p><p>For more top tips, check out <a href="https://www.tomsguide.com/home/gardening/skunk-in-your-backyard-experts-share-the-signs-to-look-out-for">how to spot the signs of a skunk</a> and keep them away from your property. </p><h3 class="article-body__section" id="section-lawncare-essentials-we-love"><span>Lawncare essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="191093ca-8424-11f1-8678-89777767aef3">            <a href="https://www.amazon.com/Scotts-17508/dp/B0168K936W/ref=sr_1_1_sspa?" data-model-name="Scotts Ez Seed Patch & Repair for Sun and Shade" 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/ZRWks9aKfGEVKLwPaLqmhh.jpg" alt="Scotts Ez Seed Patch & Repair for Sun and Shade - Combination Mulch, Sun and Shade Grass Seed & Fertilizer for Bare Spots & Lawn Patch Repair, Covers Up to 85 Sq. Ft., 3.75 Lb."></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Scotts Ez Seed Patch & Repair for Sun and Shade</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="1910942e-8424-11f1-aa62-5d046bf826ab">            <a href="https://www.amazon.com/Garden-Guru-Handheld-Spreader-Shaker/dp/B0F8P8QM3V/ref=sr_1_8?" data-model-name="Garden Guru Handheld Seed Spreader Shaker" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:82.80%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/ezrwVY6BYsgBZtBcNhMTm9.jpg" alt="Garden Guru Handheld Seed Spreader Shaker – Multi Use Grass Seed, Fertilizer, Salt, Ice & Snow Melt Spreader – Adjustable Twist Cap W Multiple Size Openings – Lightweight 1l Capacity Hand Seeder"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Garden Guru Handheld Seed Spreader Shaker</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="19109492-8424-11f1-8f9a-4f9cd609d300">            <a href="https://www.amazon.com/Fiskars-339950-1002-Puller-Gardening-Removal/dp/B0030MIHAU?" data-model-name="Fiskars Stand-Up Weed Puller Tool" 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/68PWsuXsMu9y5iotDQ8BaZ.jpg" alt="Fiskars Stand-Up Weed Puller Tool, 4 Serrated Stainless Steel Claws Grip Roots for Permanent Removal, Reinforced Foot Platform Penetrates Tough Soil, Easy-Eject & Ergonomic Offset Handle, 39""></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Fiskars Stand-Up Weed Puller Tool</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="191094ec-8424-11f1-bac5-195bd7e00bd2">            <a href="https://www.amazon.com/Greenworks-G-MAX-Mower-Batteries-Charger/dp/B086K59Q79/ref=sr_1_3?" data-model-name="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower" 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/8LF2UvRs8EXvmebaZefwzA.jpg" alt="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower (200+ Compatible Tools), (2) 4.0ah Batteries and Dual Port Rapid Charger Included"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/how-to/7-ways-to-get-rid-of-goundhogs-without-hurting-them">7 ways to get rid of groundhogs without hurting them</a></li><li><a href="https://www.tomsguide.com/home/3-common-backyard-bugs-that-are-actually-helping-not-hurting-your-plants">3 common backyard bugs that are actually helping — not hurting — your plants</a></li><li><a href="https://www.tomsguide.com/home/natural-ways-to-get-rid-of-aphids">7 natural aphid deterrents to prevent infestation in your yard</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The 3 kitchen scraps I never throw away if I want sweet, ripe tomatoes ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/the-3-kitchen-scraps-i-never-throw-away-if-i-want-sweet-ripe-tomatoes</link>
                                                                            <description>
                            <![CDATA[ Boost your tomato harvest for free using eggshells, banana peels, and coffee grounds to prevent rot, accelerate ripening, and fuel healthier plant growth. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">KVMJ3tjmxujW8VW2DwGdQ3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/35xUxxG3VM9b8kqFBBpiyL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 20 Jul 2026 09:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alice Carroll ]]></dc:creator>                                                                                                        <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/35xUxxG3VM9b8kqFBBpiyL-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tony Tim cherry tomatoes]]></media:description>                                                            <media:text><![CDATA[Tony Tim cherry tomatoes]]></media:text>
                                <media:title type="plain"><![CDATA[Tony Tim cherry tomatoes]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/35xUxxG3VM9b8kqFBBpiyL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you’ve ever watched your tomato plants struggle to transition from green, stubborn globes to juicy, vibrant red fruits, you aren’t alone. Getting tomatoes to perfectly ripen requires the right balance of nutrients, soil structure, and plant vitality. </p><p>Thankfully, you don't need store-bought supplements to give them a boost. The secret to a bumper crop of sweet, perfectly ripe tomatoes is sitting right in your kitchen garbage.</p><p>By strategically using crushed eggshells, banana peels, and coffee grounds, you can deliver a targeted nutrient cocktail that fuels fruit development and speeds up the ripening process. </p><section class="howto-block">                    <h3>1. Crushed eggshell </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="http://cdn.mos.cms.futurecdn.net/JoKvFNmBXp6v35qAJzzFoa.jpg"                                        alt="Powdered eggshells "                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="http://cdn.mos.cms.futurecdn.net/JoKvFNmBXp6v35qAJzzFoa.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Eggshells are packed with calcium carbonate, which helps build strong plant cell walls. While garden lore claims throwing eggshells in the soil is a quick fix for blossom-end rot (those black, leathery patches on the fruit), that is actually a myth. </p><p>Eggshells take months or years to decompose into a form roots can absorb, and blossom-end rot is usually caused by inconsistent watering rather than a lack of soil calcium. Even so, eggshells are a fantastic long-term investment that slowly enriches your garden bed for future crops.</p><p>To use them, <strong>wash your leftover eggshells, let them dry completely, and blitz them in a blender</strong> into a fine powder to help them break down faster. You can also use a pestle and mortar for this. </p><p><strong>Dig this powder directly into the soil at the base of your plants or sprinkle a handful into the planting hole</strong>. </p><p>Because tomatoes need water to move nutrients, make sure to pair this with a consistent watering schedule so the plant can successfully transport the soil's existing calcium up to the ripening fruit.</p></p>                </section><section class="howto-block">                    <h3>2. Banana peels </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/jxrKqywY687JgZjEqtyWX8.jpg"                                        alt="Home made tomato feed"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/jxrKqywY687JgZjEqtyWX8.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide / Camilla Sharman)</div></figure>                    <p><p>If you think of banana peels as the stuff of slapstick comedy, you may be surprised to learn that the humble peel is packed with nutrients — namely potassium, calcium, magnesium, and sulfur. </p><p>While calcium prevents rot, potassium is the true MVP of fruit production. It facilitates photosynthesis, regulates water uptake, strengthens stems, and directly drives the chemical processes that cause tomatoes to swell, sweeten, and ripen.</p><p>Banana peels shouldn’t completely replace regular fertilizer, but rather act as a powerful booster alongside it.</p><p><strong>Soak a few banana peels in a jar of water for 24 to 48 hours</strong>. Then<strong> remove the peels (throw them in the compost), and pour the nutrient-infused "tea" directly onto the soil around your plants</strong>.</p></p>                </section><section class="howto-block">                    <h3>3. Coffee grounds </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/iXAEyVAQiAww4GCd9ESBbY.jpg"                                        alt="Sprinkling coffee grounds on plants"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/iXAEyVAQiAww4GCd9ESBbY.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Leftover coffee grounds are an excellent source of nitrogen, which fuels the lush, green foliage tomato plants need to convert sunlight into sugars. These sugars are what ultimately pump into the green fruits to make them sweet and red. </p><p>Coffee grounds also improve soil texture, boost water retention, and attract beneficial earthworms that naturally aerate the root zone.</p><p>Never dump thick layers of wet grounds directly onto the soil. Instead,<strong> mix your used coffee grounds with a bit of dry mulch or compost and spread a thin layer around the base of your plants,</strong> gently working it into the surface. </p><p>Similarly to the banana 'tea', you can also can steep the grounds in a watering can overnight to create a mild, hydrating nitrogen liquid for your next watering session.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Ww1z5X"></div>                            </div>                            <script src="https://kwizly.com/embed/Ww1z5X.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/home/gardening/when-to-fertilize-your-tomatoes-and-how-to-get-a-bountiful-harvest">When to fertilize tomatoes: the 3-step schedule for a bountiful harvest</a></li><li><a href="https://www.tomsguide.com/home/gardening/why-are-my-tomato-plant-leaves-turning-yellow-5-steps-to-save-your-harvest">Why are my tomato plant leaves turning yellow? 5 steps to save your harvest</a></li><li><a href="https://www.tomsguide.com/home/outdoors/gardeners-swear-by-this-simple-trick-heres-how-to-save-split-tomatoes-fast">Gardeners swear by this simple tomato plant trick — here's how to save split tomatoes fast</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Ants taking over your raised beds? I asked the experts how to get rid of them quickly ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/ants-taking-over-your-raised-beds-i-asked-the-experts-how-to-get-rid-of-them-quickly</link>
                                                                            <description>
                            <![CDATA[ Help, my soil is infested  — I asked the experts how to get rid of ants in my raised beds! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">W5twsJZDYdHopShCK3Pocb</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/e7zrYByrTbLyrpFUwBkchH-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 19 Jul 2026 06:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/e7zrYByrTbLyrpFUwBkchH-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Ants on a cucumber flower]]></media:description>                                                            <media:text><![CDATA[Ants on a cucumber flower]]></media:text>
                                <media:title type="plain"><![CDATA[Ants on a cucumber flower]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/e7zrYByrTbLyrpFUwBkchH-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With the arrival of summer, seasonal pests are at their absolute peak — and ants are my number one problem.</p><p>And if it’s not trying to <a href="https://www.tomsguide.com/home/forget-white-vinegar-i-found-a-better-natural-way-to-banish-ants-in-my-yard-for-good#viafoura-comments">banish ants from my yard</a> or blocking them from my kitchen — now they've launched a full-scale invasion of my garden beds too.</p><p>We’ve been trying to grow a vegetable patch in my raised planter — where we’ve recently planted everything from fresh herbs and salad greens to melon seeds. But that took a frustrating turn when I discovered the soil had become a playground for ants, literally swarming on the soil and attacking some of the plants. </p><p>Since I didn’t want to contaminate my crops with chemicals, I called on the gardening experts to share some top tips on the most effective ways to save my raised beds from these tiny invaders.</p><h3 class="article-body__section" id="section-what-causes-ants-to-invade-raised-beds"><span>What causes ants to invade raised beds?</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:7688px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="HYk8RtWinSeSmgaHFMRVNo" name="shutterstock_2776117229" alt="Ants in soil" src="https://cdn.mos.cms.futurecdn.net/HYk8RtWinSeSmgaHFMRVNo.jpg" mos="" align="middle" fullscreen="" width="7688" height="4325" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Ants in soil </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><div><blockquote><p>One thing that always puzzled me was what attracted ants to my raised beds — especially when it’s literally off the ground. </p></blockquote></div><p>One thing that always puzzled me was what attracted ants to my raised beds — especially when it’s literally off the ground. </p><p>"Ants usually follow one of two things — food or real estate,” states Kyle Turner, President & CEO of <a href="https://www.beproactivepestcontrol.com/" target="_blank">Be Proactive Pest Control</a>. “Raised beds offer loose, well-drained soil that's perfect for tunneling, and if you have aphids on your vegetables, you've basically opened an all-you-can-eat buffet."</p><p>What’s more, scale insects or other sap-feeding pests produce a sweet, sticky substance called honeydew, which is enticing to ants who collect it as a tasty food source.</p><p>“The issue is when large colonies begin disturbing roots or protecting aphids from their natural predators.”</p><p>Another thing I learned is that during these sweltering temperatures, consistently dry soil provides the ideal environment for a colony to thrive, which perfectly explains the infestation I found. Plus, if you have rotting timber around older raised beds, this will also attract these tiny critters.</p><div><blockquote><p>Raised beds offer loose, well-drained soil that's perfect for tunneling</p><p>Kyle Turner, President & CEO of Be Proactive Pest Control</p></blockquote></div><p>Surprisingly, not all ants are a cause for concern and may actually be helpful in the yard. </p><p>“It is also worth remembering that a few ants in a raised bed are not always harmful,” adds Rick Young, Pest Control Professional and Owner of <a href="https://youngspestcontrol.co.uk/" target="_blank">Youngs Pest Control.</a></p><p>“Ants can aerate the soil and remove dead insects. Action is usually only needed when there is a large nest, plants are being disturbed, aphids are being protected, or ants are repeatedly entering the home from the planter.” </p><div class="product"><a data-dimension112="bce61ccc-8037-11f1-995c-efdcee6556e7" data-action="Deal Block" data-label="Widely sold at hardware stores and available online, food grade diatomaceous earth is an inexpensive insect killer with various pest control uses. Plus, it's natural, toxin-free, and does the trick!" data-dimension48="Widely sold at hardware stores and available online, food grade diatomaceous earth is an inexpensive insect killer with various pest control uses. Plus, it's natural, toxin-free, and does the trick!" data-dimension25="$9" href="https://www.amazon.com/Harris-Diatomaceous-Earth-Food-Grade/dp/B06X952WC5" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:550px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Su2hQMSuCegmd7gh4h2mRo" name="Diatomaceous earth spray bottle" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Su2hQMSuCegmd7gh4h2mRo.jpg" mos="" align="middle" fullscreen="" width="550" height="550" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Widely sold at hardware stores and available online, food grade diatomaceous earth is an inexpensive insect killer with various pest control uses. Plus, it's natural, toxin-free, and does the trick! <a class="view-deal button" href="https://www.amazon.com/Harris-Diatomaceous-Earth-Food-Grade/dp/B06X952WC5" target="_blank" rel="nofollow" data-dimension112="bce61ccc-8037-11f1-995c-efdcee6556e7" data-action="Deal Block" data-label="Widely sold at hardware stores and available online, food grade diatomaceous earth is an inexpensive insect killer with various pest control uses. Plus, it's natural, toxin-free, and does the trick!" data-dimension48="Widely sold at hardware stores and available online, food grade diatomaceous earth is an inexpensive insect killer with various pest control uses. Plus, it's natural, toxin-free, and does the trick!" data-dimension25="$9">View Deal</a></p></div><h3 class="article-body__section" id="section-how-to-get-rid-of-an-ant-infestation-without-harming-your-plants"><span>How to get rid of an ant infestation without harming your plants?</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5751px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BHEgE6rvmBd3kbsZjsx9oA" name="shutterstock_1777152578.jpg" alt="Watering raised vegetable bed" src="https://cdn.mos.cms.futurecdn.net/BHEgE6rvmBd3kbsZjsx9oA.jpg" mos="" align="middle" fullscreen="" width="5751" height="3235" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Watering raised vegetable bed </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>So, what’s the best way to remove an army of ants?<strong> </strong>"The best long-term fix is to eliminate the reason they're there,” suggests Turner. </p><p>“If aphids are present, knock them off plants with a strong spray of water or use insecticidal soap. Once the honeydew disappears, the ants often lose interest. For nests in the bed, repeatedly soaking the colony with water can encourage them to relocate without affecting your vegetables."</p><p>In addition, always inspect your plants and ensure they are in good shape. "Keep plants healthy, inspect the undersides of leaves regularly for aphids, harvest ripe produce promptly, and avoid letting weeds establish around the beds since they can host both aphids and ants," Turner adds.</p><p>Another top tip is to ensure you regularly give your raised bed a deep watering. Since ants prefer dry, well-drained nesting sites, watering can encourage them to move along. </p><p>Just be sure not to overwater, as you want to avoid the risk of waterlogging or ruining your plant roots. </p><h3 class="article-body__section" id="section-what-natural-ant-repellents-can-i-use"><span>What natural ant repellents can I use?</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yK69oXS6Agi3mGZpL9vqgF" name="ants and citrus" alt="ants and citrus" src="https://cdn.mos.cms.futurecdn.net/yK69oXS6Agi3mGZpL9vqgF.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">ants and citrus </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>I’m a big advocate for using non-toxic pest solutions around the house, and it turns out that beyond D.E (food-grade), everyday kitchen staples can be just as effective at keeping ants at bay.</p><p>“Cinnamon applied around the bed perimeter works as a genuine deterrent, not just folklore,” advises Glen Chandler, Gardener & Founder of <a href="http://evergreenseeds.com">Evergreenseeds.com.</a> “Ants avoid crossing it, and it breaks down harmlessly into the soil. Reapply after rain. </p><p>“Diluted peppermint oil (about 10 drops per litre of water) sprayed around the base of plants disrupts the scent trails ants use to navigate. It needs to be reapplied every few days, but it's completely safe around edibles.”</p><p>What’s more, I tried <a href="https://www.tomsguide.com/home/i-found-a-trail-of-ants-in-my-kitchen-and-this-50-cent-natural-remedy-stopped-them-in-their-tracks">citrus peel in my kitchen </a>when I had a few rogue ants, and I was impressed at how effective it was. Plus, it was a good way to repurpose my food waste. </p><p>“Citrus peel worked into the top layer of soil releases d-limonene as it breaks down, which ants strongly avoid,” agrees Chandler. “I tell gardeners to save their lemon and orange peels through the week and work them in around the bed edges.”</p><p>Armed with these expert-approved tips, I feel much better equipped to banish any ant colony from my raised beds and reclaim my garden this season. Watch this space. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xj3Gae"></div>                            </div>                            <script src="https://kwizly.com/embed/Xj3Gae.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/home/how-do-i-know-what-kind-of-ants-i-have-in-my-home-and-why-it-matters-i-ask-the-pest-experts">How do I know what kind of ants I have in my home and why it matters? I ask the pest experts</a></li><li><a href="https://www.tomsguide.com/home/pest-experts-warn-you-should-never-squash-ants-in-your-home-heres-why">Pest experts warn you should never squash ants in your home — here’s why</a></li><li><a href="https://www.tomsguide.com/home/5-steps-to-stop-carpenter-ants-before-they-infest-your-home">5 steps to stop carpenter ants before they infest your home</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This ‘gimmicky’ Shark cleaning tool has now become my go-to gardening essential — here’s why ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/this-gimmicky-shark-cleaning-tool-has-now-become-my-go-to-gardening-essential-heres-why</link>
                                                                            <description>
                            <![CDATA[ Ditch your leaf blower — the Shark BlastBoss is the only gardening tool I reach for now. Here’s how I use it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gNms8pFymUJQsbigsefCEj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/AooCsHwTVyzg3wHEyuspT7-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 18 Jul 2026 12:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/AooCsHwTVyzg3wHEyuspT7-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Shark BlastBoss on white garden stool]]></media:description>                                                            <media:text><![CDATA[Shark BlastBoss on white garden stool]]></media:text>
                                <media:title type="plain"><![CDATA[Shark BlastBoss on white garden stool]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/AooCsHwTVyzg3wHEyuspT7-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When it comes to house chores, vacuuming has got to be the one task that I often do (and find weirdly satisfying). </p><p>And since I review the <a href="https://www.tomsguide.com/best-picks/best-vacuum-cleaners">best vacuum cleaners</a> for a living, I’ve got the bonus of testing out the latest models on my hardwood, tiles, and carpet to see which one can ultimately get my floors spotless and dust-free in no time.</p><p>From bagged and upright to cordless and air-blasting handhelds, I’ve tested them all. But when the<a href="https://www.tomsguide.com/home/shark-launched-an-air-blaster-that-works-both-indoors-and-out-and-ill-be-first-in-line-to-try-it"> Shark BlastBoss</a> came my way, I found a new use for it altogether – and it wasn’t for cleaning. </p><p>Despite looking like a retro hair dryer, the BlastBoss is exactly that — it’s a powerful, air-blasting system that can be used to blast away cobwebs, dustballs, or loosen debris and leaves in seconds. </p><p>In fact, the adjustable-speed trigger can ramp up the airflow up to an eye-watering 190mph. What's more, it comes with attachments including a broom brush for scrubbing outdoor surfaces. </p><p>But while it serves as an impressive cleaning tool for shifting ingrained dirt, this has surprisingly become my gardening must-have. </p><p>Here’s how I’ve put my handheld BlastBoss to use outdoors.    </p><div class="product"><a data-dimension112="04eb4e1e-81f7-11f1-a42b-d354f384afac" data-action="Deal Block" data-label="The Shark BlastBoss is a compact, cordless, and easy-to-grab tool for cleaning up messes both inside and outside of your home. It comes with three interchangeable attachments, depending on the job you need it to do. And you can pick it up in Charcoal, Dove, Strawberry, Sky and Sage right now." data-dimension48="The Shark BlastBoss is a compact, cordless, and easy-to-grab tool for cleaning up messes both inside and outside of your home. It comes with three interchangeable attachments, depending on the job you need it to do. And you can pick it up in Charcoal, Dove, Strawberry, Sky and Sage right now." data-dimension25="$149" href="https://www.sharkninja.com/shark-blastboss-all-in-one-air-blasting-system-charcoal/AB2111.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1499px;"><p class="vanilla-image-block" style="padding-top:100.07%;"><img id="voWj3Xx6Liy8jQwtvX8sHo" name="Shark BlastBoss" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/voWj3Xx6Liy8jQwtvX8sHo.jpg" mos="" align="middle" fullscreen="" width="1499" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Shark BlastBoss is a compact, cordless, and easy-to-grab tool for cleaning up messes both inside and outside of your home. It comes with three interchangeable attachments, depending on the job you need it to do. And you can pick it up in Charcoal, Dove, Strawberry, Sky and Sage right now.<a class="view-deal button" href="https://www.sharkninja.com/shark-blastboss-all-in-one-air-blasting-system-charcoal/AB2111.html" target="_blank" rel="nofollow" data-dimension112="04eb4e1e-81f7-11f1-a42b-d354f384afac" data-action="Deal Block" data-label="The Shark BlastBoss is a compact, cordless, and easy-to-grab tool for cleaning up messes both inside and outside of your home. It comes with three interchangeable attachments, depending on the job you need it to do. And you can pick it up in Charcoal, Dove, Strawberry, Sky and Sage right now." data-dimension48="The Shark BlastBoss is a compact, cordless, and easy-to-grab tool for cleaning up messes both inside and outside of your home. It comes with three interchangeable attachments, depending on the job you need it to do. And you can pick it up in Charcoal, Dove, Strawberry, Sky and Sage right now." data-dimension25="$149">View Deal</a></p></div><h3 class="article-body__section" id="section-blowing-grass-clippings"><span>Blowing grass clippings</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3621px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="QF5eeNktW2wNYsPRWp2P8f" name="Shark BlassBoss blowing clippings" alt="Shark BlassBoss blowing clippings" src="https://cdn.mos.cms.futurecdn.net/QF5eeNktW2wNYsPRWp2P8f.jpg" mos="" align="middle" fullscreen="" width="3621" height="2037" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Shark BlassBoss blowing clippings </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If there is one outdoor task that I find particularly tedious, it’s raking the lawn after a fresh mow — especially the struggle of catching those stray clippings that always seem to end up on my paved patio.</p><p>I simply switched the setting to ‘Outdoor’ and was literally blown away by its sheer power. It effortlessly cleared the clippings in seconds, allowing me to gather everything into a single pile for a far more efficient clean-up.</p><p>Just bear in mind that you’ll need dry conditions for this to work effectively, as it won’t shift wet or soggy clippings. </p><p>Or if you really want to put your clippings to good use, check out<a href="https://www.tomsguide.com/home/outdoors/why-you-should-be-leaving-grass-clippings-on-your-lawn-after-mowing-youll-be-surprised"> why you should be leaving grass clippings on your lawn after mowing</a>.</p><h3 class="article-body__section" id="section-a-handy-leaf-blower"><span>A handy leaf blower</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3632px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LvrLvpuDaSkLDKhV9Z3wBU" name="Shark BlastBoss blowing leaves" alt="Shark BlastBoss blowing leaves" src="https://cdn.mos.cms.futurecdn.net/LvrLvpuDaSkLDKhV9Z3wBU.jpg" mos="" align="middle" fullscreen="" width="3632" height="2043" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Shark BlastBoss blowing leaves </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>At the back of my garden, the overgrown trees are often shedding foliage — resulting in a messy carpet of leaves scattered across the patio and lawn.</p><p>Rather than investing in a bulky, expensive leaf blower, I found the BlastBoss works as a surprisingly good alternative for clearing away my fallen leaves. </p><p>I was able to blast them into a tidy heap where it was easier for me to dispose of them in my compost bin. What's more, this task was quick and fuss-free, which is always a bonus. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W5lgne"></div>                            </div>                            <script src="https://kwizly.com/embed/W5lgne.js" async></script><h3 class="article-body__section" id="section-clearing-debris-weeds"><span>Clearing debris/ weeds</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3451px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="MWukzxbzUbPJFixSXLs5BL" name="Shark BlastBoss and garden debris" alt="Shark BlastBoss and garden debris" src="https://cdn.mos.cms.futurecdn.net/MWukzxbzUbPJFixSXLs5BL.jpg" mos="" align="middle" fullscreen="" width="3451" height="1941" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Shark BlastBoss and garden debris </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Similarly, this powerful gadget proved brilliant for corralling stray weeds and general outdoor detritus. </p><p>After the arduous job of pulling out weeds from between my front paving stones, I used the powerful airflow to blast the remnants into a single heap for a far easier clear-up. </p><p>Not only did this make sure that all the weeds were in one spot (easy for me to spot), but made it a far more tidy-looking space.</p><p>For more weeding tips,<a href="https://www.tomsguide.com/home/gardening/i-asked-professional-gardeners-how-to-get-rid-of-weeds-from-my-lawn-permanently-and-they-all-say-this-one-thing"> I asked professional gardeners how to get rid of weeds from my lawn permanently — and they all say this one thing.</a></p><h3 class="article-body__section" id="section-gardening-essentials-we-love"><span>Gardening essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="e7a13e36-81f1-11f1-ad22-8dcb1cd10a9f">            <a href="https://www.amazon.com/Felco-F-2-Classic-Manual-Pruner/dp/B00023RYS6" data-model-name="F2 Pruning Shears" 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/pVTQGL4DSUSgfk9pVKhLgm.jpg" alt="Felco 2 bypass pruners"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Felco </div>                                        <div class="featured__title">F2 Pruning Shears</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e7a13ea4-81f1-11f1-b6e3-59b54181aa4c">            <a href="https://www.amazon.com/dp/B07BD2GZW8" data-model-name="Garden Gloves" 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/YyBJP4YUpLVNV4q2yKFfjS.jpg" alt="Amazing Stuff For You green and gray gardening gloves"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazing Stuff</div>                                        <div class="featured__title">Garden Gloves</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e7a13fb2-81f1-11f1-a0bf-9de4cb207fe7">            <a href="https://www.homedepot.com/pep/Corona-ComfortGEL-6-5-in-Comfort-Grip-Stainless-Steel-Hand-Trowel-CT-3214/205811685?" data-model-name="ComfortGEL 6.5 inch Stainless Steel Hand Trowel:" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:99.84%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/pFmmWavYqAu55zSSvQ7b8U.png" alt="Corona hand trowel"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corona </div>                                        <div class="featured__title">ComfortGEL 6.5 inch Stainless Steel Hand Trowel:</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e7a140b6-81f1-11f1-bfc9-8b7c0dd46c79">            <a href="https://www.amazon.com/Legigo-Support-Trellis-Climbing-Vegetables/dp/B09WDSXD6Y/ref=sxin_17_pa_sp_search_thematic-asin_sspa?" data-model-name="6-Pack Tomato Cage for Garden Plant Support- Up to 48inch " data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:80.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/Ud87PA5ue5zW46sZesfxw3.jpg" alt="Legigo 6-Pack Tomato Cage for Garden Plant Support- Up to 48inch Garden Stakes Tomato Cage, Tomato Trellis for Potted Plants, Tomato Cages Plant Stakes for Climbing Vegetables Plants Flowers"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Legigo</div>                                        <div class="featured__title">6-Pack Tomato Cage for Garden Plant Support- Up to 48inch </div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/home/gardening/can-i-keep-my-used-potting-soil-for-spring-or-should-i-throw-it-out-heres-what-you-need-to-know">Can I keep my used potting soil for spring, or should I throw it out? Here's what you need to know</a></li><li><a href="https://www.tomsguide.com/home/gardening/7-rain-loving-plants-that-will-thrive-in-soggy-soil">7 rain-loving plants that will thrive in soggy soil</a></li><li><a href="https://www.tomsguide.com/home/5-benefits-of-composting-and-how-it-can-enrich-more-than-your-yard">5 benefits of composting and how it can enrich more than your yard</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Why your peace lily isn't blooming — and the exact feeding method to fix it ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/how-to-fertilize-a-peace-lily-for-lush-leaves-and-constant-blooms</link>
                                                                            <description>
                            <![CDATA[ The right fertilizer strategy keeps your peace lily thriving year-round. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">VRhTB2pFhZJjXwDp6vbHLS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/XEFaLHTxhyqmM6boZTwWTB-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 15 Jul 2026 05:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/XEFaLHTxhyqmM6boZTwWTB-1280-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Watering a peace lily]]></media:description>                                                            <media:text><![CDATA[Watering a peace lily]]></media:text>
                                <media:title type="plain"><![CDATA[Watering a peace lily]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/XEFaLHTxhyqmM6boZTwWTB-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Peace lilies are forgiving houseplants <a href="https://www.tomsguide.com/home/gardening/the-one-place-you-should-never-put-a-peace-lily-and-why">until they're not</a>. They tolerate neglect, bounce back from underwater watering, and look elegant in corners where other plants struggle. </p><p>But they have one non-negotiable requirement: regular feeding. Without it, those glossy green leaves <a href="https://www.tomsguide.com/home/why-are-the-flowers-on-my-peace-lily-turning-brown-i-asked-an-expert-what-i-should-do">start losing their shine</a>, blooms become sparse, and your plant quietly declines into a sad, pale version of itself. </p><p>Get the timing and amount right, and your peace lily rewards you with vibrant foliage and those signature white flower spathes appearing constantly. Here's how to feed your plant so it actually thrives.</p><section class="howto-block">                    <h3>Feed during growth season</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/xxW2FQFAdFPwn6noiGRepQ.jpg"                                        alt="Peace lily plant close up "                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/xxW2FQFAdFPwn6noiGRepQ.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Peace lilies grow aggressively in spring and summer when days are longer and sunlight is abundant. <strong>This is when they need regular feeding</strong>, typically starting in late February or early March. </p><p>During these months, your plant actively produces new leaves and flowers, a process that demands consistent nutrients.</p><p>Conversely, you should <strong>stop fertilizing entirely in late fall and winter</strong>. Your plant receives less sunlight, grows slowly, and enters a natural dormancy where it needs far less nutrition. </p><p>If you use grow lights year-round, you can fertilize continuously since artificial light mimics constant growing conditions. But for most indoor gardeners, seasonally adjusting fertilizer prevents accidentally overfeeding the root system.</p></p>                </section><section class="howto-block">                    <h3>Option 1: Fast-acting water-soluble fertilizer</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/Usz7J2Fa5XZPmD8kJuDHcG.jpg"                                        alt="Watering a peace lily"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/Usz7J2Fa5XZPmD8kJuDHcG.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Water-soluble fertilizers give you immediate control and are perfect if you enjoy a hands-on routine. For peace lilies, <strong>look for a balanced liquid fertilizer with an equal nutrient ratio, such as a 10-10-10 NPK mix</strong>. </p><p>During the active spring and summer growing season, <strong>you will want to apply this mixture every two to four weeks</strong>.</p><p>To apply it correctly, <strong>mix the fertilizer into your watering can, but dilute it to half the strength recommended</strong> on the product packaging. Weak fertilizer applied consistently produces beautiful results without risking root burn. </p><p>Pour the mixture evenly around the base of the plant just like a regular watering, ensuring it saturates the soil without splashing directly onto the glossy leaves.</p></p>                </section><section class="howto-block">                    <h3>Option 2: Low-maintenance slow-release granules</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/hjMM8nP3Q988Tbo3VmpkAo.jpg"                                        alt="Peace lily refreshed with pruned brown flowers removed"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/hjMM8nP3Q988Tbo3VmpkAo.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future / Camilla Sharman)</div></figure>                    <p><p>If you tend to forget routine plant chores, slow-release granules offer a highly forgiving alternative. These small pellets are designed to break down slowly, steadily releasing nutrients into the soil every time you water over the course of several months.</p><p>Because of this sustained release<strong>, you only need to apply them once at the start of the spring growing season</strong>.</p><p>To apply them,<strong> scatter the recommended amount of granules evenly across the top of your potting mix</strong>. For the best results, <strong>gently work the pellets into the top inch of soil using a kitchen fork</strong> so they are well integrated. </p><p>Once scratched into the dirt, they will completely automate your feeding schedule for the rest of the summer, eliminating any need for mixing or measuring liquids.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OLq6JX"></div>                            </div>                            <script src="https://kwizly.com/embed/OLq6JX.js" async></script><figure class="van-image-figure pull-right inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:676px;"><p class="vanilla-image-block" style="padding-top:31.51%;"><img id="ZCwuUFRE3YeboHR4zyEWmb" name="r3t8zZ5ve4GewFTeoCM3R6" alt="Google" src="https://cdn.mos.cms.futurecdn.net/ZCwuUFRE3YeboHR4zyEWmb.jpg" mos="" align="right" fullscreen="" width="676" height="213" attribution="" endorsement="" class="pull-rightinline"></p></div></div><figcaption itemprop="caption description" class="pull-right inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/home/gardening/where-to-put-a-peace-lily-so-it-actually-flowers-5-ideal-spots-in-your-home">Where to put a peace lily so it actually flowers — 5 ideal spots in your home</a></li><li><a href="https://www.tomsguide.com/home/gardening/peace-lily-outgrowing-its-pot-heres-when-and-how-to-repot-it">Peace lily outgrowing its pot? Here's when and how to repot it</a></li><li><a href="https://www.tomsguide.com/home/gardening/your-peace-lily-needs-dividing-if-you-see-these-signs-heres-how-to-do-it">Your peace lily needs dividing if you see these signs — here's how to do it</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How do I know when my homegrown tomatoes have peak flavor? 3 things to look for before picking ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/how-do-i-know-when-my-homegrown-tomatoes-have-peak-flavor-3-things-to-look-for-before-picking</link>
                                                                            <description>
                            <![CDATA[ If you’re wondering why your homegrown tomatoes aren't flavorful, you’re probably picking them at the wrong time. Here’s the right time to pick. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">mTmRHY9RcWgPmERKQFdKfK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/eGWsAiXECXnXYQUYzny3Qd-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 14 Jul 2026 10:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/eGWsAiXECXnXYQUYzny3Qd-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Woman´s hands picking fresh tomatoes to wicker basket. ]]></media:description>                                                            <media:text><![CDATA[Woman´s hands picking fresh tomatoes to wicker basket. ]]></media:text>
                                <media:title type="plain"><![CDATA[Woman´s hands picking fresh tomatoes to wicker basket. ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/eGWsAiXECXnXYQUYzny3Qd-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There’s nothing quite like the taste of homegrown tomatoes. And if you enjoy picking these straight from the vine and into your dishes (or mouth), it can be a letdown when your crop misses that<a href="https://www.tomsguide.com/home/tired-of-bland-tomatoes-i-recommend-growing-these-5-varieties-at-home-if-you-love-flavor"> </a>bold, juicy flavor you had hoped for. </p><p>However, even though it looks ripe and ready for the picking, you’ll need to know the best stage of ripeness for picking a tomato. </p><p>What’s more, tomatoes on the vine are constantly at risk of damage from weather extremes, pests, and disease. Which is why identifying the ideal time to harvest is crucial for securing a high-quality, delicious yield.</p><p>So if you want to avoid a <a href="https://www.tomsguide.com/home/tired-of-bland-tomatoes-i-recommend-growing-these-5-varieties-at-home-if-you-love-flavor">bland and disappointing crop</a>, here are the three tomato picking stages — to ensure they are bursting with the juicy flavor you crave.</p><h3 class="article-body__section" id="section-1-when-your-tomatoes-are-fully-ripe-and-red"><span>1. When your tomatoes are fully ripe and red</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3616px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="X6JgwK4CPg6pE6FxeeCivN" name="shutterstock_591110411.jpg" alt="Tomato plants ready to harvest, abundant with tomatoes" src="https://cdn.mos.cms.futurecdn.net/X6JgwK4CPg6pE6FxeeCivN.jpg" mos="" align="middle" fullscreen="" width="3616" height="2034" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Tomato plants ready to harvest, abundant with tomatoes </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>This is when your tomato crops have reached their full size, red color, and are firm in texture. These signs indicate that your harvest is ready for consumption, and experts suggest eating or using them immediately after they are picked for maximum flavor.</p><p>However, after harvesting, be sure you consume them within a day or two to enjoy them before their peak flavor begins to fade. </p><p>It’s also worth noting that the kind of tomato plant you select is vital for its final flavor. </p><p>“The variety of tomato can determine flavor,” states Jessica Mercer, Ph.D, horticulturist at <a href="https://plantaddicts.com/" target="_blank">Plant Addicts</a>. “Some tomatoes are bred for shipping ease, firmness, disease resistance, or high yield. Others, like cherry tomatoes, grape tomatoes, and many heirlooms, are known for good sugar-acid balance and aroma.”</p><p>Before choosing which seeds to sow, you should investigate which particular cultivars align with your preferred flavor profiles.</p><p>For top tips, check out <a href="https://www.tomsguide.com/home/gardening/toms-guide-to-tomatoes">Tom's Guide to tomatoes</a> for everything you need to know about growing a juicy harvest. </p><h3 class="article-body__section" id="section-2-the-color-break-or-turn-stage"><span>2. The ‘color break’ or turn stage</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="agf9SfuNVTXFhaxqjqsLLN" name="shutterstock_2480139163edit.jpg" alt="Ripening tomatoes on a branch" src="https://cdn.mos.cms.futurecdn.net/agf9SfuNVTXFhaxqjqsLLN.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Ripening tomatoes on a branch </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>As the name suggests, this is the point at which the fruit begins to get color, about the size of a dime on the blossom end. </p><p>While it’s tempting to pluck and eat the fruit at this stage, you may be disappointed with the overall taste, as it hasn’t yet fully ripened. </p><p>A top tip is to place them on a countertop at room temperature for three days, and the tomato should ripen — ready for your tasty dishes. </p><p>Of course, if you want to keep them for longer, store them in the fridge for a few days. </p><h3 class="article-body__section" id="section-3-mature-green-stage"><span>3. Mature green stage</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5vYQwM9DpQSq8XQtdFk8cK" name="green tomatoes.jpg" alt="green tomatoes on vine" src="https://cdn.mos.cms.futurecdn.net/5vYQwM9DpQSq8XQtdFk8cK.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">green tomatoes on vine </span><span class="credit" itemprop="copyrightHolder">(Image credit: Kzenon/Shutterstock)</span></figcaption></figure><p>This is when your plant has a lighter green color but no pink/red showing yet on the blossom end. Typically, this indicates that your tomatoes are not quite ready to harvest, and usually takes about a week to fully ripen.</p><p>However, you can pluck and store them in the fridge for a few weeks at this stage of development. In addition, gardeners usually harvest mature green crops as the season ends to protect them from frost.</p><h3 class="article-body__section" id="section-top-tip-for-tasty-tomatoes"><span>Top tip for tasty tomatoes</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:692px;"><p class="vanilla-image-block" style="padding-top:56.21%;"><img id="hyaBvfANeJWRwWMXUpLPgM" name="Watering tomato plant - crop.jpg" alt="Watering tomato plant" src="https://cdn.mos.cms.futurecdn.net/hyaBvfANeJWRwWMXUpLPgM.jpg" mos="" align="middle" fullscreen="" width="692" height="389" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Watering tomato plant </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Although the heatwave might encourage more frequent watering, overwatering your plants can actually wash out the bold flavor you desire. </p><p>To avoid diluting those essential sugars and acids, a good tip is to water only once the upper two inches of soil feel dry to the touch.</p><p>“Too much water, particularly when fruit is ripening, can dilute the sugars and acids that give tomatoes their flavor,” explains Mercer. </p><p>“Water deeply and consistently when the top inch or two of soil begins to dry. Check the soil for dryness before watering again.” What’s more, overwatering tomatoes, especially before a harvest, can make a real difference to their sweetness.</p><p>Plus, you’ll need to ensure your soil is kept in a healthy condition, free from disease or root rot, often triggered by overwatering. </p><p>Add a rich, organic fertilizer like a good fish fertilizer. This contains all the essential plant nutrients such as nitrogen, phosphorus, and potassium — which are all vital for healthy development and full flavor.  </p><p>For more top tips, check out<a href="https://www.tomsguide.com/home/gardening/when-to-fertilize-your-tomatoes-and-how-to-get-a-bountiful-harvest"> when to fertilize tomatoes: the 3-step schedule for a bountiful harvest</a></p><div class="product"><a data-dimension112="63386346-7ed5-11f1-ae00-7b1bba92846a" data-action="Deal Block" data-label="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension48="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension25="$23" href="https://www.amazon.co.uk/Luster-Leaf-1601-Rapitest-Soil/dp/B0000DI845/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:709px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="BTuEKLuVH5pLwYnLD7sqmZ" name="Luster Leaf Soil Test Kit" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BTuEKLuVH5pLwYnLD7sqmZ.jpg" mos="" align="middle" fullscreen="" width="709" height="709" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash. <a class="view-deal button" href="https://www.amazon.co.uk/Luster-Leaf-1601-Rapitest-Soil/dp/B0000DI845/" target="_blank" rel="nofollow" data-dimension112="63386346-7ed5-11f1-ae00-7b1bba92846a" data-action="Deal Block" data-label="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension48="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension25="$23">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/how-to/how-often-should-you-water-tomato-plants">How often should you water tomato plants and when should you do it?</a></li><li><a href="https://www.tomsguide.com/home/when-to-pick-tomatoes-off-the-vine">3 ways to tell that your tomatoes are ready to harvest</a></li><li><a href="https://www.tomsguide.com/how-to/7-ways-to-get-more-fruit-from-a-tomato-plant">7 ways to increase the yield from your tomato plants</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Hydrangea help? 4 key steps that turned my potted hydrangea from grumpy to green again ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/hydrangea-help-4-key-steps-that-turned-my-potted-hydrangea-from-grumpy-to-green-again</link>
                                                                            <description>
                            <![CDATA[ Hydrangea struggling? Here’s my rescue plan that transformed my fading blooms. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">VtSMvs5WgWZQJL3jc45BGi</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/vYVA8cvDtXazKtLMEMBZJT-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 13 Jul 2026 06:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Annie Collyer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/vhGTrYaKmHT3L5eXaQh4ZA.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/vYVA8cvDtXazKtLMEMBZJT-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Misting hydrangea leaves]]></media:description>                                                            <media:text><![CDATA[Misting hydrangea leaves]]></media:text>
                                <media:title type="plain"><![CDATA[Misting hydrangea leaves]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/vYVA8cvDtXazKtLMEMBZJT-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I bought my first hydrangea this year. And despite everyone I know (well, my mom and grandma) telling me to plant it in the ground, I decided to defy the odds and keep it in my lovely garden pot. And it worked for approximately two months until it totally died. Or so I thought it did.</p><p>I took a few snaps of my once-pink and beautiful hydrangea and asked AI to help me bring it back to life. To my surprise, there were several things I was doing wrong, all of which definitely contributed to its rapid decay. </p><p>Now? It's showing some signs of regrowth, and I didn't even have to spend any money. Here's hoping that next year will bring some of these beautiful blooms back again. </p><p>Yes, there is a chance that you can save your potted hydrangea if it's looking a little sad because of the heat. </p><p>So whether you are battling parched patches or fragile stems, here is my personal process—and the expert-backed steps you should implement—before you give up and toss everything into the compost heap. After all, a little effort can go a long way!</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JEpXGz6HjLDZzndidDm37g" name="Potted hydrangea - before" alt="Potted hydrangea, dry and dead, sitting on decking in the sun" src="https://cdn.mos.cms.futurecdn.net/JEpXGz6HjLDZzndidDm37g.jpg" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Before some TLC. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future/Annie Collyer)</span></figcaption></figure><h3 class="article-body__section" id="section-1-you-need-to-trim-it-back-trust-me"><span>1. You need to trim it back (trust me!)</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Eq5dqzYdPM7RiR8vaMgmFG" name="Potted hydrangea - trimming" alt="Hydrangea potted, after being trimmed back" src="https://cdn.mos.cms.futurecdn.net/Eq5dqzYdPM7RiR8vaMgmFG.jpg" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future/Annie Collyer)</span></figcaption></figure><p>One of the worst things that you can do if your hydrangea is dying is leave it to wilt and die. </p><p>Instead, you need to chop away the dead bits to make way for new life. Start by removing dead leaves and then focus on the dead stems. </p><p>A good way to test the stems is to scratch them slightly. If they are green underneath, they are alive, but brown means they're dead.</p><p>I had to trim back my entire hydrangea in the end, and I really wasn't feeling hopeful afterwards, to be honest. But I did manage to find a good few stems showing slithers of life.</p><h3 class="article-body__section" id="section-2-it-definitely-needs-a-good-drink"><span>2. It definitely needs a good drink</span></h3><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="kzvvy63NsXJ4iWcCaiwj7c" name="Potted hydrangea - watering" alt="Potted hydrangea, dead in pink pot, sat in kitchen sink filled with water" src="https://cdn.mos.cms.futurecdn.net/kzvvy63NsXJ4iWcCaiwj7c.jpg" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future/Annie Collyer)</span></figcaption></figure><p>You might think that just watering your hydrangea with your watering can is enough. And most of the time, it is. </p><p>But when it's looking really sad or maybe almost dead, then it's time for a sink bath. Simply use your plug and fill your kitchen sink with water, place your pot in there, and let it have a really good drink.</p><p>A good way to check if your hydrangea needs a sink bath is to use a finger and poke it into its soil. If it's soggy or musty 2-3 inches down, it's been overwatered, or there might be poor drainage. If it's totally dry, in the sink it goes. </p><p>I left mine in the sink for 30 minutes. I then let it fully drain afterwards, before walking it back through my house and to my garden.</p><h3 class="article-body__section" id="section-3-it-probably-needs-to-be-moved"><span>3. It probably needs to be moved</span></h3><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="kVZiLbwR9T9Dn7cPSoCDyL" name="Potted hydrangea - new spot" alt="Potted hydrangea plant in new location in garden" src="https://cdn.mos.cms.futurecdn.net/kVZiLbwR9T9Dn7cPSoCDyL.jpg" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future/Annie Collyer)</span></figcaption></figure><p>My garden is south-facing, which you think is great until it hits the summer months and being barefoot outside is no longer an option. </p><p>So, watering your plants three times a day becomes a chore and a necessity. All jokes aside: a south-facing garden is a little bit of a nightmare. And it's also probably the reason why some of your plants aren't surviving! After I moved my hydrangea from one side of my garden to the other, I saw a difference.</p><p>Simply moving its position from all-day sun to only morning sun and afternoon shade gave this plant a little bit of a break. </p><p>Now, it lives in the one spot in my garden that gets shade first, and it's loving it.</p><h3 class="article-body__section" id="section-4-feed-it-coffee"><span>4. Feed it coffee</span></h3><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="mt86NgyLcATcCxFGjddDr8" name="Potted hydrangea - with coffee in soil" alt="Hydrangea in pot, growing back with coffee grounds in soil" src="https://cdn.mos.cms.futurecdn.net/mt86NgyLcATcCxFGjddDr8.jpg" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future/Annie Collyer)</span></figcaption></figure><p>Just like yourself, your hydrangea plant thrives when given a coffee (or five!). </p><p>I have a bean-to-cup <a href="https://www.tomsguide.com/home/coffee-makers/best-coffee-makers">coffee maker</a>, and I've been feeding this plant the spent grounds and water for around six weeks. </p><p>I don't overdo it, but a little does definitely help! There are so many good uses for coffee when it comes to gardening.</p><h3 class="article-body__section" id="section-top-tip"><span>Top tip</span></h3><p>You might find that a few weeds start growing in your potted hydrangea as you're trying to encourage new growth. </p><p>This is normal, but you should definitely remove these from the root as soon as possible. These weeds will be taking away any nutrients from your hydrangea, and as we know, it desperately needs all of the nutrients it can get right now.</p><h3 class="article-body__section" id="section-the-end-results"><span>The end results</span></h3><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="PHXdvXBCJeXkAxoVJ7HuPi" name="Potted hydrangea - after" alt="Hydrangea roots in pot with life growing" src="https://cdn.mos.cms.futurecdn.net/PHXdvXBCJeXkAxoVJ7HuPi.jpg" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future/Annie Collyer)</span></figcaption></figure><p>Six weeks later, I can <em>finally </em>see new life coming back to my hydrangea plant. There's no chance of blooming flowers just yet, but it is showing promising signs of regrowth thanks to its obviously new and green leaves in the center of its pot. </p><p>And I even asked AI to confirm this for me, in case it was wishful thinking. I told it my location, and it assessed the photo I sent.</p><p>The roots are definitely still alive, and it's starting to reshoot from the base, which is what hydrangeas do after a severe dieback.</p><p>If yours is looking the same, then it recommends leaving it for another 2-3 weeks without pruning, as the current stems will protect new growth. After this, you can decide which stems are finally dead and which ones are showing positive signs. In this time, keep it moist but don't let it sit in lots of water. </p><h3 class="article-body__section" id="section-gardening-watering-essentials-we-love"><span>Gardening watering essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="79baf8d6-7ba6-11f1-9e73-39461aaddb13">            <a href="https://www.amazon.co.uk/dp/B0B7LMBHGQ?" data-model-name="Rain Gauge Outdoor, 7"" 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/9tg2fJfvgkE3grMsNYVU7L.jpg" alt="Hobyluby Rain Gauge Outdoor, 7 Inch Rain Gauges for Measuring Precipitation, Garden Yard Decor"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>HOBYLUBY</div>                                        <div class="featured__title">Rain Gauge Outdoor, 7"</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="79baf958-7ba6-11f1-b32d-7100e847ced6">            <a href="https://www.amazon.com/Qilebi-Watering-Removable-Stainless-Sprinkler/dp/B0BN2T87DY/ref=sr_1_7?dib=eyJ2IjoiMSJ9.BQwmZOmIN3ah4NaG8y9uun0YIkvTunRaoeR2c3x4MOzJxhf-7vpNNYlXQ56jv_q5o6wpnJ04-Ms1lieGc30ewVlBMsbU9FH_8v1nvUpiOdV-NNL-hney7-v2yo19rsIkPmKnHcLl7JfEtyYKRmYsF4VpXiLdwvIrCoWhM0x0IUHVfgmNeXd4y2YO_ryVO9nn9Uawcqd6CBJMZkR_4fXbp0vLQVNH2z0grz1ED8TWDyYftA-DN25FXuUr5J2OQtwtDCZb-kTFraPxYvS6Bk14ejYJ2siE3y8imRsRwEs6UoA.jHTgr5ft7E-D7VF-LVNzEl6WIuwKW6g1RAPVvtxv-J8&dib_tag=se&keywords=watering%2Bcans&qid=1781014473&sr=8-7&th=1" data-model-name="2 Gallon Watering Can" 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/z27aZSuNKziTx22mMEpHGW.jpg" alt="2 Gallon Watering Can, Garden Watering Can Outdoor, Plant Water Can With Removable Long Spout and Stainless Steel Sprinkler Head, Large Plastic Outdoor Watering Cans for Gardening Flower Plants"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Qilebi</div>                                        <div class="featured__title">2 Gallon Watering Can</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="79baf9da-7ba6-11f1-aa45-07c1ac0ca2f1">            <a href="https://www.amazon.com/Flexi-Hose-Function-Nozzle-50FT/dp/B0DZR7VRHL/ref=sr_1_3_sspa?" data-model-name="Expandable Garden Hose with 8 Function Nozzle, 50ft" 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/9m3GKeFbvcxDuZYngMgPic.jpg" alt="Flexi Hose Expandable Garden Hose With 8 Function Nozzle, 50ft - Lightweight Retractable Garden Hose, Water Hose - No-Kink Flexibility, 3/4 Inch Solid Brass Fittings and Double Latex Core"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Flexi Hose</div>                                        <div class="featured__title">Expandable Garden Hose with 8 Function Nozzle, 50ft</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/how-to/how-often-should-you-water-tomato-plants">How often should you water tomato plants and when should you do it?</a></li><li><a href="https://www.tomsguide.com/home/when-to-pick-tomatoes-off-the-vine">3 ways to tell that your tomatoes are ready to harvest</a></li><li><a href="https://www.tomsguide.com/how-to/7-ways-to-get-more-fruit-from-a-tomato-plant">7 ways to increase the yield from your tomato plants</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Why is my grass patchy after seeding? I asked the experts how to fix it ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/why-is-my-grass-patchy-after-seeding-i-asked-the-experts-how-to-fix-it</link>
                                                                            <description>
                            <![CDATA[ Do you have patches ruining your lawn? Gardeners reveal the reason your lawn is still patchy after seeding it and how to fix it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">2Hw5n8AVgynPsYtWmGPXnn</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DNe9kwrtK3EdUoANa8LTJW-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 12 Jul 2026 05:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Lawn Care]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/DNe9kwrtK3EdUoANa8LTJW-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Holding grass seeds to plant]]></media:description>                                                            <media:text><![CDATA[Holding grass seeds to plant]]></media:text>
                                <media:title type="plain"><![CDATA[Holding grass seeds to plant]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DNe9kwrtK3EdUoANa8LTJW-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Now that summer has arrived, the scorching temperatures often take their toll on our previously lush and <a href="https://www.tomsguide.com/how-to/how-to-make-grass-greener">green grass</a>. It’s disheartening to see unappealing <a href="https://www.tomsguide.com/home/gardening/why-do-i-have-yellow-patches-in-my-lawn-gardening-experts-share-their-top-tips-on-how-to-fix-it">yellow patches</a> or spots on your lawn, particularly when you have gone the extra mile to seed bare spots.</p><p>In addition, you’re probably wondering why grass grows at a faster rate in some bare spots and not in others. Luckily, I’ve called on the lawn care experts to reveal why my grass is still patchy after seeding and to share tips on how to fix it.</p><h2 id="what-causes-lawn-to-be-patchy-after-seeding">What causes lawn to be patchy after seeding?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5390px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RwnyCYupmo4CsDXuzHHtpJ" name="shutterstock_2249537999.jpg" alt="Brown spots in grass in garden" src="https://cdn.mos.cms.futurecdn.net/RwnyCYupmo4CsDXuzHHtpJ.jpg" mos="" align="middle" fullscreen="" width="5390" height="3032" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Brown patches in grass </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Essentially, overseeding is when you spread a thin layer of grass seed that matches your existing lawn type and climate zone. Experts usually suggest this method to fix bare spots, naked turf, or overrunning weeds, which are clear signs of density issues. </p><p>But why does your grass still look a little patchy even after you’ve seeded? According to experts, there could be several reasons for this — from birds swiping seeds off the ground to the breeze blowing some away. </p><p>“It’s quite common for the first go at seeding to come up slightly patchy,” adds Chrissie Handley, lawn care specialist at <a href="http://www.onlineturf.co.uk" target="_blank">Online Turf</a>.  “You tend to lose some seed either from the birds picking some off the ground, or through wind blowing it away, or heavy rain can also wash some away, giving you a sparse regrowth.”</p><p>Although it’s advisable to sprinkle the seeds by hand to tackle those smaller areas, you may be spreading it too thin in certain areas — leading to patchy turf after seeding. </p><div><blockquote><p>"You tend to lose some seed either from the birds picking some off the ground, or through wind blowing it away"</p><p>Chrissie Handley, lawn care specialist </p></blockquote></div><p>“Sometimes, the area can appear sparse and patchy if you’ve seeded by hand, as sometimes there will be a higher concentration of seed in certain areas, depending on the way it fell when sown,” adds Handley. </p><p>“You can simply top up these areas with additional seed once you begin to notice the sparse areas. If you do this when the seed is just beginning to germinate, you’ll have a better chance of it blending together quickly.”</p><h2 id="how-do-i-fix-my-patchy-lawn">How do I fix my patchy lawn?</h2><p>So what can I do to fix unsightly patches? Experts advise the best solution is to reseed the affected areas, using lawn repair products or a good fertilizer.</p><p>“Proper fertilization also encourages dense turf, effectively crowding out weeds and minimizing bare patches, reducing soil erosion and promoting overall lawn stability,” states Allison Koenig, lawn and garden expert at <a href="http://tractorsupply.com" target="_blank">Tractor Supply</a>. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3148px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="tyBNke4AjR6gYGGH8NUiDZ" name="shutterstock_484448059.jpg" alt="Brown patches in grass" src="https://cdn.mos.cms.futurecdn.net/tyBNke4AjR6gYGGH8NUiDZ.jpg" mos="" align="middle" fullscreen="" width="3148" height="1771" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Brown patches in grass </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>“Good fertilizing practice can help ensure you grow greener, healthier grass with a strong root system to combat heat, cold, drought, mowing, and foot traffic.”</p><p>For top tips, check out <a href="https://www.tomsguide.com/how-to/how-often-should-you-fertilize-your-lawn">how often should you fertilize your lawn and when to do it.</a></p><p>Of course, prevention is key, and there are top tips you can do before seeding to ensure you get lush, revived grass for the summer. These include things sowing at the right time of day or adding a layer of topsoil afterwards.  </p><p>“There are ways to try and counteract this with the way that you sow – always factor in extra, it’s always better to overseed to over-prepare for any that may be lost, as well as covering the seeded area,” Handley suggests.</p><p>“Add in a thin layer of topsoil afterwards. This can help stop the birds from picking it off, and also helps the seed make good contact with the ground, improving your germination rate. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zD5WqVZfvzmsc6ECA6k7ac" name="shutterstock_1700730595edit" alt="Grass seed being sown over thin and patchy grass" src="https://cdn.mos.cms.futurecdn.net/zD5WqVZfvzmsc6ECA6k7ac.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>“Make sure it’s a light covering of topsoil so that you’re not smothering them, and try to sow on a mild day where temperatures are forecast to be consistent for a while for a better yield. You should also keep the area consistently moist but don’t overwater — if you’re getting a lot of rain, hold off on watering.”</p><p>Typically, you should ensure your lawn gets the recommended one to two inches of water each week, but during hot, dry spells, you may need to double the duration. Additionally, watering deeply every three to four days rather than daily helps promote stronger, more drought-resistant roots. </p><p>For more top tips, check out <a href="https://www.tomsguide.com/home/lawn-care/how-to-tell-if-your-lawn-needs-overseeding-3-signs-you-cant-ignore">how to tell if your lawn needs overseeding</a>, especially if you want to maintain healthy grass all year round. Or if you just want a lush lawn, try these <a href="https://www.tomsguide.com/home/lawn-care/11-secrets-to-a-lawn-thats-greener-than-your-neighbors">11 secrets to a lawn that’s greener than your neighbor's.</a></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eG0N2W"></div>                            </div>                            <script src="https://kwizly.com/embed/eG0N2W.js" async></script><h3 class="article-body__section" id="section-lawncare-essentials-we-love"><span>Lawncare essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="fbaf02ea-7c4d-11f1-96f3-ddd2fd156b01">            <a href="https://www.amazon.com/Garden-Guru-Handheld-Spreader-Shaker/dp/B0F8P8QM3V/ref=sr_1_8?" data-model-name="Garden Guru Handheld Seed Spreader Shaker" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:82.80%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/ezrwVY6BYsgBZtBcNhMTm9.jpg" alt="Garden Guru Handheld Seed Spreader Shaker – Multi Use Grass Seed, Fertilizer, Salt, Ice & Snow Melt Spreader – Adjustable Twist Cap W Multiple Size Openings – Lightweight 1l Capacity Hand Seeder"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Garden Guru Handheld Seed Spreader Shaker</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="fbaf0358-7c4d-11f1-bc16-ab53e81a0be3">            <a href="https://www.amazon.com/dp/B07BD2GZW8" data-model-name="Garden Gloves" 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/YyBJP4YUpLVNV4q2yKFfjS.jpg" alt="Amazing Stuff For You green and gray gardening gloves"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazing Stuff</div>                                        <div class="featured__title">Garden Gloves</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="fbaf03c6-7c4d-11f1-bc38-fd8c1a23debe">            <a href="https://www.amazon.com/Grampas-Weeder-CW-01-Original-Remover/dp/B001D1FFZA?" data-model-name="Grampa's Weeder" 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/kP7pgu2tpxz8d34HtVQgxC.jpg" alt="Grampa's Weeder The Original Stand Up Weed Puller Tool with Long Handle"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Grampa's Weeder</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="fbaf0434-7c4d-11f1-97e4-6fa534c6c39f">            <a href="https://www.amazon.com/Greenworks-G-MAX-Mower-Batteries-Charger/dp/B086K59Q79/ref=sr_1_3?" data-model-name="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower" 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/8LF2UvRs8EXvmebaZefwzA.jpg" alt="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower (200+ Compatible Tools), (2) 4.0ah Batteries and Dual Port Rapid Charger Included"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/how-to/7-common-lawn-care-mistakes-you-are-probably-making-right-now"><u>7 common lawn care mistakes you’re probably making right now</u></a></li><li><a href="https://www.tomsguide.com/how-to/9-ways-to-get-the-most-out-of-your-lawn-mower">9 ways to get the most out of your lawn mower</a></li><li><a href="https://www.tomsguide.com/how-to/5-plants-that-will-keep-wasps-out-of-your-yard">5 plants that will keep wasps out of your yard</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Why is my basil turning yellow? The 3 most common causes and how to fix them ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/why-is-my-basil-turning-yellow-the-3-most-common-causes-and-how-to-fix-them</link>
                                                                            <description>
                            <![CDATA[ Yellowing basil leaves are a stress signal. Here's what your plant is trying to tell you. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">SMEcpgwmgW5b9yq8aGHEAf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4GAp4p9UqJWMmrNVvMSru3-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 11 Jul 2026 11:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/4GAp4p9UqJWMmrNVvMSru3-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Basil plant turning yellow]]></media:description>                                                            <media:text><![CDATA[Basil plant turning yellow]]></media:text>
                                <media:title type="plain"><![CDATA[Basil plant turning yellow]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4GAp4p9UqJWMmrNVvMSru3-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Basil is fussy about conditions. It comes from warm tropical environments where it thrives in heat, bright light, and consistent care. When basil starts turning yellow, it's essentially waving a flag. Something in its environment has shifted. </p><p>Once you understand what basil needs, diagnosing the problem becomes straightforward. In most cases, yellowing basil leaves signal one of three fixable issues. Here's how to identify which one and get your plant back to thriving.</p><h2 id="1-your-basil-is-too-wet">1. Your basil is too wet </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Dse3fnrLR9xrgXaxLjespf" name="shutterstock_1072051754.jpg.jpg" alt="Wilted basil" src="https://cdn.mos.cms.futurecdn.net/Dse3fnrLR9xrgXaxLjespf.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: Shutterstock)</span></figcaption></figure><p>Overwatering causes about 80% of basil yellowing problems. Basil hates sitting in waterlogged soil. When soil stays damp, roots suffocate and can't absorb nutrients or oxygen. The plant essentially drowns from the inside.</p><p>Look at the lower leaves first. If they're turning soft and mushy yellow while the soil feels damp or smells stale, you're watering too much. The fix is immediate:<strong> stop watering completely. Let the top 1-2 inches of soil dry out entirely before you water again</strong>. </p><p>Also, make sure your pot has drainage holes. This is non-negotiable for basil.</p><p>Going forward, water when soil feels dry to the touch, not on a schedule. Basil would rather be slightly underwatered than oversaturated.</p><h2 id="2-it-s-living-in-the-shadows">2. It's living in the shadows</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HA88BDpoCsNnGijEibE9ZU" name="Placing basil plant on windowsill" alt="Placing basil plant on windowsill" src="https://cdn.mos.cms.futurecdn.net/HA88BDpoCsNnGijEibE9ZU.jpg" mos="" align="middle" fullscreen="" width="4000" height="2250" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Basil is a sun worshipper that needs<strong> 6-8 hours of direct sunlight daily </strong>to maintain its green color. Without it, the entire plant looks pale and yellowish. You'll also notice the stems getting long, thin, and stretchy as they reach desperately toward the nearest light source.</p><p><strong>Move basil to your absolute sunniest window, preferably south-facing</strong>. If indoor light is genuinely limited, a cheap LED grow light makes an enormous difference. Even a few hours under a grow light daily revives pale, yellowing basil remarkably fast. </p><p>Outdoor placement works too, if weather allows. Exposure to full sun transforms basil plants within days.</p><h2 id="3-the-soil-has-nothing-left-to-give">3. The soil has nothing left to give</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5Gp5CpPkDYhNk4XkKcVawe" name="Basil plant leaves turning yellow" alt="Basil plant leaves turning yellow" src="https://cdn.mos.cms.futurecdn.net/5Gp5CpPkDYhNk4XkKcVawe.jpg" mos="" align="middle" fullscreen="" width="4000" height="2250" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Basil grows aggressively and depletes potting soil nutrients within 4-6 weeks. <strong>Nitrogen deficiency is usually the culprit behind yellowing leaves</strong>. Unlike the mushy yellow from overwatering, nutrient-starved basil stays firm. The entire plant just looks pale and stunted.</p><p>Give it a drink of balanced, water-soluble fertilizer mixed at half strength — tomato or herb fertilizer works perfectly. One feeding usually restores color within a week or two. If you're using basil heavily for cooking, consider fertilizing every 2-3 weeks to keep nutrients available.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OdRD5e"></div>                            </div>                            <script src="https://kwizly.com/embed/OdRD5e.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/home/is-your-basil-plant-wilting-5-causes-and-quick-fixes-to-revive-it">Is your basil plant wilting? 5 causes and quick fixes to revive it</a></li><li><a href="https://www.tomsguide.com/home/gardening/why-are-my-tomato-plant-leaves-turning-yellow-5-steps-to-save-your-harvest">Why are my tomato plant leaves turning yellow? 5 steps to save your harvest</a></li><li><a href="https://www.tomsguide.com/home/the-timeless-gardening-wisdom-your-grandparents-swore-by-and-why-it-still-works-today">The timeless gardening wisdom your grandparents swore by — and why it still works today</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Skunk in your backyard? Experts share the signs to look out for ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/skunk-in-your-backyard-experts-share-the-signs-to-look-out-for</link>
                                                                            <description>
                            <![CDATA[ The good, the bad and the stinky! How to tell if you’ve got skunks in your backyard. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">cLNvSgQYqarAwa3QFRTeDa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/xvh4pkm9J2MKc8Vio2kzcK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 11 Jul 2026 05:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/xvh4pkm9J2MKc8Vio2kzcK-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Skunk on table]]></media:description>                                                            <media:text><![CDATA[Skunk on table]]></media:text>
                                <media:title type="plain"><![CDATA[Skunk on table]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/xvh4pkm9J2MKc8Vio2kzcK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>While their distinctive black-and-white coats are easily identifiable, skunks are rarely welcomed as backyard friends. Instead, they are often dismissed as garden pests.</p><p>Their reputation for being stinky creatures far outweighs their striking appearance, an annoyance only amplified by the mess they make digging up lawns in search of grubs.</p><h2 id="how-to-tell-if-a-skunk-s-been-in-your-backyard">How to tell if a skunk’s been in your backyard</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4188px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="smLBLRAVnDaAn8zZWPgFNi" name="shutterstock_504938689.jpg" alt="Skunk by overturned garbage can" src="https://cdn.mos.cms.futurecdn.net/smLBLRAVnDaAn8zZWPgFNi.jpg" mos="" align="middle" fullscreen="" width="4188" height="2356" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Even if you don’t spot a skunk in broad daylight, they leave clear signs behind.<strong> </strong>Brandon Runyon, entomologist at <a href="https://swatpest.com/" target="_blank">Swat Pest Management</a>, says, “You may see signs of digging, knocked-over trash cans, and even smell that a skunk’s been about.”</p><p>According to Angelika Zaber, lawn care specialist and gardening expert at <a href="https://www.onlineturf.co.uk" target="_blank">Online Turf</a>, skunks typically dig 3-4-inch holes in lawns as they scratch around for grubs. And she also warns that the animals’ unpleasant sulfur-like spray can penetrate clothing or furniture that’s left outside. </p><p>If you keep livestock in your backyard, keep an eye on your coops. Zaber adds that skunks will target poultry and eat their eggs — a crime you can detect by an eggshell opened at one end, with the edges crushed inward.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X7AEQW"></div>                            </div>                            <script src="https://kwizly.com/embed/X7AEQW.js" async></script><h2 id="what-do-skunks-eat">What do skunks eat?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5751px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9SXz5d5EsyzfvDKEPbqtJ8" name="Lawn Grub main - crop.jpg" alt="Lawn grubs on soil" src="https://cdn.mos.cms.futurecdn.net/9SXz5d5EsyzfvDKEPbqtJ8.jpg" mos="" align="middle" fullscreen="" width="5751" height="3235" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Runyon explains that these black-and-white creatures are omnivores, obtaining energy and nutrients from both plant and animal matter. This leaves a whole host of opportunities for skunks in your backyard.</p><p>Apart from devouring fallen nuts and fruit in your yard, he says they’ll also knock over trash cans to find food and will wreak havoc on your lawn, digging up Japanese beetles, beetle grubs and earthworms.</p><p>What’s more, if you leave out cat and dog food for stray animals or your pets, you’re inviting skunks to tuck in.</p><h2 id="where-do-skunks-shelter">Where do skunks shelter?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nyt4WgG56tAmGvHeHBA94A" name="shutterstock_2660222301" alt="Freshly cut firewood" src="https://cdn.mos.cms.futurecdn.net/nyt4WgG56tAmGvHeHBA94A.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>While the skunks are causing havoc in your yard, rooting for food, they may also be looking for a suitable den. “This could be under your deck, your shed, your porch, or any other place where they can burrow, such as thick brush, wood piles and leaf piles,” explains Runyon.</p><p>To deter them, Zaber recommends fixing any spaces that they can call home. </p><h2 id="skunk-deterrents">Skunk deterrents</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YGEXMYn5Vy9aeXkVnmmKME" name="Fallen leaves piled up in wheel barrow" alt="Fallen leaves piled up in wheel barrow" src="https://cdn.mos.cms.futurecdn.net/YGEXMYn5Vy9aeXkVnmmKME.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>There are natural repellents you can use at home to deter skunks, although Runyon says they’re not long-term fixes. Instead, both experts recommend the following measures.</p><p><strong>1. Stop skunks from entering</strong><br>Place a big defender around your fence line to keep skunks from digging into your yard.</p><p><strong>2. Cover up your trash</strong><br>Keep the lids on your trash cans and secure them with locks if practical. If your trash can is knocked over, the contents won’t spill out if the lid is securely in place<strong>.</strong></p><p><strong>3. Reduce potential den sites</strong><br>Tidy up your backyard and remove any wood piles and leaf litter where skunks can make a den. Then, secure any other potential hideouts by closing up gaps beneath sheds and houses.  </p><p><strong>4. Protect your lawn</strong><br>Newly laid lawns are particularly attractive to skunks, as they are often well-watered and have plenty of grubs. To reduce both skunk and grub activity, apply a grub treatment and <a href="https://www.tomsguide.com/home/outdoors/garden-experts-share-the-best-time-to-water-your-lawn-and-ive-been-getting-it-all-wrong">water your lawn correctly</a>. </p><p><strong>5. Keep pet food inside</strong><br>Avoid leaving pet food outside for any length of time, and if you can feed your animals inside your house.</p><h2 id="friend-or-foe">Friend or foe?</h2><div class="instagram-embed"><blockquote class="instagram-media"  data-instgrm-version="6" style="width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><p><a href="https://www.instagram.com/p/DU6Sc1YibZ9/" target="_blank">A post shared by Back To The Wild (@backtothewildohio)</a></p><p>A photo posted by  on </p></blockquote></div><p>While you might prefer to banish skunks from your yard, <a href="https://www.backtothewild.org/" target="_blank">Back to the Wild</a>, a wildlife sanctuary in Ohio, recognizes what skunks have to offer. </p><p>In an Instagram post, the sanctuary shares, “These nocturnal neighbors help control insect and rodent populations, and they actually help protect lawns, gardens and native plant life. </p><p>"They’re shy, peaceful animals that would much rather avoid you than confront you. So if you spot a skunk wandering through your yard, don’t panic! You may have a tiny pest-control specialist working the night shift.”</p><h3 class="article-body__section" id="section-lawncare-essentials-we-love"><span>Lawncare essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="af916f1a-7c7f-11f1-a09c-27f43bc5fb61">            <a href="https://www.amazon.com/Scotts-17508/dp/B0168K936W/ref=sr_1_1_sspa?" data-model-name="Scotts Ez Seed Patch & Repair for Sun and Shade" 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/ZRWks9aKfGEVKLwPaLqmhh.jpg" alt="Scotts Ez Seed Patch & Repair for Sun and Shade - Combination Mulch, Sun and Shade Grass Seed & Fertilizer for Bare Spots & Lawn Patch Repair, Covers Up to 85 Sq. Ft., 3.75 Lb."></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Scotts Ez Seed Patch & Repair for Sun and Shade</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="af916f7e-7c7f-11f1-a92f-63a81e686be5">            <a href="https://www.amazon.com/Garden-Guru-Handheld-Spreader-Shaker/dp/B0F8P8QM3V/ref=sr_1_8?" data-model-name="Garden Guru Handheld Seed Spreader Shaker" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:82.80%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/ezrwVY6BYsgBZtBcNhMTm9.jpg" alt="Garden Guru Handheld Seed Spreader Shaker – Multi Use Grass Seed, Fertilizer, Salt, Ice & Snow Melt Spreader – Adjustable Twist Cap W Multiple Size Openings – Lightweight 1l Capacity Hand Seeder"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Garden Guru Handheld Seed Spreader Shaker</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="af916fe2-7c7f-11f1-93ac-2f665abd33fa">            <a href="https://www.amazon.com/Fiskars-339950-1002-Puller-Gardening-Removal/dp/B0030MIHAU?" data-model-name="Fiskars Stand-Up Weed Puller Tool" 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/68PWsuXsMu9y5iotDQ8BaZ.jpg" alt="Fiskars Stand-Up Weed Puller Tool, 4 Serrated Stainless Steel Claws Grip Roots for Permanent Removal, Reinforced Foot Platform Penetrates Tough Soil, Easy-Eject & Ergonomic Offset Handle, 39""></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Fiskars Stand-Up Weed Puller Tool</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="af917046-7c7f-11f1-a4cc-bdd7b4b54e18">            <a href="https://www.amazon.com/Greenworks-G-MAX-Mower-Batteries-Charger/dp/B086K59Q79/ref=sr_1_3?" data-model-name="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower" 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/8LF2UvRs8EXvmebaZefwzA.jpg" alt="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower (200+ Compatible Tools), (2) 4.0ah Batteries and Dual Port Rapid Charger Included"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/how-to/7-ways-to-get-rid-of-goundhogs-without-hurting-them">7 ways to get rid of groundhogs without hurting them</a></li><li><a href="https://www.tomsguide.com/home/3-common-backyard-bugs-that-are-actually-helping-not-hurting-your-plants">3 common backyard bugs that are actually helping — not hurting — your plants</a></li><li><a href="https://www.tomsguide.com/home/natural-ways-to-get-rid-of-aphids">7 natural aphid deterrents to prevent infestation in your yard</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The timeless gardening wisdom your grandparents swore by — and why it still works today ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/the-timeless-gardening-wisdom-your-grandparents-swore-by-and-why-it-still-works-today</link>
                                                                            <description>
                            <![CDATA[ Classic gardening wisdom from generations past remains one of the most reliable approaches to a thriving garden. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ufsjW3uJNVFGCoWfDGvZPQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/L2GQR4SxP4vcWnKVwgpBsU-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 10 Jul 2026 07:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/L2GQR4SxP4vcWnKVwgpBsU-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Gardening tools to plant outdoors]]></media:description>                                                            <media:text><![CDATA[Gardening tools to plant outdoors]]></media:text>
                                <media:title type="plain"><![CDATA[Gardening tools to plant outdoors]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/L2GQR4SxP4vcWnKVwgpBsU-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There's something wonderfully reassuring about gardening methods that have survived centuries. While modern gadgets and chemicals promise quick fixes, the approaches our grandparents relied on still deliver. </p><p>These techniques are rooted in a deep, intuitive understanding of how a garden actually grows. It is practical knowledge, proven generation after generation, that creates a truly resilient and beautiful plot. </p><p>Here are seven timeless rules worth bringing back to your garden.</p><section class="howto-block">                    <h3>1. Stagger your plantings </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/D4AinurJnFRt4N3iWDESTP.png"                                        alt="Woman sowing seeds outdoors"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/D4AinurJnFRt4N3iWDESTP.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Rather than sowing everything at once, <strong>plant new seeds every 2-3 weeks throughout the growing season</strong>. This approach transforms how much you harvest. Instead of one overwhelming glut of lettuce, beans, or carrots followed by months with nothing, you get continuous pickings from spring through fall.</p><p>You're not planting more total seeds or expanding garden space; you're just timing plantings strategically so mature crops overlap. The result is fresh vegetables available to pick for weeks longer than gardeners who dump everything in the ground simultaneously.</p></p>                </section><section class="howto-block">                    <h3>2. Direct water to the roots, not the leaves</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/srZrJgdQryVds4dhu928kZ.jpg"                                        alt="Watering tomato plants"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/srZrJgdQryVds4dhu928kZ.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Watering foliage wastes water and encourages fungal disease. The smart approach is <strong>watering at soil level and directing moisture straight to the root zone</strong> where plants actually absorb it. This minimizes waste, ensures efficient hydration, and reduces disease risk significantly.</p><p>During hot weather, consistent root-level watering prevents the stress that damages productivity. Your plants use less water and stay healthier because you're delivering it where it's needed rather than hoping it soaks in from above.</p></p>                </section><section class="howto-block">                    <h3> 3. Let autumn leaves become natural mulch</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="http://cdn.mos.cms.futurecdn.net/i4Y4JRruLtsrqK9aDSKKUn.jpg"                                        alt="Someone picking up mulch while wearing gardening gloves"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="http://cdn.mos.cms.futurecdn.net/i4Y4JRruLtsrqK9aDSKKUn.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>When fall arrives, resist the urge to rake everything away.<strong> Those fallen leaves become protective mulch that shields soil from harsh winter cold while maintaining consistent moisture levels</strong>. This keeps roots healthier and helps plants emerge stronger in spring.</p><p>Beyond winter protection, fallen leaves create habitat for beneficial insects. If you want fireflies dancing through your garden come summer, leave the leaves undisturbed from November through June. These insects need that shelter to overwinter and emerge when warmth returns.</p></p>                </section><section class="howto-block">                    <h3>4. Collect and save seeds </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/mLFpvsaGshWZXyrvvvhyKm.jpg"                                        alt="Wildflower seeds in a palm"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/mLFpvsaGshWZXyrvvvhyKm.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>This is how gardeners have improved their gardens for centuries without spending a dime. When your healthiest, most productive plants flower and set seed, allow them to mature completely. <strong>Collect the seed pods, dry them thoroughly, extract the seeds, and store them in a cool, dry place</strong> through winter.</p><p>Next spring, you're planting varieties you know perform perfectly in your specific garden. You're maintaining plants adapted to your exact soil and climate — something no store-bought seed ever guarantees. This costs nothing and connects you directly to gardening heritage.</p></p>                </section><section class="howto-block">                    <h3>5. Mix flowers and vegetables in the same beds</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/PSUw2CLaAQeZSVeUE3ALpY.jpg"                                        alt="Growing tomatoes in raised garden bed with marigolds "                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/PSUw2CLaAQeZSVeUE3ALpY.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Marigolds, zinnias, and petunias serve double duty — they're beautiful and functional. <strong>These flowers are fantastic companion plants </strong>that attract pollinators and beneficial insects that help vegetables thrive. They create a working ecosystem where nature handles much of the pest management without chemical intervention.</p></p>                </section><section class="howto-block">                    <h3>6. Don't panic over a single yellow leaf</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/zfaoEz85TF2GM8wGYYNby6.jpg"                                        alt="Wilting yellow lemon leaf"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/zfaoEz85TF2GM8wGYYNby6.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Getty Images)</div></figure>                    <p><p>Before diagnosing plant problems, step back and assess the entire picture. <strong>A single yellow leaf doesn't signal disaster</strong>. Plants naturally shed older growth as they transition between seasons and growth stages. What looks like trouble is often simply the plant doing its job, making room for vigorous new growth.</p><p><strong>Look for multiple actual signs of decline rather than reacting to isolated changes</strong>. Plants move through different phases, and minor adjustments are completely normal.</p></p>                </section><section class="howto-block">                    <h3>7. Wait for dry weather before pruning</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="http://cdn.mos.cms.futurecdn.net/K2pNV7ffbCbLtpbWj9nR6a.jpg"                                        alt="Pruning a tomato plant"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="http://cdn.mos.cms.futurecdn.net/K2pNV7ffbCbLtpbWj9nR6a.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Rain carries mold spores, and<strong> fresh pruning cuts create open wounds where fungal infections can enter and spread through the entire plant</strong>. If you want to work in wet conditions, focus on planting or weeding instead. Save pruning for dry days when wounds can seal naturally.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XkwZ6X"></div>                            </div>                            <script src="https://kwizly.com/embed/XkwZ6X.js" async></script><p><strong>What’s the single best piece of gardening wisdom you've learned? </strong>Maybe it's a quirky trick for sweeter tomatoes, a natural pest remedy, or a simple rule for reading the weather. <strong>Tell us in the comments below!</strong></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/gardening/how-to-get-endless-hollyhock-blooms-every-single-summer-with-zero-effort">How to get endless hollyhock blooms every single summer (with zero effort)</a></li><li><a href="https://www.tomsguide.com/home/lawn-care/11-secrets-to-a-lawn-thats-greener-than-your-neighbors">11 secrets to a lawn that’s greener than your neighbor's</a></li><li><a href="https://www.tomsguide.com/home/gardening/why-are-my-tomato-plant-leaves-turning-yellow-5-steps-to-save-your-harvest-clone">Double your tomato harvest — the 3-step pruning system for massive yields</a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Don't let the heatwave destroy your plants  —  expert shares 3 top tips to do right now ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/dont-let-the-heatwave-destroy-your-plants-expert-shares-3-top-tips-to-do-right-now</link>
                                                                            <description>
                            <![CDATA[ Experts urge gardeners to protect plants as the heatwave continues — here’s what you need to help them survive the summer. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">2tugcpdX4xwabmoV384AnR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/3uCnF2eB7RtPAtTzCJQ2iK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 10 Jul 2026 06:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/3uCnF2eB7RtPAtTzCJQ2iK-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[colorful flowers to plant in April]]></media:description>                                                            <media:text><![CDATA[colorful flowers to plant in April]]></media:text>
                                <media:title type="plain"><![CDATA[colorful flowers to plant in April]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/3uCnF2eB7RtPAtTzCJQ2iK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With temperatures soaring, we’re not the only ones who are feeling parched — our plants are also bearing the brunt of extreme temperatures. Beyond simply adjusting your seasonal lawn<a href="https://www.tomsguide.com/how-to/how-often-should-you-water-your-lawn-in-a-heatwave"> </a>care routine, it is vital to adopt strategies that ensure your plants can withstand the heatwave.</p><p>Whether you have favorite houseplants, raised beds, or tasty<a href="https://www.tomsguide.com/home/why-does-my-tomato-plant-have-lots-of-leaves-but-no-fruit-heres-why-and-how-to-fix-it"> </a>tomato<a href="https://www.tomsguide.com/home/why-does-my-tomato-plant-have-lots-of-leaves-but-no-fruit-heres-why-and-how-to-fix-it"> </a>plants, you’ll need to know how to protect them in scorching temperatures. If not, your plants will struggle in the sun and eventually die.  Luckily, we’ve got a gardening expert at hand to offer a few top tips that can help your plants thrive and survive the summer. </p><h3 class="article-body__section" id="section-1-water-at-the-right-time-of-day"><span>1. Water at the right time of day</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wnHxf9aRLJSnwnqGMun2S" name="shutterstock_2470178983" alt="Woman in garden watering flowerbeds" src="https://cdn.mos.cms.futurecdn.net/wnHxf9aRLJSnwnqGMun2S.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Woman in garden watering flowerbeds </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>While it might be tempting to water your plants more when the weather is scorching, timing is actually everything.</p><p>Experts advise watering your garden either in the early morning or the evening once temperatures are cooler. By watering during these cooler hours, your plants can soak up the water rather than just evaporating. </p><p>“When it comes to watering, it’s important to water deeply at the coolest points of the day,” states Chris Bonnett, founder of <a href="https://tracking.us.nylas.com/l/5ea4c3b0f3e0470db2c730782dbc7b18/0/6839ac60043968461e37229648ba459a434256aaf69af560517b5b60b89c39d7?cache_buster=1782375366" target="_blank">GardeningExpress</a>. </p><p>“If it’s too hot, the water will just evaporate, and your plants won’t benefit.”</p><p>In addition, you should aim to give the roots a deep watering, as this will be much more effective than light and frequent watering. </p><p>And if you want to retain moisture for extended periods, add a layer of mulch around the base of your plants. “Adding a generous layer of mulch at the base of your plants will help improve the soil structure and will allow the soil to retain water for longer.” </p><p>So not only does it help to retain moisture in the soil, but acts as an insulator against the sun's UV rays.  </p><p>If you want more top tips check out <a href="https://www.tomsguide.com/features/when-should-you-replace-mulch-and-why-its-essential">when you should replace mulch — and why it's essential.</a>  </p><h3 class="article-body__section" id="section-2-throw-some-shade"><span>2. Throw some shade</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5122px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="q8oXrjFgLxAy3bbKUcpstf" name="shutterstock_1015894846.jpg" alt="Plant with shade cloth" src="https://cdn.mos.cms.futurecdn.net/q8oXrjFgLxAy3bbKUcpstf.jpg" mos="" align="middle" fullscreen="" width="5122" height="2881" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Plant with shade cloth<strong> </strong> </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Another top tip is to move potted plants out of the sun and into shaded areas during the hottest part of the day. Just like us, this will provide our plants with some light relief and keep them cool. </p><p>“For plants that can’t be moved, or heavy pots, cover them with a shade cloth or make your own temporary one out of an old fitted bed sheet,” adds Bonnett.</p><p>Young or newly established plants will especially struggle in scorching temperatures —  protect them by creating temporary cover with a shade cloth. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eBjo0e"></div>                            </div>                            <script src="https://kwizly.com/embed/eBjo0e.js" async></script><h3 class="article-body__section" id="section-3-stay-away-from-fertilizers"><span>3. Stay away from fertilizers</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6014px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cW6jNwccXaUEXvzXdBbjwR" name="Fertilizing orchid - crop.jpg" alt="Fertilizing an orchid" src="https://cdn.mos.cms.futurecdn.net/cW6jNwccXaUEXvzXdBbjwR.jpg" mos="" align="middle" fullscreen="" width="6014" height="3383" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Fertilizing an orchid </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>A common mistake we often make is to add fertilizers to our wilting plants, but experts advise to steer clear of using in a heatwave.</p><p>“Stay away from fertilizing the lawn or plants during a heatwave,” agrees Bonnett. “Not only can they burn plants but fertilizers encourage new growth which can stress plants and cause them more harm than good.</p><p>Similarly, avoid pruning while the sun is at its peak. Cutting back growth now can place additional, unwanted pressure on your greenery — it is far better to hold off until the mercury begins to fall.</p><p>For more summer gardening tips, check out <a href="https://www.tomsguide.com/home/is-it-too-hot-to-plant-what-you-can-and-cant-put-in-the-ground-in-july">can you plant in a heatwave?  </a></p><h3 class="article-body__section" id="section-gardening-essentials-we-love"><span>Gardening essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="859c26c8-7b80-11f1-9090-819134560798">            <a href="https://www.amazon.com/dp/B07BD2GZW8" data-model-name="Garden Gloves" 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/YyBJP4YUpLVNV4q2yKFfjS.jpg" alt="Amazing Stuff For You green and gray gardening gloves"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazing Stuff</div>                                        <div class="featured__title">Garden Gloves</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="859c2740-7b80-11f1-b1c7-a3361474539a">            <a href="https://www.amazon.com/Felco-F-2-Classic-Manual-Pruner/dp/B00023RYS6" data-model-name="F2 Pruning Shears" 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/pVTQGL4DSUSgfk9pVKhLgm.jpg" alt="Felco 2 bypass pruners"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Felco </div>                                        <div class="featured__title">F2 Pruning Shears</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="859c27b8-7b80-11f1-b960-692c76f72ad1">            <a href="https://www.homedepot.com/pep/Corona-ComfortGEL-6-5-in-Comfort-Grip-Stainless-Steel-Hand-Trowel-CT-3214/205811685?" data-model-name="ComfortGEL 6.5 inch Stainless Steel Hand Trowel:" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:99.84%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/pFmmWavYqAu55zSSvQ7b8U.png" alt="Corona hand trowel"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corona </div>                                        <div class="featured__title">ComfortGEL 6.5 inch Stainless Steel Hand Trowel:</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="859c2830-7b80-11f1-9d9b-c1b5fdf43402">            <a href="https://www.amazon.com/Grampas-Weeder-CW-01-Original-Remover/dp/B001D1FFZA?" data-model-name="Grampa's Weeder" 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/kP7pgu2tpxz8d34HtVQgxC.jpg" alt="Grampa's Weeder The Original Stand Up Weed Puller Tool with Long Handle"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Grampa's Weeder</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/how-to/7-plants-that-will-thrive-in-the-shade">Here are 7 plants that will thrive in the shade</a> </li><li> <a href="https://www.tomsguide.com/how-to/7-uses-for-ground-cover-plants">Check out these 7 uses for ground cover plants</a> </li><li> <a href="https://www.tomsguide.com/how-to/7-ways-to-get-more-fruit-from-a-tomato-plant">Or these 7 ways to get more fruit from a tomato plant</a> </li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to keep your lawn alive in a heatwave — 4 expert tips to help it survive ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/how-to-keep-your-lawn-alive-in-a-heatwave-expert-tips-to-help-it-survive</link>
                                                                            <description>
                            <![CDATA[ Don’t let your lawn die: The experts share their secrets. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">XGS4K4WWagRJjHhRJPEzX9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DiAdTsb2yeHWduHLrd5zDh-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 09 Jul 2026 05:30:00 +0000</pubDate>                                                                                                                                <updated>Thu, 09 Jul 2026 13:41:05 +0000</updated>
                                                                                                                                            <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Lawn Care]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/DiAdTsb2yeHWduHLrd5zDh-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[grass with brown spots]]></media:description>                                                            <media:text><![CDATA[grass with brown spots]]></media:text>
                                <media:title type="plain"><![CDATA[grass with brown spots]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DiAdTsb2yeHWduHLrd5zDh-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With prolonged heatwaves and fears of drought, keeping your <a href="https://www.tomsguide.com/features/the-ultimate-lawn-care-guide-essential-tips-and-tricks-for-getting-the-perfect-lawn">lawn lush</a> and green becomes increasingly difficult as warm weather and dry conditions persist.</p><p>To help you deal with extreme summer weather without destroying your turf, I asked lawn care experts how to keep your lawn alive as temperatures rise.</p><h2 id="how-to-tell-if-your-lawn-is-heat-stressed">How to tell if your lawn is heat stressed</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:998px;"><p class="vanilla-image-block" style="padding-top:56.21%;"><img id="HUmh7LD5ASTSqwPMvTz5WD" name="Dry grass.jpg" alt="Dry grass with yellowing patches" src="https://cdn.mos.cms.futurecdn.net/HUmh7LD5ASTSqwPMvTz5WD.jpg" mos="" align="middle" fullscreen="" width="998" height="561" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Before you start treating your lawn for heat stress, you need to ensure it’s the temperature and lack of water that’s causing the problem. </p><p><strong>It changes color</strong><br>“When grass undergoes drought stress, it starts to wilt and turn blue, a bluish gray, as opposed to keeping its lush green color,” says Allison Koenig, lawn and garden expert at <a href="https://www.tractorsupply.com/" target="_blank">Tractor Supply</a>. </p><p>Craig Elworthy, founder at <a href="http://www.getlawnbright.com" target="_blank">Lawnbright</a>, agrees and says that detecting the grey or bluish tint is “your sign to get water on it now or it will likely begin to go dormant.”</p><p><strong>Try the footprint test or screwdriver test </strong><br>Another indication of water deficiency is the loss of resilience. “If you step on the grass and it leaves a footprint, it likely needs water,” says Koenig. “Under normal moisture conditions, the grass should spring back up instead of leaving traffic marks.”</p><p>If you’re still unsure, Koenig suggests trying the screwdriver test to check the soil’s moisture level. She says, “First, stick a screwdriver into the soil. This creates a small hole that will allow you to feel the soil about 3-4 inches down. If it’s hard to push the screwdriver in, it’s likely the soil is dry and in need of watering.”</p><p>If you haven’t got a screwdriver to hand, a soil probe or pocketknife will also do the trick. </p><h2 id="what-happens-to-your-lawn-when-it-s-heat-stressed">What happens to your lawn when it’s heat-stressed?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4662px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="5ea9Fy3ZJrfaBvuVpWrY4X" name="shutterstock_1129975802.jpg" alt="an image showing a thermometer during a heatwave" src="https://cdn.mos.cms.futurecdn.net/5ea9Fy3ZJrfaBvuVpWrY4X.jpg" mos="" align="middle" fullscreen="" width="4662" height="2623" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>“In a heatwave, your lawn is essentially running a marathon. It’s using all of its energy just to get through the intense heat,” says Elworthy. “This causes growth to slow down or even stop altogether.”</p><div><blockquote><p>During extreme temperatures, grass loses moisture faster than roots absorb it</p><p>Roger May, TruGreen</p></blockquote></div><p>Roger May, PhD, director of operations support at <a href="http://www.trugreen.com" target="_blank">TruGreen</a>, adds, “During extreme temperatures, grass loses moisture faster than roots absorb it.”</p><p>When coupled with a lack of water, the lawn will enter dormancy, turning brown until both temperature and moisture conditions are more favorable. </p><p>However, grass dying from heat alone is rarer than you might think. Koenig explains that the grass is redirecting its stored resources straight to the roots to survive, and that it will “green up” when more moderate conditions return. </p><h2 id="which-grass-is-better-at-coping-with-extreme-heat">Which grass is better at coping with extreme heat?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="e2Y9p8zEd4ZXdnrwJMLCJ" name="shutterstock_2475761523" alt="Bermuda grass" src="https://cdn.mos.cms.futurecdn.net/e2Y9p8zEd4ZXdnrwJMLCJ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Grasses are split into two groups — <a href="https://www.tomsguide.com/features/7-of-the-best-grass-types-to-grow-and-which-to-get">warm-season grasses and cool-season grasses</a>. Warm-season grasses are better equipped to withstand summer heatwaves, while cool-season grasses green up more quickly after winter. Your choice of grass should depend on the climate in your region.</p><p>“Bermuda grass and zoysia stand out as top performers for heat and drought in areas where warm-season grasses thrive,” says May. “These drought-resistant grasses stay vibrant while using less water and are recommended across very different hot climates — from the Western U.S. to Texas — because they tolerate scorching heat and dry spells while recovering quickly.”</p><div><blockquote><p>Their root systems develop to reach beyond a foot below the surface, tapping moisture reserves that shallow-rooted varieties can’t access</p><p>Roger May, TruGreen</p></blockquote></div><p>So, what makes these grass types able to deal with heat and drought? “Their root systems develop to reach beyond a foot below the surface, tapping moisture reserves that shallow-rooted varieties can’t access,” explains May.</p><p>He also adds that thicker leaf cells and waxy coatings reduce moisture loss, and that some varieties can still function when soil temperatures exceed 100°F.</p><p>Cool-season grasses, such as Kentucky bluegrass, fescue and ryegrass, struggle in the heat. If you are planting a cool-season grass, Elworthy recommends choosing tall fescue. “The roots can extend deep, away from the sun’s harsh rays.” </p><p>What’s more, he adds that fescue requires less water and fertilizer than other grass types. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eG0N2W"></div>                            </div>                            <script src="https://kwizly.com/embed/eG0N2W.js" async></script><h3 class="article-body__section" id="section-how-to-care-for-your-lawn-in-a-heatwave"><span>How to care for your lawn in a heatwave</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="htmzXZseCVDhmQMcstuTCD" name="shutterstock_2153772541edit.jpg" alt="Man adjusting the blade length on a lawnmower" src="https://cdn.mos.cms.futurecdn.net/htmzXZseCVDhmQMcstuTCD.jpg" mos="" align="middle" fullscreen="" width="1800" height="1013" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>When it comes to caring for your lawn in a heatwave, the best advice is less is more.</p><h2 id="1-raise-the-height-of-your-lawnmower">1. Raise the height of your lawnmower</h2><p>“As the temperature rises, so should your lawn height,” says Koenig. “I recommend keeping cool-season grass 3 or 3.5 inches long in the summer, or up to 4 inches for tall fescue and perennial ryegrass. Warm-season grasses should be kept shorter, around 2 to 2.5 inches.”</p><p>So why should the grass be left longer in a heatwave? According to Koenig, cutting too low exposes more soil, and in the summer, this leads to more moisture loss. “If you keep your blades slightly taller, your lawn is more protected from heat stress and weeds. This small adjustment can significantly improve drought resilience,” she explains.</p><p><strong>Top tip: Follow the one-third rule</strong><br>When mowing your lawn during a heatwave, Koenig advises never to remove more than one-third of the leaf tissue or blade at a time, as it’s where the plant’s food production occurs.  </p><h2 id="2-leave-grass-clippings-on-your-lawn">2. Leave grass clippings on your lawn</h2><p>Rather than removing the grass clippings to create a tidy lawn, Chrisie Handley, lawncare specialist at <a href="http://www.onlineturf.co.uk" target="_blank">Online Turf</a>, suggests leaving them in place to act as a natural mulch. “They shade the ground, reduce water loss, and deliver a natural nitrogen boost as they break down,” she says. </p><h2 id="3-water-deeply">3. Water deeply</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4706px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JLSEkUR5bhJVddFaYho297" name="shutterstock_549857050.jpg" alt="A sprinkler system watering the lawn" src="https://cdn.mos.cms.futurecdn.net/JLSEkUR5bhJVddFaYho297.jpg" mos="" align="middle" fullscreen="" width="4706" height="2647" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>A light sprinkle of water isn’t going to help your lawn, as it will encourage a shallow root system, which is more likely to burn out.</p><p>Instead, Handley recommends watering deeply for an extended period of time to promote healthier, more stable root systems. “The stronger and more stable the plant, the better chance it has of surviving drought conditions in the future,” she explains.</p><p><strong>Top tip: The best time of day to water</strong><br>Your grass will also thank you for being watered in the morning, avoiding the midday heat and the subsequent evaporation before the water reaches the roots. </p><h2 id="4-avoid-fertilizer">4. Avoid fertilizer</h2><p>Although your lawn may look like it needs nutrients, applying fertilizer in a heatwave should be avoided. Koenig explains, “Fertilizer will scorch your grass in extreme heat and damage its root system. Your lawn is already trying to conserve water during a heatwave, so extra stress will only compound the damage.”</p><h3 class="article-body__section" id="section-lawncare-essentials-we-love"><span>Lawncare essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="c7973972-7adc-11f1-ad41-31255e5cfee8">            <a href="https://www.amazon.com/Scotts-17508/dp/B0168K936W/ref=sr_1_1_sspa?" data-model-name="Scotts Ez Seed Patch & Repair for Sun and Shade" 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/ZRWks9aKfGEVKLwPaLqmhh.jpg" alt="Scotts Ez Seed Patch & Repair for Sun and Shade - Combination Mulch, Sun and Shade Grass Seed & Fertilizer for Bare Spots & Lawn Patch Repair, Covers Up to 85 Sq. Ft., 3.75 Lb."></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Scotts Ez Seed Patch & Repair for Sun and Shade</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="c79739e0-7adc-11f1-af97-8919dc53b4fe">            <a href="https://www.amazon.com/Garden-Guru-Handheld-Spreader-Shaker/dp/B0F8P8QM3V/ref=sr_1_8?" data-model-name="Garden Guru Handheld Seed Spreader Shaker" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:82.80%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/ezrwVY6BYsgBZtBcNhMTm9.jpg" alt="Garden Guru Handheld Seed Spreader Shaker – Multi Use Grass Seed, Fertilizer, Salt, Ice & Snow Melt Spreader – Adjustable Twist Cap W Multiple Size Openings – Lightweight 1l Capacity Hand Seeder"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Garden Guru Handheld Seed Spreader Shaker</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="c7973a44-7adc-11f1-8dc0-03a8d9569f61">            <a href="https://www.amazon.com/Fiskars-339950-1002-Puller-Gardening-Removal/dp/B0030MIHAU?" data-model-name="Fiskars Stand-Up Weed Puller Tool" 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/68PWsuXsMu9y5iotDQ8BaZ.jpg" alt="Fiskars Stand-Up Weed Puller Tool, 4 Serrated Stainless Steel Claws Grip Roots for Permanent Removal, Reinforced Foot Platform Penetrates Tough Soil, Easy-Eject & Ergonomic Offset Handle, 39""></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Fiskars Stand-Up Weed Puller Tool</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="c7973aa8-7adc-11f1-bc5d-5ba47b0c8d98">            <a href="https://www.amazon.com/Greenworks-G-MAX-Mower-Batteries-Charger/dp/B086K59Q79/ref=sr_1_3?" data-model-name="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower" 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/8LF2UvRs8EXvmebaZefwzA.jpg" alt="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower (200+ Compatible Tools), (2) 4.0ah Batteries and Dual Port Rapid Charger Included"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/home/what-is-xeriscaping-how-this-clever-landscaping-trend-can-save-your-yard-in-a-heatwave">What is xeriscaping? How this clever landscaping trend can save your yard in a heatwave</a></li><li><a href="https://www.tomsguide.com/home/best-drought-resistant-plants-for-your-yard">9 drought-resistant plants that will thrive in your yard during the hot, dry summer</a></li><li><a href="https://www.tomsguide.com/home/gardener-reveals-centuries-old-hack-for-keeping-plants-hydrated-in-the-summer">Gardener reveals ‘centuries-old’ hack for keeping plants hydrated in the summer</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 essential tips to help your hydrangeas survive a heatwave ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/3-essential-tips-to-help-your-hydrangeas-survive-a-heatwave</link>
                                                                            <description>
                            <![CDATA[ Is the heatwave killing your hydrangeas? 3 tips to help them survive ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">iytmZBCPGavdtXCcTdJAjc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mmJk7Vu7dFdrw85vxnj9Za-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 08 Jul 2026 12:31:35 +0000</pubDate>                                                                                                                                <updated>Wed, 08 Jul 2026 12:31:56 +0000</updated>
                                                                                                                                            <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/mmJk7Vu7dFdrw85vxnj9Za-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Colorful pink and maeve hydrangeas in bloom]]></media:description>                                                            <media:text><![CDATA[Colorful pink and maeve hydrangeas in bloom]]></media:text>
                                <media:title type="plain"><![CDATA[Colorful pink and maeve hydrangeas in bloom]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mmJk7Vu7dFdrw85vxnj9Za-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Hydrangeas are my favorite flower, and I take great pride in having a row of these delicate beauties in my front yard. In fact, they have been known to turn a few of my neighbors’ heads as they walk by.</p><p>I usually find them easy to care for, if I water them consistently and prune them when needed, but just right now, they are becoming more of a challenge. As we experience heatwave after heatwave, I’m struggling to keep them from drooping and taking pride of place in my front yard. </p><p>But, luckily, keeping your hydrangeas thriving in the heat isn’t complicated. It all comes down to three rules. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XkGD6X"></div>                            </div>                            <script src="https://kwizly.com/embed/XkGD6X.js" async></script><h2 id="1-water-deeply">1. Water deeply</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="4XWNwP3Z4dDBvo53TS6cGB" name="shutterstock_2040574394EDIT.jpg" alt="Hydrangeas being watered with a watering can" src="https://cdn.mos.cms.futurecdn.net/4XWNwP3Z4dDBvo53TS6cGB.jpg" mos="" align="middle" fullscreen="" width="1800" height="1013" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Hydrangeas love water, which means long, hot, dry summers can make it challenging to keep them perky. And the extreme weather can stress and damage the plants. Although burnt leaves won’t recover from the damage, your plant can still survive.</p><p>The trick is to water deeply, right down to the roots, rather than merely on the surface, where water evaporates. A soaker hose or watering bag that applies a slow drip around the base of the plant is a good idea. Whereas a general garden hose won’t work quite so well.</p><p><strong>Top tip: </strong>Newer plants will need more frequent watering than older, established plants that have deeper roots.</p><h2 id="2-water-at-the-right-time-of-day">2. Water at the right time of day</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oPVqxQfjFNbJksaELX48nS" name="shutterstock_2288817005" alt="White hydrangea" src="https://cdn.mos.cms.futurecdn.net/oPVqxQfjFNbJksaELX48nS.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Whether you are watering hydrangeas or any other type of plant, the key is getting the timing right. During a heatwave or any period of hot weather, avoid watering your hydrangeas at the hottest time of day, often midday.</p><p>Early-morning watering is the best method. There is plenty of time for the water to be absorbed down to the roots before the sun dries it up and potentially scorches wet leaves.</p><p>However, I find this routine quite tough because I’m not up with the lark. So, I swap my watering routine to the early evening, leaving enough time for the plants to dry out before nightfall.</p><h2 id="3-don-t-overwater">3. Don't overwater</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="ZFx8QDSBVCkMZJdTLbdAGm" name="shutterstock_2105857091edit.jpg" alt="Strawberry pink hydrangea paniculata" src="https://cdn.mos.cms.futurecdn.net/ZFx8QDSBVCkMZJdTLbdAGm.jpg" mos="" align="middle" fullscreen="" width="1800" height="1013" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Be mindful not to overwater your hydrangeas, as excess water can lead to root rot and fungal diseases. A good plan is to use a soil moisture meter before watering to make sure you’re not giving your hydrangeas too much or too little water.  </p><p>Alternatively, you can place a finger two inches into the soil. If it feels dry, your plant needs a deep watering. Then return to your plant later in the day or the next morning if you watered it in the evening, and see if the plant remains wilted. If so, it needs another drink. </p><p><strong>Top tip: </strong>If your hydrangeas grow in pots, they will need more watering, as the soil will dry out more quickly than those planted in the ground.</p><h3 class="article-body__section" id="section-gardening-watering-essentials-we-love"><span>Gardening watering essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="c3241898-7a0e-11f1-9c72-ef43295db45d">            <a href="https://www.amazon.co.uk/dp/B0B7LMBHGQ?" data-model-name="Rain Gauge Outdoor, 7"" 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/9tg2fJfvgkE3grMsNYVU7L.jpg" alt="Hobyluby Rain Gauge Outdoor, 7 Inch Rain Gauges for Measuring Precipitation, Garden Yard Decor"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>HOBYLUBY</div>                                        <div class="featured__title">Rain Gauge Outdoor, 7"</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="c3241a28-7a0e-11f1-b199-5d19c982f6dd">            <a href="https://www.amazon.com/Qilebi-Watering-Removable-Stainless-Sprinkler/dp/B0BN2T87DY/ref=sr_1_7?dib=eyJ2IjoiMSJ9.BQwmZOmIN3ah4NaG8y9uun0YIkvTunRaoeR2c3x4MOzJxhf-7vpNNYlXQ56jv_q5o6wpnJ04-Ms1lieGc30ewVlBMsbU9FH_8v1nvUpiOdV-NNL-hney7-v2yo19rsIkPmKnHcLl7JfEtyYKRmYsF4VpXiLdwvIrCoWhM0x0IUHVfgmNeXd4y2YO_ryVO9nn9Uawcqd6CBJMZkR_4fXbp0vLQVNH2z0grz1ED8TWDyYftA-DN25FXuUr5J2OQtwtDCZb-kTFraPxYvS6Bk14ejYJ2siE3y8imRsRwEs6UoA.jHTgr5ft7E-D7VF-LVNzEl6WIuwKW6g1RAPVvtxv-J8&dib_tag=se&keywords=watering%2Bcans&qid=1781014473&sr=8-7&th=1" data-model-name="2 Gallon Watering Can" 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/z27aZSuNKziTx22mMEpHGW.jpg" alt="2 Gallon Watering Can, Garden Watering Can Outdoor, Plant Water Can With Removable Long Spout and Stainless Steel Sprinkler Head, Large Plastic Outdoor Watering Cans for Gardening Flower Plants"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Qilebi</div>                                        <div class="featured__title">2 Gallon Watering Can</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="c3241aaa-7a0e-11f1-84b4-83b9a0592c19">            <a href="https://www.amazon.com/Flexi-Hose-Function-Nozzle-50FT/dp/B0DZR7VRHL/ref=sr_1_3_sspa?" data-model-name="Expandable Garden Hose with 8 Function Nozzle, 50ft" 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/9m3GKeFbvcxDuZYngMgPic.jpg" alt="Flexi Hose Expandable Garden Hose With 8 Function Nozzle, 50ft - Lightweight Retractable Garden Hose, Water Hose - No-Kink Flexibility, 3/4 Inch Solid Brass Fittings and Double Latex Core"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Flexi Hose</div>                                        <div class="featured__title">Expandable Garden Hose with 8 Function Nozzle, 50ft</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="c3241b2c-7a0e-11f1-af9d-ff700aa2502e">            <a href="https://www.amazon.com/Gardena-Adjustable-Oscillating-Sprinkler-sprinklers/dp/B07YSTB5K4/ref=sr_1_3?" data-model-name="Aquazoom Oscillating Outdoor Sprinkler, up to 3800 sq ft" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:45.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/DNyLz9MGeS3kSyJWcuvRCA.jpg" alt="Gardena 20570 | Up to 3800 Sq Ft - Aquazoom Adjustable Oscillating Yard Sprinkler, for Watering Large Area Lawn and Garden. Aquazoom Outdoor Oscillating Sprinkler Has Wide Heavy Duty Base."></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Gardena</div>                                        <div class="featured__title">Aquazoom Oscillating Outdoor Sprinkler, up to 3800 sq ft</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/home/when-do-hydrangeas-flower-we-asked-gardening-experts">When do hydrangeas flower? We asked gardening experts</a></li><li><a href="https://www.tomsguide.com/home/stop-buying-new-hydrangeas-theres-a-simple-hack-to-multiply-your-plants-for-free">Stop buying new hydrangeas — there’s a simple hack to multiply your plants for free</a></li><li><a href="https://www.tomsguide.com/home/the-compact-shrub-is-secretly-replacing-hydrangeas-for-better-fragrance-and-easier-care-i-think-its-a-winner">The compact shrub is secretly replacing hydrangeas for better fragrance and easier care (I think it’s a winner)</a></li></ul><h2 id=""></h2>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Why does my tomato plant have lots of leaves but no fruit? Here’s why and how to fix it ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/why-does-my-tomato-plant-have-lots-of-leaves-but-no-fruit-heres-why-and-how-to-fix-it</link>
                                                                            <description>
                            <![CDATA[ Do your tomato plants have more leaves but no fruit? You could be making these three mistakes. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LrqpeQFcWm9xTap6yJgrcK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/UFB2o7HwSJud7AywrZAb7A-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 08 Jul 2026 08:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 09 Jul 2026 10:14:23 +0000</updated>
                                                                                                                                            <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/UFB2o7HwSJud7AywrZAb7A-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Curling tomato plant]]></media:description>                                                            <media:text><![CDATA[Curling tomato plant]]></media:text>
                                <media:title type="plain"><![CDATA[Curling tomato plant]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/UFB2o7HwSJud7AywrZAb7A-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Nothing beats the taste of <a href="https://www.tomsguide.com/home/im-going-to-be-trying-these-top-4-tips-to-get-my-tomatoes-tasting-as-if-they-were-grown-in-italy-after-an-italian-farmer-shared-why-i-shouldnt-rush-the-land">homegrown tomatoes</a> — freshly picked off the vine and thrown straight into your tasty meals. And even though these crops are considered the easiest to grow, it can be disappointing when you end up with more lush foliage than fruit. </p><p>This is especially true when you were looking forward to a juicy, flavorful harvest this summer. If your plants aren't producing, don't despair — there are several reasons behind your missing fruit and simple ways to get your crops back on track.</p><p>So, if you find yourself struggling with a plant that is all foliage and no fruit, these are the three most common pitfalls you might be making. Plus simple tips to ensure a bountiful harvest.</p><h3 class="article-body__section" id="section-1-choose-the-right-variety-for-your-climate"><span>1. Choose the right variety for your climate</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:7939px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QjJyeJokzL9ex2ZtfbhkfS" name="Tomato seeds - crop.jpg" alt="Choosing tomato seeds" src="https://cdn.mos.cms.futurecdn.net/QjJyeJokzL9ex2ZtfbhkfS.jpg" mos="" align="middle" fullscreen="" width="7939" height="4466" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Choosing tomato seeds </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>One key factor behind your lack of tomato harvest could be your climate. Typically, tomatoes thrive in temperatures between 75 and 95 degrees Fahrenheit.  And if your planting area is either too hot or too cool, your crops will struggle to flower properly, resulting in a disappointing lack of fruit. </p><p>If your plants continue to struggle with flowering and you haven’t seen any fruit in months, try switching to another variety that is more suited to your local weather conditions. </p><p>For those living in the sun-drenched South, choosing heat-tolerant types like Buffalosun, Cherokee Purple, Stellar, or Pink Delicious can help you secure a flavorful harvest. </p><p>Those in colder regions with limited summer windows should opt for hardy varieties such as Washington Cherry, Legend, and Sub-Arctic Plenty to ensure their plants thrive.</p><p>In addition, tomato flowers tend to self-pollinate once the flower opens. If the weather conditions are affected by excessive heat, cold, or moisture levels, the pollen from the male parts of the flower may not reach the female parts — affecting development. </p><p>One pro tip is to try giving your tomato stems a light shake as soon as the first blossoms come through, as this simple trick can help promote better fruit set.</p><p>For more planting tips, check out <a href="https://www.tomsguide.com/home/gardening/toms-guide-to-tomatoes">Tom's Guide to tomatoes</a> for everything you need to know about growing a juicy harvest. </p><h3 class="article-body__section" id="section-2-give-your-tomatoes-enough-sun"><span>2. Give your tomatoes enough sun </span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2100px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="UPyx4JVFD9VPZ6gEZRzfoe" name="shutterstock_2418243471 tomato" alt="Growing tomatoes in raised garden bed with marigolds" src="https://cdn.mos.cms.futurecdn.net/UPyx4JVFD9VPZ6gEZRzfoe.jpg" mos="" align="middle" fullscreen="" width="2100" height="1181" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Growing tomatoes in raised garden bed with marigolds  </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Tomatoes are sun-loving plants and need at least 6-8 hours of direct sunlight daily to help them produce more fruit. Without adequate sunshine, plants struggle to photosynthesize, and they will lack the energy to thrive.</p><p>As a result, this leads to tall, spindly growth, producing very few flowers and a sparse harvest of tomatoes to enjoy.</p><p>What’s more, low-light conditions are known to produce <a href="https://www.tomsguide.com/home/why-are-my-homegrown-tomatoes-not-tasty-enough-i-asked-the-experts">watery, bland fruit</a> that lacks sweetness. So if you want to ensure juicy and flavorful fruit all season, let it soak up enough sun. </p><p>If you’re growing tomatoes in pots, it might be best to relocate them to a sunnier area in the home, and monitor the sun’s movement during growing season.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OLQ7gX"></div>                            </div>                            <script src="https://kwizly.com/embed/OLQ7gX.js" async></script><h3 class="article-body__section" id="section-3-watering-tomatoes-properly"><span>3. Watering tomatoes properly</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:692px;"><p class="vanilla-image-block" style="padding-top:56.21%;"><img id="hyaBvfANeJWRwWMXUpLPgM" name="Watering tomato plant - crop.jpg" alt="Watering tomato plant" src="https://cdn.mos.cms.futurecdn.net/hyaBvfANeJWRwWMXUpLPgM.jpg" mos="" align="middle" fullscreen="" width="692" height="389" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Watering tomato plant </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>While the summer heat might tempt you to reach for the hose more often, overwatering or under-watering your tomatoes can result in poor growth, wilting, and a lack of flowers and fruit.  </p><p>The general rule of thumb is to water deeply and consistently when the top two inches of soil begin to dry.  You can always check the soil for dryness before watering again with a water meter.</p><p>Plus, you’ll want to ensure your soil is kept in a healthy condition, free from disease or root rot, often triggered by overwatering. So a top tip is to add a rich, organic fertilizer like a layer of mulch around the base of the plants. Not only will it provide essential nutrients, but can act as a weed barrier, and prevent disease. </p><p>To get more out of your harvest this summer, check out<a href="https://www.tomsguide.com/home/gardening/when-to-fertilize-your-tomatoes-and-how-to-get-a-bountiful-harvest"> when to fertilize tomatoes: the 3-step schedule for a bountiful harvest.</a></p><div class="product"><a data-dimension112="62f725bc-7a01-11f1-9503-8d449ace6962" data-action="Deal Block" data-label="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension48="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension25="$23" href="https://www.amazon.co.uk/Luster-Leaf-1601-Rapitest-Soil/dp/B0000DI845/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:709px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="BTuEKLuVH5pLwYnLD7sqmZ" name="Luster Leaf Soil Test Kit" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BTuEKLuVH5pLwYnLD7sqmZ.jpg" mos="" align="middle" fullscreen="" width="709" height="709" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash. <a class="view-deal button" href="https://www.amazon.co.uk/Luster-Leaf-1601-Rapitest-Soil/dp/B0000DI845/" target="_blank" rel="nofollow" data-dimension112="62f725bc-7a01-11f1-9503-8d449ace6962" data-action="Deal Block" data-label="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension48="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension25="$23">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/how-to/how-often-should-you-water-tomato-plants">How often should you water tomato plants and when should you do it?</a></li><li><a href="https://www.tomsguide.com/home/when-to-pick-tomatoes-off-the-vine">3 ways to tell that your tomatoes are ready to harvest</a></li><li><a href="https://www.tomsguide.com/how-to/7-ways-to-get-more-fruit-from-a-tomato-plant">7 ways to increase the yield from your tomato plants</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 reasons why your rose leaves are turning yellow (and how to fix them) ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/5-reasons-why-your-rose-leaves-are-turning-yellow-and-how-to-fix-them</link>
                                                                            <description>
                            <![CDATA[ Rose leaves turning yellow? 5 common causes and how to get them ‘blooming lovely’ again. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7RiVbScGontJVyAfSRSkLj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/AbgRGggbE8KLNekSnLE634-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 08 Jul 2026 05:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/AbgRGggbE8KLNekSnLE634-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Mid-pink roses in full bloom]]></media:description>                                                            <media:text><![CDATA[Mid-pink roses in full bloom]]></media:text>
                                <media:title type="plain"><![CDATA[Mid-pink roses in full bloom]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/AbgRGggbE8KLNekSnLE634-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There’s nothing more frustrating for a gardener than watching a vibrant and thriving plant change appearance. What was once a spectacle to be admired can quickly change to a specimen that looks lackluster and distressed.</p><p>If you’ve ever grown roses in your yard, you may have experienced the same effect. Those once-beautiful showstoppers, with a fragrant scent and glossy leaves, can quickly succumb to all sorts of issues, leaving you with a rose shrub with yellowing leaves.</p><p>While the problem is not insurmountable, the challenge lies in pinpointing what has caused your rose leaves to turn yellow, and then knowing how to put it right. Here I break down the likely culprits and share how to fix those yellow leaves</p><h2 id="1-the-watering-is-off-balance">1. The watering is off balance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ePbFXXPrhRVe8FcFdVoc6" name="shutterstock_2099691439" alt="Watering roses with a hose" src="https://cdn.mos.cms.futurecdn.net/ePbFXXPrhRVe8FcFdVoc6.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>If you’ve noticed the leaves on your rose bush have turned yellow, it could be a sign that the plant is under- or overwatered. You can check if the plant is too dry by placing a finger into the soil. If the top couple of inches feel dry, it needs a drink. </p><p>However, it could also mean the plant is too wet. If this is the case, you might also notice the soil is soggy, the leaves are wilting, and there is a musty odor. </p><p>The trick is getting the balance right. Roses are best planted in well-draining soil; however, if the soil is sandy, it will drain much more quickly, and your plant will need more frequent watering. </p><p>Roses will appreciate a good, long drink at their roots rather than short, frequent waterings on their leaves. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exVYKO"></div>                            </div>                            <script src="https://kwizly.com/embed/exVYKO.js" async></script><h2 id="2-the-rose-lacks-nutrients">2. The rose lacks nutrients</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5990px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="nXg4krNqsxCfzsV7L8Fcug" name="soil testing - crop.jpg" alt="Testing soil PH" src="https://cdn.mos.cms.futurecdn.net/nXg4krNqsxCfzsV7L8Fcug.jpg" mos="" align="middle" fullscreen="" width="5990" height="3369" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>In some instances, your rose may be lacking nutrients. If this is the case, you’ll notice the leaf veins turn green, and the rest of the leaf turns yellow.</p><p>It’s wise to do a soil pH test before adding any amendments, as roses require slightly acidic soil, around 6.0-6.5. If your soil falls outside this range, your roses won’t be able to absorb the phosphorus, iron and potassium they need. </p><p>You can amend the soil with iron chelates or a nitrogen-rich fertilizer. </p><h2 id="3-it-s-crying-out-for-sunlight">3. It’s crying out for sunlight</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LxLEtQ7NmxiuZvC2ApDXrc" name="shutterstock_2457395181edit" alt="Mixed variety of roses in bloom" src="https://cdn.mos.cms.futurecdn.net/LxLEtQ7NmxiuZvC2ApDXrc.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Roses love 6 to 8 hours of sunlight a day, so if they aren’t getting their full quota, their leaves may turn yellow. If you are buying new roses, check the planting guidelines to ensure you’re placing them in the best position. </p><p>However, although roses aren’t known to love the shade, some will do fine without full sun, just choose carefully before you buy.</p><h2 id="4-pests-are-sucking-the-sap">4. Pests are sucking the sap</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="ZgXH42uPA62VYb5zbUE6g6" name="shutterstock_1820045774edit.jpg" alt="Spider mites on a dark purple rose" src="https://cdn.mos.cms.futurecdn.net/ZgXH42uPA62VYb5zbUE6g6.jpg" mos="" align="middle" fullscreen="" width="1800" height="1012" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>There is an array of pests that can suck the sap from roses, removing nutrients and turning the leaves yellow. Spider mites, aphids and thrips are all culprits. So, if you notice yellowing leaves on your roses, check the underside of the plant’s leaves for pests/ </p><p>Aphids and spider mites can be dislodged with a hose spray, while thrips can be removed by hand. You can also spray neem oil on the plants, but wait for a cool day without much sun. </p><h2 id="5-black-spot-can-take-a-hold-on-your-plants">5. Black spot can take a hold on your plants</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="okBtG5dbjhEqimLMzmAKcP" name="shutterstock_2233545763edit.jpg" alt="Black spot showing on rose foliage" src="https://cdn.mos.cms.futurecdn.net/okBtG5dbjhEqimLMzmAKcP.jpg" mos="" align="middle" fullscreen="" width="1800" height="1013" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Roses are susceptible to black spot, a common fungal infection that causes the upper leaf surface to turn yellow and develop black or purple spots. Badly affected plants can shed almost all of their leaves, and the plant’s vigor is greatly affected.</p><p>The disease can only be controlled, not cured. Remove any infected leaves on or surrounding the plant. Clean and sanitize your <a href="https://www.tomsguide.com/best-picks/best-pruning-shears">pruning shears</a> between each cut to prevent reinfection, and water at ground level at the beginning of the day to ensure everything is dry before night time.  You can also use a fungicide spray on your roses.</p><h3 class="article-body__section" id="section-gardening-essentials-we-love"><span>Gardening essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="6b75611a-7a04-11f1-9130-21265b62c575">            <a href="https://www.amazon.com/Felco-F-2-Classic-Manual-Pruner/dp/B00023RYS6" data-model-name="F2 Pruning Shears" 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/pVTQGL4DSUSgfk9pVKhLgm.jpg" alt="Felco 2 bypass pruners"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Felco </div>                                        <div class="featured__title">F2 Pruning Shears</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="6b75619c-7a04-11f1-8957-33d89412edc4">            <a href="https://www.amazon.com/dp/B07BD2GZW8" data-model-name="Garden Gloves" 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/YyBJP4YUpLVNV4q2yKFfjS.jpg" alt="Amazing Stuff For You green and gray gardening gloves"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazing Stuff</div>                                        <div class="featured__title">Garden Gloves</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="6b75620a-7a04-11f1-892f-016d6fc76ace">            <a href="https://www.homedepot.com/pep/Corona-ComfortGEL-6-5-in-Comfort-Grip-Stainless-Steel-Hand-Trowel-CT-3214/205811685?" data-model-name="ComfortGEL 6.5 inch Stainless Steel Hand Trowel:" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:99.84%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/pFmmWavYqAu55zSSvQ7b8U.png" alt="Corona hand trowel"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corona </div>                                        <div class="featured__title">ComfortGEL 6.5 inch Stainless Steel Hand Trowel:</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="6b756278-7a04-11f1-bdca-193d614451d4">            <a href="https://www.amazon.com/CobraHead-Original-Weeder-Cultivator-Garden/dp/B000JKONAO?" data-model-name="Original Weeder & Cultivator" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/mirzspDUf8CHRjFi7cBSuH.jpg" alt="Cobrahead® Original Weeder & Cultivator Garden Hand Tool - Forged Steel Blade - Recycled Plastic Handle - Ergonomically Designed for Digging, Edging & Planting - Gardeners Love Our Most Versatile Tool"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>CobraHead</div>                                        <div class="featured__title">Original Weeder & Cultivator</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/home/gardening/7-expert-tips-to-grow-the-perfect-roses-this-summer">7 expert tips to grow the perfect roses this summer</a></li><li><a href="https://www.tomsguide.com/home/outdoors/best-fragrant-hedge-plants-to-keep-your-yard-fresh-this-summer-and-beyond">The 7 best fragrant hedge plants to keep your yard fresh this summer and beyond</a></li><li><a href="https://www.tomsguide.com/home/gardening/drooping-hydrangeas-try-these-5-tricks-to-perk-them-up-fast">Drooping hydrangeas? Try these 5 tricks to perk them up fast</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Want to keep your garden alive in a heatwave? This clever landscaping trend could be the answer ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/what-is-xeriscaping-how-this-clever-landscaping-trend-can-save-your-yard-in-a-heatwave</link>
                                                                            <description>
                            <![CDATA[ Will xeriscaping save your yard in a heatwave? What you need to know. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">HQjawZ3nGDmfexLDYF4A6G</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/gp38WYJ8xsNTDvQQ4AtCRm-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 07 Jul 2026 11:11:30 +0000</pubDate>                                                                                                                                <updated>Mon, 13 Jul 2026 13:18:26 +0000</updated>
                                                                                                                                            <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/gp38WYJ8xsNTDvQQ4AtCRm-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Xeriscaping garden]]></media:description>                                                            <media:text><![CDATA[Xeriscaping garden]]></media:text>
                                <media:title type="plain"><![CDATA[Xeriscaping garden]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/gp38WYJ8xsNTDvQQ4AtCRm-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you’re dreaming of a lush green lawn, you might wake up to discover a nightmare. That perfectly manicured lawn is likely to be looking a little sadder this year as the <a href="https://www.tomsguide.com/home/is-the-heatwave-turning-your-grass-brown-an-expert-recommends-watering-your-lawn-the-wimbledon-way">heatwave takes hold</a>. </p><p>Scorching heat and limited rainfall mean that even the most dedicated gardeners will struggle to keep their lawns immaculate at the moment. Besides, when water is scarce, we need to be cautious about how much we use in our yards. </p><p>As the effects of climate change take hold, it certainly seems the right time to reconsider how we plant out our yards. Instead of opting for thirsty grasses and flowers in our beds, the sensible option is to adapt to the environment. </p><p>And this is exactly what gardeners in Colorado are doing. They are turning to xeriscaping, a form of landscaping that favors native plants, which require less water to keep their yards looking lush. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eBz0me"></div>                            </div>                            <script src="https://kwizly.com/embed/eBz0me.js" async></script><h2 id="what-is-xeriscaping">What is xeriscaping?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5463px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Lz2j4XUEFdQGrCJAZKuKJk" name="shutterstock_1879966267.jpg" alt="Gravel path in garden" src="https://cdn.mos.cms.futurecdn.net/Lz2j4XUEFdQGrCJAZKuKJk.jpg" mos="" align="middle" fullscreen="" width="5463" height="3073" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shuttestock)</span></figcaption></figure><p>Xeriscaping was coined by Denver’s Water Department in the 1980s to support drought-tolerant plants, efficient irrigation, and soil improvements to create low-maintenance yards. And as Denver is the capital of Colorado’s arid region, it had good reason to instigate this approach.</p><p>According to <a href="https://engagement.source.colostate.edu/xeriscaping-beginners-guide-drought-tolerant-landscaping/" target="_blank">Colorado State University,</a> this form of landscaping could lower outdoor water use by 30-50%, while cutting monthly water bills.</p><p>Xeriscaping is based on seven principles, which essentially refer to ‘dry-scaping’. A method for cultivating a yard that uses as little water as possible while still maintaining a pleasing, eco-friendly aesthetic. </p><div class="product"><a data-dimension112="e8440db6-7b69-11f1-b18a-1920c66a88f4" data-action="Deal Block" data-label="These high-quality, Swiss-made pruners have a hardened steel blade capable of cutting 0.8 inches of material. The smooth, red handle is ergonomically designed to provide comfort while cutting. These pruners are ideal for medium-sized hands." data-dimension48="These high-quality, Swiss-made pruners have a hardened steel blade capable of cutting 0.8 inches of material. The smooth, red handle is ergonomically designed to provide comfort while cutting. These pruners are ideal for medium-sized hands." data-dimension25="$64" href="https://www.amazon.com/Felco-Pruning-Shears-Performance-One-Hand/dp/B0001IOYX0?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:404px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="eCn8NbEhnnAKTiiHM5vTTf" name="Screenshot-2024-06-07-144645edit.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/eCn8NbEhnnAKTiiHM5vTTf.jpg" mos="" align="middle" fullscreen="" width="404" height="404" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These high-quality, Swiss-made pruners have a hardened steel blade capable of cutting 0.8 inches of material. The smooth, red handle is ergonomically designed to provide comfort while cutting. These pruners are ideal for medium-sized hands.<a class="view-deal button" href="https://www.amazon.com/Felco-Pruning-Shears-Performance-One-Hand/dp/B0001IOYX0?" target="_blank" rel="nofollow" data-dimension112="e8440db6-7b69-11f1-b18a-1920c66a88f4" data-action="Deal Block" data-label="These high-quality, Swiss-made pruners have a hardened steel blade capable of cutting 0.8 inches of material. The smooth, red handle is ergonomically designed to provide comfort while cutting. These pruners are ideal for medium-sized hands." data-dimension48="These high-quality, Swiss-made pruners have a hardened steel blade capable of cutting 0.8 inches of material. The smooth, red handle is ergonomically designed to provide comfort while cutting. These pruners are ideal for medium-sized hands." data-dimension25="$64">View Deal</a></p></div><h2 id="the-7-principles-of-xeriscaping">The 7 principles of xeriscaping</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2421px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="7RGzXMKvdoG5E6kb78B3ud" name="shutterstock_58529236 (1).jpg" alt="Cacti plants" src="https://cdn.mos.cms.futurecdn.net/7RGzXMKvdoG5E6kb78B3ud.jpg" mos="" align="middle" fullscreen="" width="2421" height="1362" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p><strong>1. Plan your design</strong></p><p>Understand your site and match the right plant to the right place. Check the properties of your soil, sun exposure and water flow across your property. Once you have this knowledge, your patch will work harder for you.</p><p><strong>2. Work with your soil</strong></p><p>Rather than improving your soil with organic matter, xeriscaping works around working with what you’ve already got. So the advice is to only add 3-5% of organic matter. And if your soil is compacted, focus on lifting and loosening it without loading it with amendments.</p><p><strong>3. Irrigate efficiently</strong></p><p>Xeriscaping is based on using as little water as possible and developing deep roots. So if you tend to water your plants a little and often, they won’t get used to tough conditions. Watering deeply and infrequently is a better plan.</p><p><strong>4. Use drought-tolerant plants</strong></p><p>The key is to select plants that are well-suited to your soil, sun exposure and climate. They don’t necessarily have to be native, and you might find that one plant that does well nearby doesn’t thrive in your yard.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2592px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AXkgX5UDfabkeJeSXpAA3g" name="shutterstock_1620002047" alt="Xeriscaping garden" src="https://cdn.mos.cms.futurecdn.net/AXkgX5UDfabkeJeSXpAA3g.jpg" mos="" align="middle" fullscreen="" width="2592" height="1458" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p><strong>5. Limit turfgrass</strong></p><p>Cutting back on turf or eliminating it completely is a major way to reduce water usage. But rather than leaving it stark, add drought-tolerant perennials and grasses, such as and buffalo or blue grama grass, that do survive with natural rainfall.</p><p><strong>6. Use mulch</strong></p><p>Whether you live in a dry region or not, mulch will help reduce water evaporation wherever you are. Apart from saving water, it will also suppress weeds, and protect your plants from the heat. </p><p>Gravel mulch is the perfect choice for xeriscaping. Water can penetrate, and it doesn’t need to be replaced like wood mulch. </p><p><strong>7. Maintain your landscape</strong></p><p>Rather than regularly watering your lawn and plants and mowing your lawn, your jobs will shift. You’ll be deadheading or cutting back perennials and picking up a weed or two. Keeping a regular eye on how your plants are responding will allow you to make adjustments throughout the seasons.</p><p>If your grass is suffering in the heat, you might also be interested in <a href="https://www.tomsguide.com/home/how-to-keep-your-lawn-alive-in-a-heatwave-expert-tips-to-help-it-survive">how to keep your lawn alive in a heatwave.</a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/home/best-drought-resistant-plants-for-your-yard">9 drought-resistant plants that will thrive in your yard during the hot, dry summer</a></li><li><a href="https://www.tomsguide.com/home/gardener-reveals-centuries-old-hack-for-keeping-plants-hydrated-in-the-summer">Gardener reveals ‘centuries-old’ hack for keeping plants hydrated in the summer</a></li><li><a href="https://www.tomsguide.com/home/outdoors/5-plants-that-love-the-sun-and-will-survive-a-heatwave">5 plants that love the sun and will survive a heatwave</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ You could be making a huge mistake with your bird feeder — here's what you should be doing instead ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/you-could-be-making-a-huge-mistake-with-your-bird-feeder-heres-what-you-should-be-doing-instead</link>
                                                                            <description>
                            <![CDATA[ I love to feed the birds that visit my garden, but I didn't realize the way I've been doing it could be causing more harm than good. Here's the quick change you might want to think about making. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">SCCXtdYWkXy7WfQeZsLkka</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/x4t2QWy3A6q7AJRtzwg2Bc-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 07 Jul 2026 05:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Grace Dean ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oxXqkks7wgxZkPiyYY2n6H.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/x4t2QWy3A6q7AJRtzwg2Bc-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A bird feeder in a garden]]></media:description>                                                            <media:text><![CDATA[A bird feeder in a garden]]></media:text>
                                <media:title type="plain"><![CDATA[A bird feeder in a garden]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/x4t2QWy3A6q7AJRtzwg2Bc-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I've been trying to get the right bird feeder for my garden for months. From my hanging cage that attracts unwanted attention from squirrels, to the smaller wooden box that keeps falling down, to the DIY one my son made that came under attack, I'm not having much luck.</p><p>So, I turned to my old faithful — a flat bird feeder that balances safely upon a pole and provides a roof to shield the food from the elements. Only, it turns out, that's exactly what I <em>shouldn't</em> be using. While I thought I was doing something good for my local wildlife with the most stable option, in fact, using a flat bird feeder could be having the opposite effect. And if you're using one too, you might want to rethink it.</p><h2 id="why-you-shouldn-t-be-using-a-flat-bird-feeder">Why you shouldn't be using a flat bird feeder </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Qkg9M4RYEaiP8wCt334szU" name="shutterstock_2041973156 (1)" alt="Hawfinches on bird feeder" src="https://cdn.mos.cms.futurecdn.net/Qkg9M4RYEaiP8wCt334szU.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Bird tables feel like one of the most common ways to feed birds that are local to your area and that's because they are. But, conservation charities like Britain's Royal Society for the Protection of Birds (<a href="https://www.rspb.org.uk/whats-happening/news/how-to-help-garden-birds" target="_blank">RSPB</a>) <em>strongly</em> advise against them and there's a good reason for it.</p><p>According to the RSPB, it's actually a hot bed for disease, specifically finch trichomonosis, a highly contagious variant that's easily spread around bird feeders. And the problem with flat bird feeders in particular is that the feed sits out in one spot for extended periods of time where birds continuously visit and revisit it.</p><p>RSPB specifically advises: "Don't use bird feeders with flat surfaces, such as bird tables, window feeders and feeders with trays. Research has confirmed that there's a higher risk of disease spreading on flat surfaces, where contaminated food can collect."</p><p>Leaving diseased food or droppings on a flat surface can have devastating consequences for your garden birds, so instead of using flat bird feeders, you should be avoiding them.</p><h2 id="what-you-should-do-instead">What you should do instead</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gfNwxSEv9kfGZBgEQU8CBc" name="bird_feeder_2" alt="A bird feeder in a garden" src="https://cdn.mos.cms.futurecdn.net/gfNwxSEv9kfGZBgEQU8CBc.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>Fortunately, both the RSPB and The National Audubon Society have abundant advice on what you should do instead if, like me, you're struggling to find the right solution for feeding your garden birds.</p><p>The <a href="https://www.audubon.org/news/three-easy-important-ways-keep-your-bird-feeder-disease-free" target="_blank">National Audubon Society </a>recommends that to prevent the spread of illness, you need to follow three simple steps: "Clean feeders regularly, tidy below the feeder and share the wealth." The <a href="https://www.usgs.gov/centers/national-wildlife-health-center" target="_blank">National Wildlife Health Center</a> advises that to clean them, you should make "a solution of nine parts water to one part bleach," making sure to dry the bird feeder fully before putting it back out.</p><p>Tidying below it is also important, as well as to "share the wealth" by spreading out food among a few feeders to hopefully reduce the chance of all of them becoming contaminated.</p><p>Overarching all this advice, the RSPB says that what you should really be doing is to "help birds find their own food." It recommends instead that you should be helping garden birds to discover foods by planting bird-friendly plants in your garden, including sunflowers and ivy.</p><p>If you want to use bird feeders, it seems choosing hanging ones are your best option, as long as you're keeping them clean and moving them around regularly so that food build-up doesn't occur. I'll just make sure that next time I buy a hanging bird feeder, it's one that deters squirrels.</p><div class="product"><a data-dimension112="912a4cf8-0109-4613-a790-70d33712cd93" data-action="Deal Block" data-label="Hanging bird feeders are great, but squirrels are really good at getting onto them. Fortunately, you can buy specific models, like this from Droll Yankees, that are designed just for birds with no squirrel intruders. A rotating perch and UV-stabilized seed tube are both included to make this possible." data-dimension48="Hanging bird feeders are great, but squirrels are really good at getting onto them. Fortunately, you can buy specific models, like this from Droll Yankees, that are designed just for birds with no squirrel intruders. A rotating perch and UV-stabilized seed tube are both included to make this possible." data-dimension25="$94.99" href="https://www.amazon.com/Droll-Yankees-DROFLIPPER-887961451702-Squirrel/dp/B00004ZB4U" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:535px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="S69MNmuVnMyWx5z2BxvWsj" name="bird_feeder_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/S69MNmuVnMyWx5z2BxvWsj.jpg" mos="" align="middle" fullscreen="" width="535" height="535" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Hanging bird feeders are great, but squirrels are really good at getting onto them. Fortunately, you can buy specific models, like this from Droll Yankees, that are designed just for birds with no squirrel intruders. A rotating perch and UV-stabilized seed tube are both included to make this possible.<a class="view-deal button" href="https://www.amazon.com/Droll-Yankees-DROFLIPPER-887961451702-Squirrel/dp/B00004ZB4U" target="_blank" rel="nofollow" data-dimension112="912a4cf8-0109-4613-a790-70d33712cd93" data-action="Deal Block" data-label="Hanging bird feeders are great, but squirrels are really good at getting onto them. Fortunately, you can buy specific models, like this from Droll Yankees, that are designed just for birds with no squirrel intruders. A rotating perch and UV-stabilized seed tube are both included to make this possible." data-dimension48="Hanging bird feeders are great, but squirrels are really good at getting onto them. Fortunately, you can buy specific models, like this from Droll Yankees, that are designed just for birds with no squirrel intruders. A rotating perch and UV-stabilized seed tube are both included to make this possible." data-dimension25="$94.99">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/home/ditch-the-feeder-this-summer-the-natural-way-to-keep-garden-birds-healthy">Ditch the feeder this summer: The natural way to keep garden birds healthy</a></li><li><a href="https://www.tomsguide.com/home/why-your-birdfeeder-becomes-a-disease-spot-in-a-heatwave-and-how-to-fix-it">Why your birdfeeder becomes a ‘disease spot’ in a heatwave — and how to fix it</a></li><li><a href="https://www.tomsguide.com/cameras-photography/ive-been-using-this-birdfy-smart-bird-feeder-for-four-months-heres-what-ive-learned">I’ve been using this Birdfy smart bird feeder for four months: here’s what I've learned</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Why this companion plant will make my tomatoes grow better and juicier — and it’s not basil ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/why-this-companion-plant-will-make-my-tomatoes-grow-better-and-juicier-and-its-not-basil</link>
                                                                            <description>
                            <![CDATA[ The tomato companion plant upgrade that’s even better than basil. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">mwbYE2JVCVU9F7a3UmK2hm</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/FDzBbxpwFZCkxg2ysgLwcT-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 06 Jul 2026 11:42:36 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/FDzBbxpwFZCkxg2ysgLwcT-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Fresh and colorful tomato plant]]></media:description>                                                            <media:text><![CDATA[Fresh and colorful tomato plant]]></media:text>
                                <media:title type="plain"><![CDATA[Fresh and colorful tomato plant]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/FDzBbxpwFZCkxg2ysgLwcT-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve long known that basil makes an excellent companion plant to enhance tomato growth. And I always grow this sweet-smelling herb beside my <a href="https://www.tomsguide.com/home/gardening/toms-guide-to-tomatoes">tomato plants</a> to improve my harvest. </p><p>However, I’ve recently discovered that there’s another culinary herb that works equally as well — if not better — and it just so happens to be my favorite herb of all.</p><h2 id="companion-planting-friends-with-benefits">Companion planting: Friends with benefits</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uYbkKmikT9vohsEAfLcN7V" name="shutterstock_1811305282" alt="Tomatoes and basil" src="https://cdn.mos.cms.futurecdn.net/uYbkKmikT9vohsEAfLcN7V.png" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Basil is the perfect companion to eat alongside freshly sliced tomatoes finished with a drizzle of olive oil. But aside from basil’s culinary benefits, it’s also an excellent companion plant, which is why it's often grown with tomatoes.</p><p>By pairing tomatoes with the right plants, you can create an environment that supports one another. Some companion plants repel pests, others attract beneficial insects, and some will even improve the flavor of your tomatoes. It’s a natural approach that just makes sense.</p><p>When planted with tomatoes, basil’s scent helps to deter pests, like whiteflies and aphids, which love to feast on these tasty fruits. This year I’ve planted my tomatoes in pots and placed some basil nearby to repel pests. </p><p>However, basil isn’t the only herb that will keep my tomatoes healthy. And it just so happens that I’ve got another companion plant close by too.</p><p>It turns out that thyme, my favorite fragrant herb, is also one of the best companion plants for tomatoes. </p><div class="product"><a data-dimension112="c669e28e-04c2-4a81-8b59-cf02f4ed532f" data-action="Deal Block" data-label="This small greenhouse can be used inside or out and measures 27 x 19 x 62 inches. It has a steel frame and comes with four removable racks that can each hold 22 lbs. The durable PE cover fits over the frame and has a roll-up front. It’s ideal for growing seedlings or tomato plants." data-dimension48="This small greenhouse can be used inside or out and measures 27 x 19 x 62 inches. It has a steel frame and comes with four removable racks that can each hold 22 lbs. The durable PE cover fits over the frame and has a roll-up front. It’s ideal for growing seedlings or tomato plants." data-dimension25="$39" href="https://www.amazon.com/Ohuhu-Greenhouse-Greenhouses-Portable-Outdoor/dp/B07S1LRTRK/ref=sr_1_1_sspa?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:721px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="BxhL23a3wPn37VL8t3WMub" name="Ohuhu Mini Greenhouse" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BxhL23a3wPn37VL8t3WMub.jpg" mos="" align="middle" fullscreen="" width="721" height="721" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This small greenhouse can be used inside or out and measures 27 x 19 x 62 inches. It has a steel frame and comes with four removable racks that can each hold 22 lbs. The durable PE cover fits over the frame and has a roll-up front. It’s ideal for growing seedlings or tomato plants.<a class="view-deal button" href="https://www.amazon.com/Ohuhu-Greenhouse-Greenhouses-Portable-Outdoor/dp/B07S1LRTRK/ref=sr_1_1_sspa?" target="_blank" rel="nofollow" data-dimension112="c669e28e-04c2-4a81-8b59-cf02f4ed532f" data-action="Deal Block" data-label="This small greenhouse can be used inside or out and measures 27 x 19 x 62 inches. It has a steel frame and comes with four removable racks that can each hold 22 lbs. The durable PE cover fits over the frame and has a roll-up front. It’s ideal for growing seedlings or tomato plants." data-dimension48="This small greenhouse can be used inside or out and measures 27 x 19 x 62 inches. It has a steel frame and comes with four removable racks that can each hold 22 lbs. The durable PE cover fits over the frame and has a roll-up front. It’s ideal for growing seedlings or tomato plants." data-dimension25="$39">View Deal</a></p></div><h2 id="tomatoes-and-thyme">Tomatoes and thyme</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="prV9kqMebR4kZiRH3iKbok" name="shutterstock_2582830927" alt="Creeping thyme" src="https://cdn.mos.cms.futurecdn.net/prV9kqMebR4kZiRH3iKbok.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Thyme takes on quite a different appearance from basil. It's a low-growing herbaceous plant that provides ground cover and suppresses weeds. Its leaves are much smaller than basil's, but it has an equally attractive scent, making it appealing to some yet repulsive to others.</p><p>While thyme’s fragrant essential oil attracts beneficial pollinators and predatory insects, it repels tomato hornworms, whiteflies, aphids, armyworms, leafhoppers and wireworms. </p><p>It makes a pretty good companion plant and tastes delicious when roasted with tomatoes or added to pasta sauces.</p><h2 id="planting-conditions">Planting conditions</h2><p>Thyme does best in USDA hardiness zones 5 to 9. When using it as a companion plant, it's a sun-loving plant like tomatoes, but it’s best planted in a container rather than directly in the ground, as it prefers drier soil to water-loving tomatoes.</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/when-to-pick-tomatoes-off-the-vine">3 ways to tell your tomatoes are ready to harvest</a></li><li><a href="https://www.tomsguide.com/home/stop-wasting-money-on-tomato-feed-heres-how-i-made-my-own-free-fertilizer">Stop wasting money on tomato feed — here’s how I made my own free fertilizer</a></li><li><a href="https://www.tomsguide.com/home/outdoors/growing-tomatoes-mimic-nature-and-try-the-tickle-trick-to-increase-your-yield">Boost your tomato harvest with this expert-approved top tip</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to stop blossom end rot before it ruins your tomato harvest in July ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/how-to-stop-blossom-end-rot-before-it-ruins-your-tomato-harvest-in-july</link>
                                                                            <description>
                            <![CDATA[ Save your tomatoes from blossom end rot. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">nWwAKt3wTavxVTeuq8iysd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mzvDapxaLj2WEbUjkf7Adk-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 05 Jul 2026 05:30:00 +0000</pubDate>                                                                                                                                <updated>Mon, 06 Jul 2026 08:26:23 +0000</updated>
                                                                                                                                            <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/mzvDapxaLj2WEbUjkf7Adk-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tomato blossom end rot on plant]]></media:description>                                                            <media:text><![CDATA[Tomato blossom end rot on plant]]></media:text>
                                <media:title type="plain"><![CDATA[Tomato blossom end rot on plant]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mzvDapxaLj2WEbUjkf7Adk-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There’s one problem all<a href="https://www.tomsguide.com/home/gardening/toms-guide-to-tomatoes"> tomato growers</a> fear. A ruined harvest. Blossom end rot is the culprit that can put an end to promising pickings. </p><p>After all your hard work, whether growing <a href="https://www.tomsguide.com/how-to/how-to-grow-tomatoes-from-seeds">tomatoes from seed</a> or from established <a href="https://www.tomsguide.com/how-to/how-to-grow-tomatoes-in-pots">plants in pots</a>, the ultimate disappointment is seeing an edible crop. When blossom end rot takes hold, all hope of picking and biting into a homegrown, juicy tomato is suddenly dashed.</p><p>It’s not hard to identify blossom end rot in tomatoes, but the key is preventing it from ruining your crop and reducing your<a href="https://www.tomsguide.com/how-to/7-ways-to-get-more-fruit-from-a-tomato-plant"> tomato yield</a>. Here I explain how to identify blossom end rot, what causes it and steps you can take to beat it this month.  </p><h2 id="what-does-blossom-end-rot-look-like">What does blossom-end rot look like?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:998px;"><p class="vanilla-image-block" style="padding-top:56.21%;"><img id="zDdb7RWf7JGg57MYPhfwvW" name="Tomato blossom end rot in basket - crop.jpg" alt="Tomatoes with blossom end rot in a basket" src="https://cdn.mos.cms.futurecdn.net/zDdb7RWf7JGg57MYPhfwvW.jpg" mos="" align="middle" fullscreen="" width="998" height="561" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Blossom end rot doesn’t just affect tomatoes; it’s also a common problem with eggplants and peppers. But rather than being a pest or disease, it’s related to growing conditions. </p><p>It’s not difficult to spot. You’ll notice a circular patch at the bottom of the fruit that resembles a bruise. It’s often described as a ‘water-soaked patch’ that starts out greenish-brown and, over time, turns dark brown and then black.</p><p>The patch will enlarge and become sunken, giving the fruit a flattened appearance, but only at the affected end. It will also take on a leathery appearance, eventually spreading and damaging the whole fruit. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-e47ogX"></div>                            </div>                            <script src="https://kwizly.com/embed/e47ogX.js" async></script><h2 id="what-causes-blossom-end-rot">What causes blossom end rot?</h2><p>If you spot blossom end rot on your tomatoes, it’s a sign they lack calcium. Without calcium uptake, the plant’s cell walls collapse, and the plant dies, which in turn causes the bruised appearance on the fruits. </p><p>Tomatoes absorb calcium from the soil, but the problem occurs when it’s dry, and the calcium remains locked in. The risk will also increase if you have acidic soil, as it naturally contains lower levels of calcium than alkaline soil. </p><p>Adding fertilizer to the soil around your plants can also exacerbate the problem. Calcium will be competing with nitrogen, potassium or magnesium for root uptake. Plus, when concentrated fertilizer is applied to dry soil, limited water movement reduces the roots’ ability to absorb calcium.</p><h2 id="what-to-do-with-damaged-fruit">What to do with damaged fruit</h2><p>Once you’ve spotted blossom end rot, you can’t save the individual fruits. Remove the fruit, and then check over the rest of the plant. You’ll also need to monitor any other tomato plants to see if it’s spread to them. </p><p>If your plant is still flowering, you’re still in luck. It’s likely to recover and continue to produce fruit. But to prevent blossom-end rot from damaging your next fruits, there are a few steps you can take.</p><h3 class="article-body__section" id="section-how-to-prevent-blossom-end-rot"><span>How to prevent blossom end rot</span></h3><h2 id="1-keep-your-plants-moist">1. Keep your plants moist</h2><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.25%;"><img id="gQBT8Jv7VaN2L68nvPobDg" name="shutterstock_2307637429edit.jpg" alt="Woman hand watering tomato plants" src="https://cdn.mos.cms.futurecdn.net/gQBT8Jv7VaN2L68nvPobDg.jpg" mos="" align="middle" fullscreen="" width="6000" height="3375" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>The soil or potting compost around your plants should always be kept moist. And during particularly hot periods, you may need to water your plants a couple of times each day. </p><p>You could try the <a href="https://www.tomsguide.com/home/gardening-pros-swear-by-this-ingenious-tomato-watering-trick-try-it-for-juicier-plumper-tomatoes">tomato-watering hack</a>, involving a plant pot buried in the soil near the roots. I use it on my own plants to ensure the water goes to the roots, rather than lying on the surface or just below. </p><h2 id="2-apply-a-mulch">2. Apply a mulch</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:898px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="dBXJHgg98aBDpn5AFAGeoY" name="mulch straw for tomato plant - crop.jpg" alt="Straw mulch for tomato plant" src="https://cdn.mos.cms.futurecdn.net/dBXJHgg98aBDpn5AFAGeoY.jpg" mos="" align="middle" fullscreen="" width="898" height="505" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Apart from keeping to a regular watering schedule, applying mulch will help retain moisture and prevent it from evaporating in the summer heat. Place two to three inches of organic matter around the base of your plants, but avoid the tomato plant’s stalk to prevent rot. </p><p>Straw makes a lightweight barrier that also keeps slugs and snails away. You can also use well-rotted compost, shredded leaves and <a href="https://www.tomsguide.com/home/gardeners-urged-not-to-make-this-mistake-with-their-grass-clippings-heres-why-you-shouldnt-throw-them-away">grass clippings</a>.</p><h2 id="3-test-your-soil-s-ph">3. Test your soil's pH</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5990px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="DseACT3LvGch6bGjaLf3tg" name="Soil ph meter - crop.jpg" alt="Soil ph meter in soil" src="https://cdn.mos.cms.futurecdn.net/DseACT3LvGch6bGjaLf3tg.jpg" mos="" align="middle" fullscreen="" width="5990" height="3369" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>You’ve already learned that there is less calcium in acidic soil, so for this reason, if your soil is acidic, your tomato plants might be more susceptible to blossom end rot — there’s simply less calcium for their roots to absorb.</p><p>If you don’t already know where your soil sits on the pH scale, it’s advisable to take a soil test before you plant your tomatoes. This will indicate whether your tomatoes will need extra calcium to prevent them from going bad. You could try this 4-in-1 soil pH and moisture meter, now <a href="https://www.amazon.com/Moisture-Nutrients-Outdoor-Battery-Required/dp/B0BJCLY3YL/ref=sr_1_2_sspa?" target="_blank" rel="nofollow">$15 at Amazon.</a></p><h2 id="4-add-calcium">4. Add calcium</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5710px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rr8oCKJNpotEcGHwbaiPRG" name="Feeding tomato - crop.jpg" alt="Feeding tomato plant" src="https://cdn.mos.cms.futurecdn.net/rr8oCKJNpotEcGHwbaiPRG.jpg" mos="" align="middle" fullscreen="" width="5710" height="3212" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Once you’ve determined your soil's pH, if it’s acidic, you can add lime to balance it. However, don’t add lime before testing your soil.</p><p>Tom Kalb, <a href="https://www.ag.ndsu.edu/news/columns/dakota-gardener/dakota-gardener-preventing-rotten-tomatoes-in-a-drought#:~:text=The%20best%20strategy%20to%20reduce,uptake%20of%20water.%20Irrigate%20regularly." target="_blank">NDSU Extension</a> horticulturist, suggests making your own calcium feed for your tomato plants. He recommends mixing four tablespoons of calcium nitrate into a gallon of water and spraying it onto your fruits, but not the leaves, two to three times a week. </p><p>And he says, the key time to spray the fruits is when the tomatoes are dime-sized or smaller.</p><h2 id="does-blossom-end-rot-means-the-end-of-your-whole-harvest">Does blossom end rot means the end of your whole harvest?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ejYA7tHsgdNfG2Rr4HKr7i" name="shutterstock_697847821edit.jpg" alt="Woman harvesting ripe tomatoes in her garden" src="https://cdn.mos.cms.futurecdn.net/ejYA7tHsgdNfG2Rr4HKr7i.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Thankfully, if treated promptly, later fruits will ripen successfully, and your whole crop won’t be ruined. </p><p>Kalb explains, “The first cluster of fruits is most often damaged,” but adds that after removing the damaged fruits, “Subsequent clusters of fruits are much less susceptible to blossom end rot.”</p><p>So it appears that you can save your tomato harvest.  “As summer progresses, the vine’s network of roots expands, allowing it to absorb more calcium into the plant. The leaves and fruits on the vine are in better balance later in summer, too,” he says.</p><h3 class="article-body__section" id="section-gardening-watering-essentials-we-love"><span>Gardening watering essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="365b884f-1589-4955-848a-757a7e88f1dd">            <a href="https://www.amazon.co.uk/dp/B0B7LMBHGQ?" data-model-name="Rain Gauge Outdoor, 7"" 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/9tg2fJfvgkE3grMsNYVU7L.jpg" alt="Hobyluby Rain Gauge Outdoor, 7 Inch Rain Gauges for Measuring Precipitation, Garden Yard Decor"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>HOBYLUBY</div>                                        <div class="featured__title">Rain Gauge Outdoor, 7"</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="a63bff2c-030b-475e-8933-2b07b5d4ed80">            <a href="https://www.amazon.com/Qilebi-Watering-Removable-Stainless-Sprinkler/dp/B0BN2T87DY/ref=sr_1_7?dib=eyJ2IjoiMSJ9.BQwmZOmIN3ah4NaG8y9uun0YIkvTunRaoeR2c3x4MOzJxhf-7vpNNYlXQ56jv_q5o6wpnJ04-Ms1lieGc30ewVlBMsbU9FH_8v1nvUpiOdV-NNL-hney7-v2yo19rsIkPmKnHcLl7JfEtyYKRmYsF4VpXiLdwvIrCoWhM0x0IUHVfgmNeXd4y2YO_ryVO9nn9Uawcqd6CBJMZkR_4fXbp0vLQVNH2z0grz1ED8TWDyYftA-DN25FXuUr5J2OQtwtDCZb-kTFraPxYvS6Bk14ejYJ2siE3y8imRsRwEs6UoA.jHTgr5ft7E-D7VF-LVNzEl6WIuwKW6g1RAPVvtxv-J8&dib_tag=se&keywords=watering%2Bcans&qid=1781014473&sr=8-7&th=1" data-model-name="2 Gallon Watering Can" 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/z27aZSuNKziTx22mMEpHGW.jpg" alt="2 Gallon Watering Can, Garden Watering Can Outdoor, Plant Water Can With Removable Long Spout and Stainless Steel Sprinkler Head, Large Plastic Outdoor Watering Cans for Gardening Flower Plants"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Qilebi</div>                                        <div class="featured__title">2 Gallon Watering Can</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="24363601-30e1-473a-95ef-edf0e79fe411">            <a href="https://www.amazon.com/Flexi-Hose-Function-Nozzle-50FT/dp/B0DZR7VRHL/ref=sr_1_3_sspa?" data-model-name="Expandable Garden Hose with 8 Function Nozzle, 50ft" 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/9m3GKeFbvcxDuZYngMgPic.jpg" alt="Flexi Hose Expandable Garden Hose With 8 Function Nozzle, 50ft - Lightweight Retractable Garden Hose, Water Hose - No-Kink Flexibility, 3/4 Inch Solid Brass Fittings and Double Latex Core"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Flexi Hose</div>                                        <div class="featured__title">Expandable Garden Hose with 8 Function Nozzle, 50ft</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="29f17ccc-9a22-4cd3-beba-63fe9664bda9">            <a href="https://www.amazon.com/Gardena-Adjustable-Oscillating-Sprinkler-sprinklers/dp/B07YSTB5K4/ref=sr_1_3?" data-model-name="Aquazoom Oscillating Outdoor Sprinkler, up to 3800 sq ft" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:45.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/DNyLz9MGeS3kSyJWcuvRCA.jpg" alt="Gardena 20570 | Up to 3800 Sq Ft - Aquazoom Adjustable Oscillating Yard Sprinkler, for Watering Large Area Lawn and Garden. Aquazoom Outdoor Oscillating Sprinkler Has Wide Heavy Duty Base."></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Gardena</div>                                        <div class="featured__title">Aquazoom Oscillating Outdoor Sprinkler, up to 3800 sq ft</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/home/outdoors/gardener-shares-this-one-easy-hack-that-will-stop-tomato-blight-in-its-tracks">Gardener shares this one easy hack that will stop tomato blight in its tracks</a></li><li><a href="https://www.tomsguide.com/home/why-your-tomatoes-look-cat-faced-and-how-to-grow-smoother-fruit">Why your tomatoes look ‘cat-faced’ — and how to grow smoother fruit</a></li><li><a href="https://www.tomsguide.com/home/when-to-pick-tomatoes-off-the-vine">3 ways to tell that your tomatoes are ready to harvest</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tried this no-cost trick to keep squirrels from eating my peaches — and it's actually working! ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/i-tried-this-no-cost-trick-to-keep-squirrels-from-eating-my-peaches-and-its-actually-working</link>
                                                                            <description>
                            <![CDATA[ Squirrels keep eating all of my peaches, but I've been keeping them away (so far) with something I'd normally just throw away. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TzfnzZBPXANaQ4dnh4YmB6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/cBbaXpuEaYh5AXSQa53pDc-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 04 Jul 2026 08:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></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>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/cBbaXpuEaYh5AXSQa53pDc-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Squirrel eating a peach]]></media:description>                                                            <media:text><![CDATA[Squirrel eating a peach]]></media:text>
                                <media:title type="plain"><![CDATA[Squirrel eating a peach]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/cBbaXpuEaYh5AXSQa53pDc-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Three years ago, my wife and I planted a peach tree in our backyard, and have been enchanted with its lovely scent when it blooms in the spring. Each year, it also produces dozens of peaches, which we eagerly wait to ripen. However, all too often, the tree is systematically stripped bare by ravenous squirrels, who seem to know just when to pluck the fruit from the tree. </p><p>It's utterly frustrating. After we saw it happen the first year, we tried netting the second year, but it was a pain to wrap around the tree; the <a href="https://www.tomsguide.com/home/squirrels-wreaking-havoc-in-your-garden-9-products-to-keep-them-mostly-out-this-spring">squirrels were undeterred</a>, and by mid-June, the tree was barren of all peaches.</p><p>This year, I'm trying something different using something I would have otherwise thrown out with the trash, and it's working so far. Here's what I did.</p><h2 id="strawberry-containers-to-the-rescue">Strawberry containers to the rescue</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kd6P5h4jBpCBqzEisqUXXY" name="strawberry container around peach" alt="strawberry container around a peach" src="https://cdn.mos.cms.futurecdn.net/kd6P5h4jBpCBqzEisqUXXY.jpg" mos="" align="middle" fullscreen="" width="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>Due to my daughter's fondness for the fruit, we go through at least one container of strawberries per week. Our supermarket carries the Driscoll brand, which come in rectangular plastic containers. Normally, these containers get thrown into the garbage or recycling, but this past spring, as I was getting ready to toss one out, I took a look at the container, which gave me an idea.</p><p>The strawberry container is designed to allow for airflow, so that the strawberries don't get moldy. But, I also realized that these slots could also work to my advantage on my peach tree.</p><p>I opened a container, placed it around a peach, and then snapped it shut. The slots in the container not only let the peach breathe, but they're also large enough so that I can put it around a branch without damaging it. </p><h2 id="how-it-s-going-so-far">How it's going so far</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.20%;"><img id="PGXgecqwE82zJdoCgLtwcj" name="strawberry containers around peaches" alt="strawberry containers around peaches" src="https://cdn.mos.cms.futurecdn.net/PGXgecqwE82zJdoCgLtwcj.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>I used strawberry containers to protect about a half-dozen peaches, and wouldn't you know, those are the only peaches that are still on the tree. I had my doubts about the small plastic locks on the containers, but they've remained secure, even through some pretty big and gusty thunderstorms. </p><p>The squirrels haven't yet figured out how to open the containers — and I hope they don't — but few things are as tempting.</p><p>I also tried using a blueberry container, but they don't have the same slots around the top rim, so when I cut holes to allow for the branch, the container lost all its structural stability, and wouldn't remain locked on the tree.</p><p>The peaches are growing slowly, but steadily. The biggest downside is that having a bunch of plastic containers on the tree isn't the most aesthetically pleasing, but if that's the price to pay for a juicy peach from my own tree, then it's something I'll gladly accept.</p><p>What are your tricks for keeping squirrels away from your fruit trees? Let me know in the comments.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/how-to/7-plants-that-repel-squirrels-and-keep-them-out-of-your-yard">7 plants that repel squirrels and keep them out of your yard</a></li><li><a href="https://www.tomsguide.com/how-to/how-to-get-rid-of-squirrels">How to get rid of squirrels without hurting them - Tom's Guide</a></li><li><a href="https://www.tomsguide.com/home/squirrels-wreaking-havoc-in-your-garden-9-products-to-keep-them-mostly-out-this-spring">Squirrels wreaking havoc in your garden? 9 products to keep them away</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to mow a checkerboard pattern in your lawn this summer — and impress the neighbors ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/how-to-mow-a-checkerboard-pattern-in-your-lawn-this-summer-and-impress-the-neighbors</link>
                                                                            <description>
                            <![CDATA[ Gardening expert reveals how to do checkerboard patterns in your lawn to spruce up your backyard this summer. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">K4UVv4MonWg6YbjgWFzcT9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/K2AkhqzJATyirrHcmaS6ea-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 04 Jul 2026 06:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/K2AkhqzJATyirrHcmaS6ea-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Man mowing lawn]]></media:description>                                                            <media:text><![CDATA[Man mowing lawn]]></media:text>
                                <media:title type="plain"><![CDATA[Man mowing lawn]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/K2AkhqzJATyirrHcmaS6ea-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Summer is here, and the perfect time to get out and enjoy your outdoor spaces in style. Whether you take pride in your<a href="https://www.tomsguide.com/home/gardening/i-asked-gardening-experts-the-secret-to-a-greener-lawn-heres-what-they-want-you-to-do-this-spring"> lush lawn</a> or are preparing for hosting gatherings, a patterned lawn can truly provide that wow factor and elevate your entire garden.</p><p>But if you don’t want a classic <a href="https://www.tomsguide.com/how-to/how-to-stripe-your-lawn">striped lawn</a> or even a diamond pattern, why not try a twist with the checkerboard effect? Known for its unique, geometric squares, you can easily replicate this look by switching your travel path while mowing.</p><p>In fact, this specific method is a<a href="https://www.tomsguide.com/wellness/fitness/i-tried-the-new-ghin-apps-massive-upgrade-that-will-settle-every-golf-course-argument"> favorite for golf course managers</a>, which can instantly give your own backyard a premium appeal. What’s more, this method will make your grass appear healthier.</p><p>While it may seem like a job for the professionals, mastering the checkerboard effect is actually quite easy to do. I asked a grass expert to share their top tips on how to mow a checkerboard pattern the right way — so your lawn can be the envy of your neighbors. </p><h2 id="how-to-create-a-checkerboard-lawn-in-2-easy-steps">How to create a checkerboard lawn — in 2 easy steps </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5749px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LpuSM9DGxwcEeQH9veGXnC" name="shutterstock_editorial_14803221e" alt="Lawnmower cutting stripes in one direction" src="https://cdn.mos.cms.futurecdn.net/LpuSM9DGxwcEeQH9veGXnC.jpg" mos="" align="middle" fullscreen="" width="5749" height="3234" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Lawnmower cutting stripes in one direction </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Creating a checkerboard pattern is pretty straightforward. In this method, you simply need to alternate your mowing path between horizontal and vertical passes across your turf. </p><p>Before you start, experts advise that your grass should be thick and healthy. This is because the pattern actually comes from the blades leaning in different directions and the light bouncing off it. So if your lawn is patchy, bumpy, or in bad condition overall, this will affect the overall results. </p><div><blockquote><p>Alternate your mowing path between horizontal and vertical passes across your turf. </p></blockquote></div><p>“You need to make sure you have a healthy and even lawn before you begin,” advises Jonathan Davis, grass expert at <a href="https://74n5c4m7.r.eu-west-1.awstrack.me/L0/https:%2F%2Fwww.lawnsmith.co.uk%2F%3Fsrsltid=AfmBOooIkJWgMxC-1t6eQmXY5XvbqXKqmXATVwwOvAj16jq57CAERa59/1/0102019f17a2cc5e-f8deace1-ec76-4ed8-9564-ca700f7c5bbb-000000/ZJoQ8msOlwnzzHCnXOkJvz6_bqI=473" target="_blank">Lawnsmith</a>.  </p><p>“The checkerboard appearance comes from the blades leaning in different directions and the light bouncing off it, so a bumpy or patchy lawn might not be as effective”.</p><p>In addition, it’s ideal to have helpful tools such as a lawn roller; however, most standard mowers have this already attached. More importantly, you should ensure that your mower's blades are perfectly sharp before you begin. </p><p>“A roller is essential; most standard mowers have these attached to the rear, but you can use a separate roller if you prefer, ”advises Davis. “Plot your path, either using string or stakes. You can try to mentally plan your route, but this could lead to wonky lines. “</p><p>Begin by mowing a horizontal line through your turf. Then, rotate your mower to complete a vertical pass alongside it, alternating your route with every subsequent pass. </p><p>“Mow the first set of stripes in one direction across the whole lawn, alternating the direction of travel on each pass - up and then back down,” adds Davis.</p><p>“Then turn 90 degrees and repeat the process. The second pass will intersect the first, and where the two directions overlap, you get the checkerboard squares instead of simple stripes.”</p><div><blockquote><p>Mow the first set of stripes in one direction across the whole lawn, alternating the direction of travel on each pass. Then turn 90 degrees and repeat the process</p><p>Jonathan Davis, grass expert </p></blockquote></div><p>By following these steps precisely, you should achieve a checkerboard pattern, although bear in mind the lines may be a little subtle at first. In any case, as your grass grows, you’ll need to re-mow or re-roll over the original pattern to ensure your distinct pattern. </p><p>“Changing the pattern of your lawn can have some benefits,” states Davis. “It prevents the grass from leaning in one set direction, which can weaken it over time and make it grow unevenly. </p><p>“It can also lead to less soil compaction. Driving or walking over the same sections in the same way can compress the soil, which restricts root growth and drainage. Switching your route up spreads that wear 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:5533px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="hfrtB6rrich6rWrsYBS8Xh" name="shutterstock_674227348" alt="Chess pieces on checkerboard lawn" src="https://cdn.mos.cms.futurecdn.net/hfrtB6rrich6rWrsYBS8Xh.jpg" mos="" align="middle" fullscreen="" width="5533" height="3112" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Chess pieces on checkerboard lawn </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>The same rules apply for regular mowing, and you must avoid doing a checkerboard pattern when the grass is damp or moist. This can lead to clumping — or ruin the overall aesthetic. </p><p>“Avoid doing it when the ground is wet as this can lead to clumping. Mowing during periods of hot weather can also lead to your turf becoming stressed,” Davis explains.</p><p>“A striped, two-tone checkerboard effect you see on sports fields or golf courses is actually quite achievable in your own garden”.</p><p>So if you’re looking to truly spruce up your backyard this season, give your turf a premium checkerboard upgrade.</p><p>For more top lawncare tips, check out <a href="https://www.tomsguide.com/home/lawn-care/11-secrets-to-a-lawn-thats-greener-than-your-neighbors">11 secrets to a lawn that’s greener than your neighbor's.</a></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eG0N2W"></div>                            </div>                            <script src="https://kwizly.com/embed/eG0N2W.js" async></script><h3 class="article-body__section" id="section-lawncare-essentials-we-love"><span>Lawncare essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="908cae43-55fa-4da3-8574-24b29266d738">            <a href="https://www.amazon.com/Garden-Guru-Handheld-Spreader-Shaker/dp/B0F8P8QM3V/ref=sr_1_8?" data-model-name="Garden Guru Handheld Seed Spreader Shaker" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:82.80%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/ezrwVY6BYsgBZtBcNhMTm9.jpg" alt="Garden Guru Handheld Seed Spreader Shaker – Multi Use Grass Seed, Fertilizer, Salt, Ice & Snow Melt Spreader – Adjustable Twist Cap W Multiple Size Openings – Lightweight 1l Capacity Hand Seeder"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Garden Guru Handheld Seed Spreader Shaker</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="f740eec9-fe02-43b7-b239-5b64bced9d51">            <a href="https://www.amazon.com/dp/B07BD2GZW8" data-model-name="Garden Gloves" 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/YyBJP4YUpLVNV4q2yKFfjS.jpg" alt="Amazing Stuff For You green and gray gardening gloves"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazing Stuff</div>                                        <div class="featured__title">Garden Gloves</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="36c3c5ee-d7ff-4592-9d90-3e70c1b065ba">            <a href="https://www.amazon.com/Grampas-Weeder-CW-01-Original-Remover/dp/B001D1FFZA?" data-model-name="Grampa's Weeder" 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/kP7pgu2tpxz8d34HtVQgxC.jpg" alt="Grampa's Weeder The Original Stand Up Weed Puller Tool with Long Handle"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Grampa's Weeder</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b94b08-caad-456c-b104-34a12eed1cce">            <a href="https://www.amazon.com/Greenworks-G-MAX-Mower-Batteries-Charger/dp/B086K59Q79/ref=sr_1_3?" data-model-name="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower" 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/8LF2UvRs8EXvmebaZefwzA.jpg" alt="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower (200+ Compatible Tools), (2) 4.0ah Batteries and Dual Port Rapid Charger Included"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/home/gardening/why-do-i-have-yellow-patches-in-my-lawn-gardening-experts-share-their-top-tips-on-how-to-fix-it">Why do I have yellow patches in my lawn? Gardening experts share their top tips on how to fix it</a></li><li>How<a href="https://www.tomsguide.com/how-to/how-to-dethatch-a-lawn"> to dethatch a lawn</a></li><li><a href="https://www.tomsguide.com/home/5-easy-tips-to-fix-bare-patches-on-your-lawn-this-spring">5 easy tips to fix bare patches on your lawn this spring</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Is the heatwave turning your grass brown? An expert recommends watering your lawn the ‘Wimbledon way’ ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/is-the-heatwave-turning-your-grass-brown-an-expert-recommends-watering-your-lawn-the-wimbledon-way</link>
                                                                            <description>
                            <![CDATA[ The ‘Wimbledon’ groundskeeper trick that keeps lawns lush in a heatwave. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">KFpd2hyMpjayyDBBNexP29</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/QKzpUBggDphe7wHBH9W9gF-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Jul 2026 12:12:47 +0000</pubDate>                                                                                                                                <updated>Thu, 02 Jul 2026 12:17:39 +0000</updated>
                                                                                                                                            <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/QKzpUBggDphe7wHBH9W9gF-1280-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Wimbledon court 2025]]></media:description>                                                            <media:text><![CDATA[Wimbledon court 2025]]></media:text>
                                <media:title type="plain"><![CDATA[Wimbledon court 2025]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/QKzpUBggDphe7wHBH9W9gF-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>For many gardeners, a <a href="https://www.tomsguide.com/features/the-ultimate-lawn-care-guide-essential-tips-and-tricks-for-getting-the-perfect-lawn">lush green lawn</a> is a badge of honor. But with the onslaught of <a href="https://www.tomsguide.com/how-to/how-to-water-your-lawn-in-a-heat-wave">heatwaves </a>and limited rain, the climate is wreaking havoc with our lawns.</p><p>That once immaculate patch of green turf that you admired is now turning into an unpleasant patch of brown straw before your eyes.</p><p>Water is evaporating before it has a chance to reach the roots, and in a bid to survive, your grass is going into dormancy. Frequent light watering won’t help, as it doesn't encourage the roots to dive deep into the soil for long-term survival. So, how do you keep your lawn looking lush during a heatwave?</p><p>According to lawn expert Jonathan Davis, at <a href="https://www.lawnsmith.co.uk/" target="_blank">Lawnsmith</a>, we can learn a trick or two from the folks at <a href="https://www.tomsguide.com/entertainment/sports/watch-wimbledon-2026-live-streams-and-tv-channels">Wimbledon</a>. If anyone knows how to look after a pristine lawn, it’s the skilled gardeners and ground staff at this iconic sports venue.</p><h2 id="water-your-lawn-the-wimbledon-way">Water your lawn the 'Wimbledon way'</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:56.20%;"><img id="HiUT2oXDzBgRQMBGuYg2oK" name="dan evans" alt="Daniel Evans stretching for a backhand during a match at Wimbledon in 2023." src="https://cdn.mos.cms.futurecdn.net/HiUT2oXDzBgRQMBGuYg2oK.jpg" mos="" align="middle" fullscreen="" width="1000" height="562" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Julian Finney/Getty Images)</span></figcaption></figure><p>While we’re trying all sorts of ways to keep our lawns healthy during a heatwave, from <a href="https://www.tomsguide.com/home/outdoors/garden-experts-share-the-best-time-to-water-your-lawn-and-ive-been-getting-it-all-wrong">watering at the best time</a> to<a href="https://www.tomsguide.com/home/gardening/i-asked-professional-gardeners-how-to-get-rid-of-weeds-from-my-lawn-permanently-and-they-all-say-this-one-thing"> removing lawn weeds</a> that deprive our grass of moisture and nutrients, Davis has another lawncare tip that keeps the Wimbledon courts in tip-top condition all summer. </p><p>According to Davis, the Wimbledon lawn care professionals apply a wetting agent to the ground. “A wetting agent is a chemical that reduces the surface tension of water. When applied to soil, it helps rain and water penetrate the turf and spread more efficiently,” he explains.</p><p>It all sounds too easy.</p><p>But he continues, “A perfect example of water’s surface tension at play is the old party trick where you balance a coin on top of a glass of water. And when you put a drop of washing up liquid in the water, the surface tension breaks and the coin immediately sinks.”</p><p>A wetting agent overcomes the problem when the ground is hard and dry, and the water runs off the surface. Applying a wetting agent helps hydrate the soil and improve the grass.</p><p>“By disrupting the water’s surface tension, a wetting agent immediately allows it to filter down through the soil, right to the roots where it’s most needed,” he adds.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eAxDEX"></div>                            </div>                            <script src="https://kwizly.com/embed/eAxDEX.js" async></script><p><strong>The 'Wimbledon way'</strong></p><p>The secret behind Wimbledon’s lawncare success was revealed by Neil Stubley, Wimbledon’s head of courts and horticulture, published last year in <a href="https://www.theguardian.com/">The Guardian</a>, where he said: “It sounds a weird term but it makes water wetter. The surface tension of a water molecule, a plant root system, at a certain point, can’t penetrate it as the moisture gets smaller, because the surface tension is more. We can adjust that so that actually a plant root can tap into that water.” </p><h2 id="when-to-use-a-wetting-agent">When to use a wetting agent</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="bsgzw9od5EnuL55rKpPW5c" name="shutterstock_1050046013edit.jpg" alt="Green grass and healthy lawn" src="https://cdn.mos.cms.futurecdn.net/bsgzw9od5EnuL55rKpPW5c.jpg" mos="" align="middle" fullscreen="" width="1800" height="1013" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>“I’d recommend using a wetting agent to prepare your lawn for dry, summer conditions, supporting its hydration ahead of warmer weather,” says Davis.</p><p>Wetting agents protect lawns before dry weather arrives, but they can also revive those that have already suffered.</p><p>“If grass has entered a dormant state, recovery can be patchy, some areas remain brown while others return to a vibrant green. A wetting agent can revive the whole lawn,” he adds.</p><p> So whether it’s a dry lawn that needs reviving or one that needs protection, a wetting agent is worth the price.</p><div class="product"><a data-dimension112="6f4b7e0f-6bad-427d-b878-7e940464532b" data-action="Deal Block" data-label="This wetting agent will improve water absorption in dry and compacted soil, and is designed for lawns where water runs off in puddles. The solution helps moisture penetrate evenly into the root zone, reducing runoff and helping grass access water more efficiently. This 32 oz container covers up to 6,000 sq ft of lawn." data-dimension48="This wetting agent will improve water absorption in dry and compacted soil, and is designed for lawns where water runs off in puddles. The solution helps moisture penetrate evenly into the root zone, reducing runoff and helping grass access water more efficiently. This 32 oz container covers up to 6,000 sq ft of lawn." data-dimension25="$29" href="https://www.amazon.com/Turf-Titan-Hydro-Holder-Covers/dp/B0DPBKZZLW/ref=sr_1_5?" 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="cBiZAodHiiJB4qSmGsxjCh" name="Turf Titan Hydro Holder Lawn Wetting Agent" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/cBiZAodHiiJB4qSmGsxjCh.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This wetting agent will improve water absorption in dry and compacted soil, and is designed for lawns where water runs off in puddles. The solution helps moisture penetrate evenly into the root zone, reducing runoff and helping grass access water more efficiently. This 32 oz container covers up to 6,000 sq ft of lawn.<a class="view-deal button" href="https://www.amazon.com/Turf-Titan-Hydro-Holder-Covers/dp/B0DPBKZZLW/ref=sr_1_5?" target="_blank" rel="nofollow" data-dimension112="6f4b7e0f-6bad-427d-b878-7e940464532b" data-action="Deal Block" data-label="This wetting agent will improve water absorption in dry and compacted soil, and is designed for lawns where water runs off in puddles. The solution helps moisture penetrate evenly into the root zone, reducing runoff and helping grass access water more efficiently. This 32 oz container covers up to 6,000 sq ft of lawn." data-dimension48="This wetting agent will improve water absorption in dry and compacted soil, and is designed for lawns where water runs off in puddles. The solution helps moisture penetrate evenly into the root zone, reducing runoff and helping grass access water more efficiently. This 32 oz container covers up to 6,000 sq ft of lawn." data-dimension25="$29">View Deal</a></p></div><h2 id="how-to-use-a-wetting-agent-on-your-lawn">How to use a wetting agent on your lawn</h2><p>Getting the most from a wetting agent comes down to timing and coverage. Davis recommends applying it before watering or rainfall, so the product is already working when moisture arrives. You can apply it to the whole lawn or just to patches that need it.</p><p>And he advises, “If just treating specific dry areas, spread it further than the initial patch to ensure thorough coverage.”</p><p>Apart from this technique keeping the Wimbledon courts looking pristine in dry, warm conditions, it can also help to conserve water.</p><p>Davis says, “If water is reaching the roots effectively, it means less water gets wasted overall, so there’s an environmental benefit too.”</p><h3 class="article-body__section" id="section-lawncare-essentials-we-love"><span>Lawncare essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="b30f671b-6f73-4836-a58c-3958d3a3e155">            <a href="https://www.amazon.com/Qilebi-Watering-Removable-Stainless-Sprinkler/dp/B0BN2T87DY/ref=sr_1_7?dib=eyJ2IjoiMSJ9.BQwmZOmIN3ah4NaG8y9uun0YIkvTunRaoeR2c3x4MOzJxhf-7vpNNYlXQ56jv_q5o6wpnJ04-Ms1lieGc30ewVlBMsbU9FH_8v1nvUpiOdV-NNL-hney7-v2yo19rsIkPmKnHcLl7JfEtyYKRmYsF4VpXiLdwvIrCoWhM0x0IUHVfgmNeXd4y2YO_ryVO9nn9Uawcqd6CBJMZkR_4fXbp0vLQVNH2z0grz1ED8TWDyYftA-DN25FXuUr5J2OQtwtDCZb-kTFraPxYvS6Bk14ejYJ2siE3y8imRsRwEs6UoA.jHTgr5ft7E-D7VF-LVNzEl6WIuwKW6g1RAPVvtxv-J8&dib_tag=se&keywords=watering%2Bcans&qid=1781014473&sr=8-7&th=1" data-model-name="2 Gallon Watering Can" 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/z27aZSuNKziTx22mMEpHGW.jpg" alt="2 Gallon Watering Can, Garden Watering Can Outdoor, Plant Water Can With Removable Long Spout and Stainless Steel Sprinkler Head, Large Plastic Outdoor Watering Cans for Gardening Flower Plants"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Qilebi</div>                                        <div class="featured__title">2 Gallon Watering Can</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="5461c132-331c-4448-a7b2-2b9d032a7a0d">            <a href="https://www.amazon.com/Flexi-Hose-Function-Nozzle-50FT/dp/B0DZR7VRHL/ref=sr_1_3_sspa?" data-model-name="Expandable Garden Hose with 8 Function Nozzle, 50ft" 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/9m3GKeFbvcxDuZYngMgPic.jpg" alt="Flexi Hose Expandable Garden Hose With 8 Function Nozzle, 50ft - Lightweight Retractable Garden Hose, Water Hose - No-Kink Flexibility, 3/4 Inch Solid Brass Fittings and Double Latex Core"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Flexi Hose</div>                                        <div class="featured__title">Expandable Garden Hose with 8 Function Nozzle, 50ft</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="624c7b1c-57e2-445c-b0bc-40f2297e9529">            <a href="https://www.amazon.com/Gardena-Adjustable-Oscillating-Sprinkler-sprinklers/dp/B07YSTB5K4/ref=sr_1_3?" data-model-name="Aquazoom Oscillating Outdoor Sprinkler, up to 3800 sq ft" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:45.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/DNyLz9MGeS3kSyJWcuvRCA.jpg" alt="Gardena 20570 | Up to 3800 Sq Ft - Aquazoom Adjustable Oscillating Yard Sprinkler, for Watering Large Area Lawn and Garden. Aquazoom Outdoor Oscillating Sprinkler Has Wide Heavy Duty Base."></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Gardena</div>                                        <div class="featured__title">Aquazoom Oscillating Outdoor Sprinkler, up to 3800 sq ft</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="92b56f3c-3ed7-42c8-941f-482d0e1e3b92">            <a href="https://www.amazon.com/Greenworks-G-MAX-Mower-Batteries-Charger/dp/B086K59Q79/ref=sr_1_3?" data-model-name="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower" 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/8LF2UvRs8EXvmebaZefwzA.jpg" alt="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower (200+ Compatible Tools), (2) 4.0ah Batteries and Dual Port Rapid Charger Included"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/home/gardeners-urged-not-to-make-this-mistake-with-their-grass-clippings-heres-why-you-shouldnt-throw-them-away">Gardeners urged not to make this mistake with their grass clippings: Here’s why you shouldn’t throw them away</a></li><li><a href="https://www.tomsguide.com/home/outdoors/lawn-care-jobs-for-june">7 expert tips to make your lawn look amazing this summer</a></li><li><a href="https://www.tomsguide.com/home/dont-make-a-costly-mistake-7-signs-your-yard-isnt-suitable-for-a-robot-lawnmower">Don't make a costly mistake: 7 signs your yard isn’t suitable for a robot lawnmower</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Can you plant in a heatwave? The survival guide to planting in July ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/is-it-too-hot-to-plant-what-you-can-and-cant-put-in-the-ground-in-july</link>
                                                                            <description>
                            <![CDATA[ Planting in a heatwave: Your essential guide for July for a thriving garden. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gDinKtDQ5MrAkBx7FaH9Xo</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/L2GQR4SxP4vcWnKVwgpBsU-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Jul 2026 07:30:00 +0000</pubDate>                                                                                                                                <updated>Mon, 06 Jul 2026 14:15:11 +0000</updated>
                                                                                                                                            <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Madeleine Streets ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/HY7M3A8n2FLCdPDR7ZNPbb.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/L2GQR4SxP4vcWnKVwgpBsU-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Gardening tools to plant outdoors]]></media:description>                                                            <media:text><![CDATA[Gardening tools to plant outdoors]]></media:text>
                                <media:title type="plain"><![CDATA[Gardening tools to plant outdoors]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/L2GQR4SxP4vcWnKVwgpBsU-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>July is when gardening protocol gets complicated, if not downright contradictory. On one hand, garden centers are still packed with tempting, vibrant summer annuals. On the other hand, <a href="https://www.tomsguide.com/home/damaged-caulking-invites-a-summer-mold-surge-during-heatwaves-heres-what-to-do-about-it">prolonged heatwaves</a> and <a href="https://www.tomsguide.com/home/best-drought-resistant-plants-for-your-yard">drought conditions</a> across the U.S. are leaving even established plants struggling to survive.</p><p>This gap between promise and practicality is becoming an increasingly common problem for gardeners. As climate patterns shift, many people are finding that traditional planting calendars don’t always match the conditions they’re experiencing in their own backyards. </p><p>This shift means that a task that might have been perfectly reasonable in July a decade ago can now be much riskier — especially during a stretch of 95°F weather. So, what can you plant in July, and what should you leave out?</p><h2 id="the-challenge-of-climate-change">The challenge of climate change</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mFcNpSJCfi3vEFLA3GpbEZ" name="GettyImages-2150847922" alt="Woman reading in a sunny garden" src="https://cdn.mos.cms.futurecdn.net/mFcNpSJCfi3vEFLA3GpbEZ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>"The most disruptive change that is impacting many gardeners today is the increasing occasions of brutal summer heat and humidity driven by events like El Niño,” said John Cho, founder of gardening weather app <a href="https://www.mycozyplant.com/" target="_blank">My Cozy Plant</a>. </p><p>Fortunately, rising summer temperatures don’t necessarily mean you need to stop planting altogether. The key is understanding which plants are likely to cope with summer conditions, which ones are best saved for cooler weather, and how to give new plants the best possible chance of success.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eBjo0e"></div>                            </div>                            <script src="https://kwizly.com/embed/eBjo0e.js" async></script><h2 id="why-does-hot-weather-make-planting-more-difficult">Why does hot weather make planting more difficult</h2><p>The biggest challenge isn’t usually the heat itself; it’s what the heat does to a plant’s roots.</p><p>Whenever you move a plant from a pot into the ground, it experiences some transplant shock. During this period, the plant is trying to establish new roots while also supporting its existing leaves and stems — a tricky job. Hot weather makes that process much harder because it makes moisture evaporate more quickly from both the soil and the foliage.</p><p>“Even native plants need time to establish healthy root systems during the milder seasons before they can withstand prolonged heat and drought,” warns Kate Schneider, founder and CEO of <a href="https://ibiscoastallandscapes.com/" target="_blank">Ibis Coastal Landscapes</a>, a concierge landscaping boutique. “Planting in the middle of summer asks them to survive some of the year’s harshest conditions before they’ve had a chance to get established.”</p><p>This has always been an issue during the height of summer, but now the window of extreme heat is widening. According to Cho, gardeners are already adjusting their planting habits in response to changing weather patterns.</p><div><blockquote><p>We are starting to see some gardeners planting earlier than normal to ensure plants have established root systems by the time the brutal heat kicks in</p><p>John Cho, Mr Cozy Plant</p></blockquote></div><p>"We are starting to see some gardeners planting earlier than normal to ensure plants have established root systems by the time the brutal heat kicks in,” said Cho. “Fall planting is quickly becoming a popular window for putting new things in the ground.”</p><p>As a general rule, Cho recommends avoiding planting when temperatures are consistently above 85°F. Schneider agrees, adding that many plants begin diverting energy toward survival rather than root development once temperatures reach the 90s, as photosynthesis becomes less efficient.</p><p>That said, not every plant reacts the same way. Heat-loving flowers and vegetables can still perform well, while cool-season crops are likely to struggle.</p><h3 class="article-body__section" id="section-plants-that-are-best-avoided-in-july"><span>Plants that are best avoided in July</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6232px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="CabR9FCSxGo5gn9dkjRLWL" name="Lettuce - crop.jpg" alt="Homegrown lettuce" src="https://cdn.mos.cms.futurecdn.net/CabR9FCSxGo5gn9dkjRLWL.jpg" mos="" align="middle" fullscreen="" width="6232" height="3506" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>If you’re gardening during a hot spell, some plants simply aren’t worth the risk. They have a low chance of surviving the first few weeks, meaning you’ll have invested your time and money for nothing. Even if some do cling on, the resulting plant will often be weak and possibly permanently stunted. </p><h2 id="cool-season-vegetables">Cool-season vegetables</h2><p>Lettuce, arugula, and other cool-season crops are among the first plants to suffer when temperatures climb. Many will bolt quickly, become bitter, or struggle to establish themselves at all. Cho specifically recommends avoiding planting vegetables such as lettuce and spinach in July because their large foliage loses moisture rapidly through evaporation.</p><h2 id="large-leaved-flowering-plants">Large-leaved flowering plants</h2><p>Hydrangeas may be beautiful, but they're not the smartest choice during midsummer planting.</p><p>"Gardeners should avoid planting species that have large, thin leaves, such as hydrangeas for flowers," says Cho. </p><p>As with spinach, those large leaves lose significant moisture, placing additional stress on plants already trying to establish roots.</p><h2 id="new-lawns-and-sod">New lawns and sod</h2><p>If there’s one project worth postponing, it’s installing turf. According to Schneider, newly laid sod often requires watering three to four times per day during midsummer conditions and can be extremely expensive to maintain successfully. Cooler temperatures in spring or fall generally provide much better conditions for establishment.</p><h3 class="article-body__section" id="section-what-you-can-still-plant-successfully-in-july"><span>What you can still plant successfully in July</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5391px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="PiFfx87vcb7EMJYPHALEX8" name="shutterstock_2303270533.jpg" alt="Salvia plant" src="https://cdn.mos.cms.futurecdn.net/PiFfx87vcb7EMJYPHALEX8.jpg" mos="" align="middle" fullscreen="" width="5391" height="3032" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>The good news is that July isn’t a complete write-off for planting. You can still get outside and add new plants to your patch.</p><h2 id="heat-loving-annual-flowers">Heat-loving annual flowers</h2><p>Many annual flowers thrive in hot weather and can still provide months of color before fall. Cho recommends drought-tolerant flowering plants such as salvias and lavender, both of which are naturally adapted to sunny, dry conditions.<br><br>Other reliable choices include zinnias. cosmos, vinca, angelonia and marigolds. These plants are built for summer and often continue flowering even when temperatures soar.</p><h2 id="a-second-wave-of-sunflowers">A second wave of sunflowers</h2><p>If you’ve already planted sunflowers this year, July can be a great time to sow another batch. Many varieties mature in around 60 to 80 days, giving you fresh blooms later in the season. Staggered sowings can also extend flowering well into fall.</p><h2 id="warm-season-vegetables-and-herbs">Warm-season vegetables and herbs</h2><p>Heat-loving edibles can still be productive when planted during summer. Peppers and okra are two of Cho’s top recommendations because they’re well adapted to hot weather and dry soil conditions. Basil is another excellent option. In many gardens, it actually performs better during the hottest weeks of summer than during cooler spring weather.</p><h3 class="article-body__section" id="section-4-top-tips-for-planting-during-hot-weather"><span>4 top tips for planting during hot weather</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4516px;"><p class="vanilla-image-block" style="padding-top:56.18%;"><img id="dXtatb7dJ7vouroUuMgGNV" name="shutterstock_2186807005.jpg" alt="Watering plants outdoors" src="https://cdn.mos.cms.futurecdn.net/dXtatb7dJ7vouroUuMgGNV.jpg" mos="" align="middle" fullscreen="" width="4516" height="2537" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>If you do decide to plant this month, timing and <a href="https://www.tomsguide.com/how-to/5-expert-tips-to-help-your-plants-survive-the-heat-wave">aftercare</a> can make all the difference. </p><h2 id="1-plant-early-in-the-morning">1. Plant early in the morning</h2><p>Avoid planting during the hottest part of the day. Research and expert advice both point to early morning as the safest planting window because it gives roots several hours to settle before temperatures peak. Schneider recommends planting before 10 a.m. whenever possible.</p><h2 id="2-water-deeply-and-at-the-right-time">2. Water deeply — and at the right time</h2><p>A quick splash with a hose isn't enough during a heatwave. Moisture is evaporating at much quicker rates, drying out the soil before plants can absorb enough water.</p><p>To combat this, Schneider recommends <a href="https://www.tomsguide.com/home/gardeners-urged-to-water-their-gardens-at-this-exact-time-in-summer-for-healthy-plants">watering</a> deeply some time between 4 a.m. and 10 a.m., then following up with a second watering during the evening once temperatures begin to cool. Deep watering encourages roots to grow downward, helping plants become more resilient over time.</p><h2 id="3-mulch-generously">3. Mulch generously</h2><p>“It may seem counterintuitive, but one of the best ways to help new plants survive summer heat is to apply a generous layer of mulch,” said Schneider. “During periods of intense sun and high temperatures, bare soil can lose up to a half inch of moisture each day through evaporation. ” </p><p>Applying a 2-3-inch layer of organic mulch acts as insulation and helps to reduce evaporation, regulate soil temperature, and keep roots consistently moist. </p><p>“Just be sure to keep mulch a few inches away from the base of the plant to prevent excess moisture from collecting against the stems or trunk,” cautioned Schneider, as this can lead to disease and rot. </p><h2 id="4-use-shade-to-your-advantage">4. Use shade to your advantage</h2><p>Naturally shaded planting locations are preferred whenever possible, as the temperatures beneath established trees can be dramatically cooler than those in full sun. If your garden doesn’t offer much natural protection from the sun, temporary shade cloth can be a worthwhile investment. Cho recommends using shade cloth to protect young plants from intense UV exposure, which can scorch leaves.</p><p>“This is especially important for gardeners who live at higher altitudes, where the sun’s rays are much stronger,” he added.</p><h2 id="so-is-it-too-hot-to-plant">So, is it too hot to plant?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6038px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="L2GQR4SxP4vcWnKVwgpBsU" name="planting - crop.jpg" alt="Gardening tools to plant outdoors" src="https://cdn.mos.cms.futurecdn.net/L2GQR4SxP4vcWnKVwgpBsU.jpg" mos="" align="middle" fullscreen="" width="6038" height="3396" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Not necessarily.</p><p>If temperatures are pushing into the mid-90s every day, it’s worth postponing major landscaping projects, new lawns, and expensive shrubs until cooler weather arrives. But if you choose the right plants and give them extra care, there's still plenty you can successfully plant in July. The trick is to work with the weather rather than against it — and to save the most demanding planting jobs for a kinder season.</p><h3 class="article-body__section" id="section-gardening-essentials-we-love"><span>Gardening essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="a85dc283-d3c8-41db-95a2-4797c42330fe">            <a href="https://www.amazon.com/dp/B07BD2GZW8" data-model-name="Garden Gloves" 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/YyBJP4YUpLVNV4q2yKFfjS.jpg" alt="Amazing Stuff For You green and gray gardening gloves"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazing Stuff</div>                                        <div class="featured__title">Garden Gloves</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="a51974bc-4ed0-41d8-9852-6fb5e1342467">            <a href="https://www.amazon.com/Felco-F-2-Classic-Manual-Pruner/dp/B00023RYS6" data-model-name="F2 Pruning Shears" 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/pVTQGL4DSUSgfk9pVKhLgm.jpg" alt="Felco 2 bypass pruners"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Felco </div>                                        <div class="featured__title">F2 Pruning Shears</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="58d8983d-93cc-4f8c-bacb-ccda82997dd3">            <a href="https://www.homedepot.com/pep/Corona-ComfortGEL-6-5-in-Comfort-Grip-Stainless-Steel-Hand-Trowel-CT-3214/205811685?" data-model-name="ComfortGEL 6.5 inch Stainless Steel Hand Trowel:" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:99.84%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/pFmmWavYqAu55zSSvQ7b8U.png" alt="Corona hand trowel"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corona </div>                                        <div class="featured__title">ComfortGEL 6.5 inch Stainless Steel Hand Trowel:</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="deea1158-d774-46b0-a47f-8ad93d0c33f4">            <a href="https://www.amazon.com/Grampas-Weeder-CW-01-Original-Remover/dp/B001D1FFZA?" data-model-name="Grampa's Weeder" 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/kP7pgu2tpxz8d34HtVQgxC.jpg" alt="Grampa's Weeder The Original Stand Up Weed Puller Tool with Long Handle"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Grampa's Weeder</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/home/stop-cranking-up-your-ac-in-a-heatwave-this-french-window-hack-could-keep-you-cool">Stop cranking up your AC in a heatwave — this 'chalk on window' hack can keep your home cool</a></li><li><a href="https://www.tomsguide.com/wellness/sleep/experts-reveal-the-bedroom-window-heatwave-mistake-making-your-sleep-worse-and-the-4-step-cooling-fix">Here's the 4-step cooling fix to use instead, plus seven hidden heat traps to avoid</a></li><li><a href="https://www.tomsguide.com/home/experts-recommend-the-caveman-method-for-keeping-your-house-cool-in-a-heatwave-heres-how-it-works">Experts recommend the 'caveman method' for keeping your house cool in a heatwave — here's how it works</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to get endless hollyhock blooms every single summer (with zero effort) ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/how-to-get-endless-hollyhock-blooms-every-single-summer-with-zero-effort</link>
                                                                            <description>
                            <![CDATA[ Hollyhock care doesn't have to be hard work. This lazy gardener's secret keeps your plants thriving and blooming year after year with zero effort. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">3YD3EpFJVBfvry46E95EZ6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/YAqNUPrEMsVciuLXoDZiKA-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 01 Jul 2026 08:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/YAqNUPrEMsVciuLXoDZiKA-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Beautiful hollyhocks growing in garden]]></media:description>                                                            <media:text><![CDATA[Beautiful hollyhocks growing in garden]]></media:text>
                                <media:title type="plain"><![CDATA[Beautiful hollyhocks growing in garden]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/YAqNUPrEMsVciuLXoDZiKA-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Hollyhocks are my absolute favorite flowers, ever, and I'm lucky enough to have a few of these beauties in my own garden. They are the ultimate cottage garden classic: tall with large, gorgeous blooms, the kind of plant that just commands attention. But they can also be incredibly frustrating. </p><p>It’s a classic gardening letdown, isn't it? You spend all summer admiring those towering stalks, only for them to vanish, leaving you wondering if you did something wrong. The trick to a reliable yearly display, however, is simply working with their natural two-year lifecycle. </p><p>By spending just a minute at the end of the season to guide their seeding process, you can easily establish a permanent, self-sustaining patch that comes back every summer.</p><section class="howto-block">                    <h3>Understanding their lifespan </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/pcCycwfZBFDGZchofRgcPX.jpg"                                        alt="Deep red hollyhocks in flower"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/pcCycwfZBFDGZchofRgcPX.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Unlike true perennials like peonies, which grow from a permanent root system that returns every spring, hollyhocks are biennials with a strict two-year lifespan. </p><p>In their first year, hollyhocks focus entirely underground, driving a massive, carrot-like taproot deep into the earth and growing a low rosette of leaves on the surface. They do not produce flowers during this initial season. </p><p>In their second year, the plant uses that stored energy to shoot up its massive flowering stalks, bloom magnificently from mid-to-late summer, drop its seeds, and completely die. </p><p>To get a permanent wall of hollyhocks year after year, you simply need to ensure that the dying second-year plants successfully drop their seeds to establish a new generation of first-year seedlings every August.</p></p>                </section><section class="howto-block">                    <h3>The 1-minute shake and scatter method</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/BaL5MqQaFHNjdgeYcuKs26.jpg"                                        alt="Dried hollyhock with seed pods on the stem "                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/BaL5MqQaFHNjdgeYcuKs26.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>As your hollyhock flowers begin to fade and drop their petals in July and August, leave the pruning shears alone.<strong> You must leave the spent flower stalks completely intact so the remaining green, button-like seed pods can form</strong> along the stem.</p><p>Leave the stalks alone until the stems turn brown and dry, and the seed pods become paper-thin and brittle. When you touch a pod and it feels like old parchment paper, the flat, dark seeds inside are fully mature.</p><p><strong>Walk down your garden bed, grab the base of the dried stalks, and give them a firm shake</strong>. Allow the papery seeds to rain down naturally into the soil directly at the base of the parent plant. </p><p>If you want to expand your display, <strong>simply snap the dry stalk off entirely, carry it to a new bare patch of soil, and gently tap it over the ground</strong>.</p></p>                </section><section class="howto-block">                    <h3>How to guarantee success </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/BsEgobs2X46yGwcJrTc89A.jpg"                                        alt="Hollyhocks growing in garden "                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/BsEgobs2X46yGwcJrTc89A.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>For this 60-second trick to work, you have to ensure the falling seeds actually hit a viable launchpad.</p></p>                </section><ul><li><strong>Ditch the bark mulch:</strong> Hardwood bark mulch chips act like a shield. Hollyhock seeds need direct contact with the soil and consistent summer moisture to germinate. If you must mulch for weed control, switch to a thin layer of rich, well-rotted compost, which naturally breaks down into a loose, fertile seedbed.<br></li><li><strong>Keep soil exposed and untilled:</strong> Ensure the ground immediately surrounding your current hollyhocks is slightly exposed. Avoid digging up or tilling this area in the autumn, as you will bury the dropped seeds too deep. They prefer to sit right on the surface.<br></li><li><strong>Learn to recognize the 'Babies':</strong> In the autumn or early the following spring, tiny new hollyhock leaves will begin to carpet the ground. They look like small, fuzzy, rounded green saucers with scalloped edges. Learn to spot them immediately so you don't accidentally pull them up during your seasonal weeding sessions.</li></ul><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ODn3me"></div>                            </div>                            <script src="https://kwizly.com/embed/ODn3me.js" async></script><figure class="van-image-figure pull-right inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:676px;"><p class="vanilla-image-block" style="padding-top:31.51%;"><img id="8RpLeaq6UZxfGpTcqGj7HX" name="Google" alt="Google" src="https://cdn.mos.cms.futurecdn.net/8RpLeaq6UZxfGpTcqGj7HX.jpg" mos="" align="right" fullscreen="" width="676" height="213" attribution="" endorsement="" class="pull-rightinline"></p></div></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/home/gardening/this-is-whats-really-causing-your-tomato-leaves-to-curl-and-how-to-actually-fix-it">This is what's really causing your tomato leaves to curl — and how to actually fix it</a></li><li><a href="https://www.tomsguide.com/home/gardening/forget-buying-new-seeds-these-9-gorgeous-flowers-come-back-for-free-every-year">Forget buying new seeds: these 9 gorgeous flowers come back for free every year</a></li><li><a href="https://www.tomsguide.com/home/lawn-care/how-to-sharpen-a-lawn-mower-blade-in-5-simple-steps-and-save-your-grass">How to sharpen a lawn mower blade in 5 simple steps (and save your grass)</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tried this zero-waste gardening hack to help my tomato plants thrive — and all I needed was a common kitchen scrap ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/i-tried-this-zero-waste-gardening-hack-to-help-my-tomato-plants-thrive-and-all-i-needed-was-a-common-kitchen-scrap</link>
                                                                            <description>
                            <![CDATA[ I'm always on the hunt for garden hacks and it turns out there's one common kitchen scrap I should've been using to help my tomatoes grow. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7hLQ9Yc9db6CTkPpSwu4K</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/AVAbuuHoEmq7gRCD4cJUTL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 30 Jun 2026 11:59:18 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Grace Dean ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oxXqkks7wgxZkPiyYY2n6H.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/AVAbuuHoEmq7gRCD4cJUTL-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Holding a homegrown tomato plant]]></media:description>                                                            <media:text><![CDATA[Holding a homegrown tomato plant]]></media:text>
                                <media:title type="plain"><![CDATA[Holding a homegrown tomato plant]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/AVAbuuHoEmq7gRCD4cJUTL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I've been having trouble with my tomatoes. As part of my grow-it-yourself mission this year, I planted a variety of vegetables in spring that I was hoping I'd be harvesting by now for some delicious summer salads. Unfortunately, my garden has had other plans. Despite taking <a href="https://www.tomsguide.com/home/im-going-to-be-trying-these-top-4-tips-to-get-my-tomatoes-tasting-as-if-they-were-grown-in-italy-after-an-italian-farmer-shared-why-i-shouldnt-rush-the-land">top tips from an Italian farmer</a> and I've even adopting a <a href="https://www.tomsguide.com/home/gardening/why-are-my-tomato-plant-leaves-turning-yellow-5-steps-to-save-your-harvest-clone">3-step pruning system</a>, I'm still always on the lookout for more ways to help my tomatoes grow.</p><p>And I've recently stumbled upon a cheap and potentially genius gardening hack that could be my answer to high-yield and hopefully ripe tomatoes. It turns out all I need is to keep the simple kitchen scrap that I've been throwing away for years – <strong>fish scraps</strong>. </p><p>Here's what happened when I gave it a try.</p><h2 id="how-does-it-work">How does it work?</h2>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@selfsufficientme/video/7200767761713204485" data-video-id="7200767761713204485" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@selfsufficientme" href="https://www.tiktok.com/@selfsufficientme">@selfsufficientme</a>                            <p>What was the last experiment you did in your garden?</p><a target="_blank" title="♬ original sound  - Self Sufficient Me" href="https://www.tiktok.com/music/original-sound-Self-Sufficient-Me-7200768217325734662">♬ original sound  - Self Sufficient Me</a></section>                    </blockquote></div>                <p>TikTok creator, <a href="https://www.tiktok.com/@selfsufficientme/" target="_blank">@selfsufficientme</a> (also known as Mark Valencia) shares his gardening tips to over 230k followers and it's one of his most popular videos of all time with 3 million views and counting that I found particularly interesting – using fish scraps for great tomatoes.</p><p>In the video above, Mark carries out an experiment where he buries fish scraps in the soil alongside his tomato plants and then plants a section with no fish scraps to see the difference as they grow. For this, he used two fish heads and no other fertilizer for one and nothing at all for the other. He then pruned and watered the plants the same to see how they'd fare. </p><p>While he noticed that the no fish heads tomato plant was growing better to begin with, as well as having the first ripe tomatoes, it quickly changed. He says once they both produced tomatoes: "It was noticeable that the fish head tomatoes were also producing more fruit. After the five to six month mark in October, there was a considerable difference beginning to show between the two plants.</p><p>"The ones with the fish head were still growing strong with much better fruit and foliage growth than the ones without the fish head which were pale, dying back and had practically stopped producing new tomatoes."</p><p>The fish works as a fertilizer around the tomato plants roots and as it decomposes, it releases nutrients like phosphorus and potassium that the tomato plant can thrive on. While I thought it was strange that I'd never heard of it before, I figured it was time for me to give it a go. </p><h2 id="here-s-what-happened-when-i-tried-it">Here's what happened when I tried 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ybpqyfqtMJj82jKWwxVz94" name="tomato_plant_hack" alt="Soil for planting" src="https://cdn.mos.cms.futurecdn.net/ybpqyfqtMJj82jKWwxVz94.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>Admittedly, when I first saw Mark's video, I thought it was kind of gross. I don't tend to cut up whole raw fish regularly, but I do from time to time. Since I was planning on firing up my grill this summer, I figured it would be a good time to give it a go. </p><p>While I'd usually just opt to throw the fish scraps away quickly, this time I held on to them. </p><p>Yes, I was tempted to buy the fish emulsion fertilizer straight from the shops; I also knew from Mark's video that it would be better to try this out with fresh fish to hopefully get the best results (and that it would also be a lot cheaper). So, I chopped up some bits of fish and buried them down into the soil where I was planting my tomato plants.</p><div class="product"><a data-dimension112="1c9c8951-38b0-4fc4-9f9d-e36e6829f168" data-action="Deal Block" data-label="If you're looking to do an experiment of your own or don't tend to cut up raw fish, you can also buy a fish emulsion fertilizer that you dilute with some water. With this 16oz bottle, you can use it on plants both indoors and outdoors to help them grow." data-dimension48="If you're looking to do an experiment of your own or don't tend to cut up raw fish, you can also buy a fish emulsion fertilizer that you dilute with some water. With this 16oz bottle, you can use it on plants both indoors and outdoors to help them grow." data-dimension25="$12.40" href="https://www.amazon.com/Fertilome-10611-Emulsion-Fertilizer-5-1-1/dp/B0055SAEM6/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:535px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="qeuti7LefEi7xJfKaeo3nd" name="fish_fertilizer_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qeuti7LefEi7xJfKaeo3nd.jpg" mos="" align="middle" fullscreen="" width="535" height="535" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're looking to do an experiment of your own or don't tend to cut up raw fish, you can also buy a fish emulsion fertilizer that you dilute with some water. With this 16oz bottle, you can use it on plants both indoors and outdoors to help them grow.<a class="view-deal button" href="https://www.amazon.com/Fertilome-10611-Emulsion-Fertilizer-5-1-1/dp/B0055SAEM6/" target="_blank" rel="nofollow" data-dimension112="1c9c8951-38b0-4fc4-9f9d-e36e6829f168" data-action="Deal Block" data-label="If you're looking to do an experiment of your own or don't tend to cut up raw fish, you can also buy a fish emulsion fertilizer that you dilute with some water. With this 16oz bottle, you can use it on plants both indoors and outdoors to help them grow." data-dimension48="If you're looking to do an experiment of your own or don't tend to cut up raw fish, you can also buy a fish emulsion fertilizer that you dilute with some water. With this 16oz bottle, you can use it on plants both indoors and outdoors to help them grow." data-dimension25="$12.40">View Deal</a></p></div><p>For now, I'm not at the stage where I can pass a judgment on how well my tomato plants are doing because it'll take some time. But, I can happily say that it was relatively fuss-free and I can now truly feel like I'm not wasting anything when buying a whole fish as I'm utilizing every single part of it. Plus, the grilled fish in itself was an extra treat.</p><p>So, it didn't cost me any additional cash to try it out and I'm pretty hopeful that from Mark's results, I'll be able to yield some lovely ripe tomatoes in a two to three months time. I'm just hoping they don't taste like fish when I get round to eating them...</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XZQZ5O"></div>                            </div>                            <script src="https://kwizly.com/embed/XZQZ5O.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/home/gardening/this-cheap-garden-hack-will-help-your-roses-grow-and-all-you-need-is-a-few-old-tea-bags">This cheap garden hack will help your roses grow — and all you need is a few old tea bags</a></li><li><a href="https://www.tomsguide.com/home/ive-just-discovered-this-strange-hack-thatll-keep-pests-away-from-your-plants-and-it-uses-a-popular-cold-medicine">I've just discovered this strange hack that'll keep pests away from your plants — and it uses a popular cold medicine</a></li><li><a href="https://www.tomsguide.com/home/gardening/this-garden-hack-will-help-your-plants-thrive-and-all-you-need-to-do-is-boil-some-eggs">This garden hack will help your plants thrive — and all you need to do is boil some eggs</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve just discovered this clever hack to cool down my bedroom without using a fan — and you just need this bathroom item ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/ive-just-discovered-this-clever-hack-to-cool-down-my-bedroom-without-using-a-fan-and-you-just-need-this-bathroom-item</link>
                                                                            <description>
                            <![CDATA[ Here’s how to keep your bedroom cool without a fan — and you just need this one bathroom item (no electricity required). ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">5L8tEs6d4GqSicHjkg5S3E</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sQzbC9o9eTH4wLsYRgujyj-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 30 Jun 2026 11:03:14 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/sQzbC9o9eTH4wLsYRgujyj-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A woman struggling in a heatwave in front of a fan ]]></media:description>                                                            <media:text><![CDATA[A woman struggling in a heatwave in front of a fan ]]></media:text>
                                <media:title type="plain"><![CDATA[A woman struggling in a heatwave in front of a fan ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sQzbC9o9eTH4wLsYRgujyj-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As temperatures start soaring, getting a comfortable night’s sleep during a sweltering heatwave can often be a nightmare. Even if you run your fan on full blast, the constant whirring sound can be just as disturbing — while quietly driving up your electricity bills overnight.</p><p>Fortunately, I've just discovered a smart way to help you stay cool at night without costing you. Not only is it a simple and practically ‘free’, but it involves a common bathroom staple that everyone has.</p><p>So if you want a quick way to chill out, check out this simple yet genius trick to help you survive a heatwave.</p><h3 class="article-body__section" id="section-hang-a-damp-towel-in-front-of-your-window"><span>Hang a damp towel in front of your window</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5436px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZwoAM2M8QNZvSdLLt4gAnd" name="Main 2.jpg" alt="Six white towels stacked and rolled on a wooden surface" src="https://cdn.mos.cms.futurecdn.net/ZwoAM2M8QNZvSdLLt4gAnd.jpg" mos="" align="middle" fullscreen="" width="5436" height="3058" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Six white towels stacked and rolled on a wooden surface </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>According to home experts, cracking open a window and draping a sheet or towel thoroughly soaked in cold water right in front of the breeze serves as a brilliant hack to cool your room's temperature.</p><p>This strange method works by instantly chilling the incoming outdoor heat as it flows through the wet material, blowing a refreshing breeze straight into your space. Essentially, the moisture from the towel absorbs the warmth from the outdoor air right at the window before it can flow inside your room.</p><p>So how can you do this? Simply fill a bowl or sink with water, and slightly dampen your towel (don’t soak it, or else it won’t work). Next, hang the towel in front of an open window to maximize the breeze, or if you prefer, you can also hang a towel across a doorway.</p><p>You’ll start to notice that your bedroom should feel considerably cooler and more comfortable throughout the evening (without any noise). Once the towel has dried out, simply re-dampen it, and replace What’s more, this uses zero electricity and will further save you on your energy bills — a win-win. </p><p>Alternatively, a sleep expert has suggested another strange hack to keep cool — sleep in damp socks!  “This is an extremely strange one, but definitely hear me out,” adds Dr Deborah Lee, sleep expert from <a href="https://tx.bz-mail-us1.com/1/l/8f745a7a23204d0081fd7336187268b7?rl=https%3A%2F%2Fwww.doctorfox.co.uk%2F" target="_blank">Doctor Fox</a> working with <a href="https://tx.bz-mail-us1.com/1/l/b2915d211a984c3e9f7b7bf90825f91f?rl=https%3A%2F%2Fcomfybedss.co.uk%2Fcollections%2Fottoman-beds" target="_blank">Comfybedss</a><u>.</u></p><p>“Wearing a pair of slightly damp cotton socks to bed can help us bring our core body temperature down through a process called evaporative cooling.</p><p>Our feet play a huge part in helping our body’s temperature regulate, so keeping them cool is vital and has a knock-on effect on the whole body. Rinse the socks out under the tap, wring them up so they’re not dripping and pop them on before bedtime.”  </p><p>So if you ever want a quick way to instantly cool down your bedroom in a heatwave — or you're stuck without a fan, put your bathroom towels to good use instead. </p><div class="product"><a data-dimension112="f5294d7a-c942-4231-ad9b-bd9f3e751322" data-action="Deal Block" data-label="Amazon" data-dimension48="Amazon" data-dimension25="$149" href="https://www.amazon.com/NEW-Shark-ChillPill-InstaChill-Rechargeable/dp/B0GGTK6RXN" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:911px;"><p class="vanilla-image-block" style="padding-top:164.65%;"><img id="QV9RbWbcgW4KvhYwrmb8kb" name="Shark ChillPill" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QV9RbWbcgW4KvhYwrmb8kb.jpg" mos="" align="middle" fullscreen="" width="911" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The ChillPill is the brand's latest innovation in handheld personal cooling. It comes with three attachments, including a fan cap, misting pod, and InstaChill cooling plate for every need.  It also comes with a digital LCD screen and up to 11 hours of battery life. If you're hoping to keep cool this summer, this could be the fan you've been looking for. <br></p><p>For those in the UK, the Chill Pill costs £129 and is available on <a href="https://www.amazon.co.uk/Shark-High-Speed-Attachments-Travel-Friendly-FA022UKBR/dp/B0GKPSG7WT" target="_blank" rel="nofollow" data-dimension112="f5294d7a-c942-4231-ad9b-bd9f3e751322" data-action="Deal Block" data-label="Amazon" data-dimension48="Amazon" data-dimension25="$149">Amazon </a>and Shark's website. <a class="view-deal button" href="https://www.amazon.com/NEW-Shark-ChillPill-InstaChill-Rechargeable/dp/B0GGTK6RXN" target="_blank" rel="nofollow" data-dimension112="f5294d7a-c942-4231-ad9b-bd9f3e751322" data-action="Deal Block" data-label="Amazon" data-dimension48="Amazon" data-dimension25="$149">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/wellness/sleep/frozen-bed-sheets-and-cold-spoons-weird-tips-for-how-to-sleep-cool-during-a-heatwave">Frozen bed sheets and cold spoons — weird tips for how to sleep cool during a heatwave</a></li><li><a href="https://www.tomsguide.com/how-to/ways-to-prepare-your-ac-for-a-heatwave">5 ways to prepare your AC for a heatwave</a></li><li><a href="https://www.tomsguide.com/how-to/how-to-cool-down-a-room">How to cool down a room in a heatwave — 10 essential tips</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Stop your compost smelling bad this summer — just do these 3 easy things ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/stop-your-compost-smelling-bad-this-summer-just-do-these-3-easy-things</link>
                                                                            <description>
                            <![CDATA[ Is your backyard smelly? Your compost bin could be the culprit. Here’s how to stop your compost from smelling bad in the summer. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">j9m92rw5AwVJGMmhdex7vg</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ivLAVsqCwt792XHqzJTjS7-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 29 Jun 2026 12:16:16 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ivLAVsqCwt792XHqzJTjS7-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Someone adding fresh produce to the compost heap]]></media:description>                                                            <media:text><![CDATA[Someone adding fresh produce to the compost heap]]></media:text>
                                <media:title type="plain"><![CDATA[Someone adding fresh produce to the compost heap]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ivLAVsqCwt792XHqzJTjS7-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Summer is here, and it's the ideal time to get outdoors in your backyard and enjoy the weather. However, foul odors coming from your composting bin can quickly ruin that outdoor enjoyment. This is especially true if you plan to host Fourth of July festivities.</p><p>Learning <a href="https://www.tomsguide.com/home/h">how to make compost at home</a> is an eco-friendly and cost-effective way to transform organic waste into valuable nutrients for our <a href="https://www.tomsguide.com/news/things-to-get-your-garden-ready-for-spring">gardens</a> and <a href="https://www.tomsguide.com/how-to/5-signs-your-lawn-needs-urgent-repairs">lawn care</a>. But if your compost bin is starting to smell rancid in the heat, you could be making one of these <a href="https://www.tomsguide.com/how-to/7-composting-mistakes-to-avoid">composting mistakes</a>. </p><p>Whether it's throwing the wrong waste into the bin, not turning it over enough, or excess moisture, these can all contribute to your compost smelling bad. Luckily, this can be resolved with a few quick fixes that won’t take much time.</p><p>So if you want to quickly get rid of horrid compost smells this summer, try these top tips. </p><h3 class="article-body__section" id="section-1-sprinkle-baking-soda-to-absorb-odors"><span>1. Sprinkle baking soda to absorb odors</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CrUmHtVipzKWzXbY8hvyDg" name="shutterstock_2195810409" alt="Baking soda being used in garden" src="https://cdn.mos.cms.futurecdn.net/CrUmHtVipzKWzXbY8hvyDg.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Baking soda being used in garden </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Baking soda may be a pantry staple, but it’s also known for its natural deodorizing properties. In fact, I have a bowl in my fridge to eliminate lingering odors, and there are <a href="https://www.tomsguide.com/home/5-ways-to-use-baking-soda-in-your-yard-and-an-extra-tip-on-how-to-sweeten-tomatoes">many ways to use baking soda in your yard.</a></p><p>Simply sprinkle baking soda over your compost heap once you detect a whiff. This should help absorb lingering odors and prevent them from causing a stench. </p><p>Bear in mind to apply this remedy with a light hand, as overdoing it can actually stifle beneficial microbial activity and heavily stall the breakdown process.</p><h3 class="article-body__section" id="section-2-regularly-turn-over-your-compost"><span>2. Regularly turn over your compost</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5607px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iLfbF7iPH9eyxD98sW3zvm" name="shutterstock_2079445645.jpg" alt="Compost tumbler" src="https://cdn.mos.cms.futurecdn.net/iLfbF7iPH9eyxD98sW3zvm.jpg" mos="" align="middle" fullscreen="" width="5607" height="3154" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Typically, materials high in nitrogen content are the worst culprits when it comes to making a stench. Not only do you need the correct 3:1 ratio of brown to green materials by volume, but you also need to turn it over periodically. </p><p>Just like growing plants, compost also needs oxygen and water to produce top-quality, healthy soil.</p><p>As it’s decomposing, the middle of your heap can easily become deprived of oxygen, requiring a bit of aeration. Thoroughly mixing the mixture helps it break down much faster while preventing organic waste from compacting and creating a rancid stench.</p><p>You can easily introduce oxygen throughout the heap by using a garden fork or spade to mix it well. Just be careful not to overfill the bin; otherwise, you won't have adequate space to turn the contents over without making a mess. </p><p>In fact, compost tumblers are super easy to use. These feature chambers for adding and removing compost, and aeration holes that allow air in each time you turn it. This is especially useful since composting involves turning it over now and again to allow air to all parts.</p><div class="product"><a data-dimension112="059b051f-c2ce-45c3-b044-007bd3936cd3" data-action="Deal Block" data-label="This 2 X 18.5-gallon bin features two separate chambers for the composting process, while the other side receives fresh scraps. Easy to install and use, its rotating design eliminates the need for hand mixing or digging, and the deep fins on the eight panels make it easy to turn the compost. Plus, it's a great way to compost in small outdoor spaces." data-dimension48="This 2 X 18.5-gallon bin features two separate chambers for the composting process, while the other side receives fresh scraps. Easy to install and use, its rotating design eliminates the need for hand mixing or digging, and the deep fins on the eight panels make it easy to turn the compost. Plus, it's a great way to compost in small outdoor spaces." data-dimension25="$69" href="https://www.amazon.com/EAST-OAK-Rotating-Composter-Aeration/dp/B0CXSZG3SV" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1352px;"><p class="vanilla-image-block" style="padding-top:110.95%;"><img id="NY56wyAdhd5rGbkhvNYmcQ" name="East Oak Dual Chamber Outdoor Compost Tumbler" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NY56wyAdhd5rGbkhvNYmcQ.jpg" mos="" align="middle" fullscreen="" width="1352" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This 2 X 18.5-gallon bin features two separate chambers for the composting process, while the other side receives fresh scraps. Easy to install and use, its rotating design eliminates the need for hand mixing or digging, and the deep fins on the eight panels make it easy to turn the compost. Plus, it's a great way to compost in small outdoor spaces. <a class="view-deal button" href="https://www.amazon.com/EAST-OAK-Rotating-Composter-Aeration/dp/B0CXSZG3SV" target="_blank" rel="nofollow" data-dimension112="059b051f-c2ce-45c3-b044-007bd3936cd3" data-action="Deal Block" data-label="This 2 X 18.5-gallon bin features two separate chambers for the composting process, while the other side receives fresh scraps. Easy to install and use, its rotating design eliminates the need for hand mixing or digging, and the deep fins on the eight panels make it easy to turn the compost. Plus, it's a great way to compost in small outdoor spaces." data-dimension48="This 2 X 18.5-gallon bin features two separate chambers for the composting process, while the other side receives fresh scraps. Easy to install and use, its rotating design eliminates the need for hand mixing or digging, and the deep fins on the eight panels make it easy to turn the compost. Plus, it's a great way to compost in small outdoor spaces." data-dimension25="$69">View Deal</a></p></div><div class="product"><a data-dimension112="97e86430-3953-419a-b8d2-bc0b0962c945" data-action="Deal Block" data-label="This 2 X 18.5 gallon bin features two separate chambers for the composting process, while the other side receives fresh scraps. Easy to install and use, its rotation design eliminates the need for hand mixing or digging, and the deep fins on the eight panels make it easy to turn the compost around. Plus, it's a great way to compost in small outdoor spaces." data-dimension48="This 2 X 18.5 gallon bin features two separate chambers for the composting process, while the other side receives fresh scraps. Easy to install and use, its rotation design eliminates the need for hand mixing or digging, and the deep fins on the eight panels make it easy to turn the compost around. Plus, it's a great way to compost in small outdoor spaces." data-dimension25="$64" href="https://www.amazon.com/EAST-OAK-Rotating-Composter-Aeration/dp/B0CXSZG3SV" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1352px;"><p class="vanilla-image-block" style="padding-top:110.95%;"><img id="NY56wyAdhd5rGbkhvNYmcQ" name="East Oak Dual Chamber Outdoor Compost Tumbler" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NY56wyAdhd5rGbkhvNYmcQ.jpg" mos="" align="middle" fullscreen="" width="1352" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This 2 X 18.5 gallon bin features two separate chambers for the composting process, while the other side receives fresh scraps. Easy to install and use, its rotation design eliminates the need for hand mixing or digging, and the deep fins on the eight panels make it easy to turn the compost around. Plus, it's a great way to compost in small outdoor spaces. <a class="view-deal button" href="https://www.amazon.com/EAST-OAK-Rotating-Composter-Aeration/dp/B0CXSZG3SV" target="_blank" rel="nofollow" data-dimension112="97e86430-3953-419a-b8d2-bc0b0962c945" data-action="Deal Block" data-label="This 2 X 18.5 gallon bin features two separate chambers for the composting process, while the other side receives fresh scraps. Easy to install and use, its rotation design eliminates the need for hand mixing or digging, and the deep fins on the eight panels make it easy to turn the compost around. Plus, it's a great way to compost in small outdoor spaces." data-dimension48="This 2 X 18.5 gallon bin features two separate chambers for the composting process, while the other side receives fresh scraps. Easy to install and use, its rotation design eliminates the need for hand mixing or digging, and the deep fins on the eight panels make it easy to turn the compost around. Plus, it's a great way to compost in small outdoor spaces." data-dimension25="$64">View Deal</a></p></div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XmoLEW"></div>                            </div>                            <script src="https://kwizly.com/embed/XmoLEW.js" async></script><h3 class="article-body__section" id="section-3-throw-in-more-brown-materials"><span>3. Throw in more brown materials</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4621px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="RMjiU82Eu7RFhqbFSszB7o" name="Compost - crop.jpg" alt="Composting leaves in a bin" src="https://cdn.mos.cms.futurecdn.net/RMjiU82Eu7RFhqbFSszB7o.jpg" mos="" align="middle" fullscreen="" width="4621" height="2599" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Composting leaves in a bin </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Another reason for smelly compost could be that your pile is too wet from overwatering (or even underwatering).  </p><p>While keeping your heap damp with a light misting is fine, avoid giving too much or too little water. Excessive moisture can quickly drown your pile, suffocating the beneficial microbes that break down the waste. This common composting mistake creates a foul odor, causing the materials to rot rather than break down properly.</p><p>One solution is to add in some dry brown materials (like garden waste or cardboard) to absorb the excess liquid, or give it a good turn with a garden fork to increase aeration. On the other hand, if your compost looks completely dry and brittle, simply add more fresh green waste and sprinkle it with a bit of water to restore moisture.</p><p>Furthermore, the <a href="https://www.tomsguide.com/home/5-benefits-of-composting-and-how-it-can-enrich-more-than-your-yard">benefits of composting extend beyond just enriching our yards</a>. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/how-to/7-composting-tips-everyone-needs-to-know">7 composting tips everyone needs to know</a></li><li><a href="https://www.tomsguide.com/home/gardening/your-peace-lily-wont-survive-winter-if-you-dont-change-these-5-things">Your peace lily won't survive winter if you don't change these 5 things</a></li><li><a href="https://www.tomsguide.com/home/dont-let-winter-de-icing-ruin-your-lawn-5-grass-safe-ways-to-clear-ice">Stop killing your grass: 5 safe de-icing methods you need to know</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 ways to use baking soda in your yard — and an extra tip on how to sweeten tomatoes ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/5-ways-to-use-baking-soda-in-your-yard-and-an-extra-tip-on-how-to-sweeten-tomatoes</link>
                                                                            <description>
                            <![CDATA[ Why you should keep a box of baking soda in your shed: 5 gardening hacks to try. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">RZfJ6SGEccp46TAxazfANV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/CrUmHtVipzKWzXbY8hvyDg-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 29 Jun 2026 05:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/CrUmHtVipzKWzXbY8hvyDg-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Baking soda being used in garden]]></media:description>                                                            <media:text><![CDATA[Baking soda being used in garden]]></media:text>
                                <media:title type="plain"><![CDATA[Baking soda being used in garden]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/CrUmHtVipzKWzXbY8hvyDg-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Baking soda is a standard kitchen staple, used to help doughs and batters rise. But apart from its role as a leavening agent, it’s commonly used at home as a cleaner and deodorizer. </p><p>I use baking soda combined with dish soap to <a href="https://www.google.com/search?q=how+to+remove+grease+toms+guide&rlz=1C1GCFR_enGB1150GB1150&oq=how+to+remove+grease+toms+guide&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIHCAEQIRigATIHCAIQIRirAjIHCAMQIRirAtIBCDg0ODBqMGo3qAIAsAIA&sourceid=chrome&ie=UTF-8">remove grease stains from clothing</a>, and combined with vinegar to clean my <a href="https://www.tomsguide.com/home/how-to-remove-burnt-on-grease-from-ovens-and-pans">pots and pans</a>. At the same time, I make a paste with water to <a href="https://www.tomsguide.com/home/how-to-remove-yellow-stains-off-a-toilet-seat-its-easy-when-you-know-how">clean yellow stains off my toilet</a>.  I also use it to combat fridge and garbage can odors and freshen stinky shoes and carpets. </p><p>But aside from being handy around the home, this miraculous product, which is ultra-cheap and eco-friendly, can be used in many ways around the garden. Here I share five top ways to use baking soda in your yard, with a bonus tip for tomato growers.</p><h2 id="1-soil-tester-is-it-acidic-or-alkaline">1. Soil tester — is it acidic or alkaline?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5112px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="j5HetCxRFYv57SMtTAyzFU" name="shutterstock_658663849.jpg" alt="Soil being picked up by a hand" src="https://cdn.mos.cms.futurecdn.net/j5HetCxRFYv57SMtTAyzFU.jpg" mos="" align="middle" fullscreen="" width="5112" height="2876" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>You can use baking soda to find out whether your soil is acidic or alkaline, although it won’t give you a true gauge of its exact pH level. However, it’s a fun experiment to try, especially if you’ve got young children happy to help you out.</p><p><strong>What to do: </strong></p><p><strong>1. </strong>Take a jar and partly fill it with soil.</p><p><strong>2.</strong> In a second container, mix two teaspoons of baking powder with 3.5 fl oz of water. </p><p><strong>3.</strong> Pour the solution onto the soil. If it bubbles, your soil is acidic, but if there’s no change, your soil is alkaline.</p><p>For a more accurate reading of your soil’s pH level, I recommend using a soil testing kit. </p><div class="product"><a data-dimension112="f702d6d3-ba24-4656-afe1-1abc4e7f305f" data-action="Deal Block" data-label="This kit contains 100 test strips, and can measure the acidity or alkaline levels in your soil from pH 3.5-9. It also comes with a handbook with tips on how to change the pH level in your soil." data-dimension48="This kit contains 100 test strips, and can measure the acidity or alkaline levels in your soil from pH 3.5-9. It also comes with a handbook with tips on how to change the pH level in your soil." data-dimension25="$12" href="https://www.amazon.com/Garden-Tutor-Strips-3-5-9-Range/dp/B07YZT5ZPJ" 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="3tehdDuxgvEqUQZnuJc5Vh" name="Garden Tutor.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3tehdDuxgvEqUQZnuJc5Vh.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This kit contains 100 test strips, and can measure the acidity or alkaline levels in your soil from pH 3.5-9. It also comes with a handbook with tips on how to change the pH level in your soil.<a class="view-deal button" href="https://www.amazon.com/Garden-Tutor-Strips-3-5-9-Range/dp/B07YZT5ZPJ" target="_blank" rel="nofollow" data-dimension112="f702d6d3-ba24-4656-afe1-1abc4e7f305f" data-action="Deal Block" data-label="This kit contains 100 test strips, and can measure the acidity or alkaline levels in your soil from pH 3.5-9. It also comes with a handbook with tips on how to change the pH level in your soil." data-dimension48="This kit contains 100 test strips, and can measure the acidity or alkaline levels in your soil from pH 3.5-9. It also comes with a handbook with tips on how to change the pH level in your soil." data-dimension25="$12">View Deal</a></p></div><h2 id="2-deodorize-stinky-compost">2. Deodorize stinky compost</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4281px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ivLAVsqCwt792XHqzJTjS7" name="shutterstock_198981536.jpg" alt="Someone adding fresh produce to the compost heap" src="https://cdn.mos.cms.futurecdn.net/ivLAVsqCwt792XHqzJTjS7.jpg" mos="" align="middle" fullscreen="" width="4281" height="2408" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Although my compost bin is at the end of my garden, away from any sitting areas, it can still get a bit smelly. And apparently, materials high in nitrogen content are the worst culprits when it comes to making a stink.</p><p>Luckily, baking soda’s odor-neutralizing properties can help reduce the unpleasant stench by balancing the acidic compounds that cause it. </p><p><strong>What to do</strong><br>Sprinkle a small amount of baking soda over the top of your compost pile as soon as it begins to smell. But use it sparingly, as too much will inhibit bacterial growth and slow the material's decomposition.</p><p>If the baking soda doesn’t quite do the job, try adding some more brown material to the mix and turn it over.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eBjkAe"></div>                            </div>                            <script src="https://kwizly.com/embed/eBjkAe.js" async></script><h2 id="3-deter-pests">3. Deter pests</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8f559SXkQok3ams95Z4JNb" name="shutterstock_2381273319 (1).jpg" alt="How to make homemade bug repellent" src="https://cdn.mos.cms.futurecdn.net/8f559SXkQok3ams95Z4JNb.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: Shutterstock)</span></figcaption></figure><p>Baking soda can be used in several ways to deter pests. If you have a problem with aphids, thrips and white flies, simply spraying plant leaves with a solution containing baking soda can help.</p><p><strong>What to do</strong></p><p><strong>1.</strong> Mix one quart of water with two teaspoons of baking soda.</p><p><strong>2.</strong> Add one teaspoon of neem oil and one teaspoon of soap.</p><p><strong>3. </strong>Give everything a thorough mix and pour the solution into a spray bottle.</p><p><strong>4. </strong>Spray a small amount on one leaf of the plant. If it doesn’t wilt, spray the remaining leaves.</p><p><strong>It can also be used as an insecticide</strong></p><p>When sprinkled around plants, baking soda can deter slugs and ants; with ants in particular, it disrupts their ability to maintain scent trails. The baking soda acts as a desiccant, drying out soft-bodied insects.</p><p>However, it’s best to sprinkle the baking soda around the base of container pots; if sprinkled directly onto soil, it can seep below the surface and damage the roots. <br></p><h2 id="4-control-fungal-disease">4. Control fungal disease</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="okBtG5dbjhEqimLMzmAKcP" name="shutterstock_2233545763edit.jpg" alt="Black spot showing on rose foliage" src="https://cdn.mos.cms.futurecdn.net/okBtG5dbjhEqimLMzmAKcP.jpg" mos="" align="middle" fullscreen="" width="1800" height="1013" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Gardeners often use baking soda to help control fungus in their yards, such as black spot, powdery mildew, root wilt and rust. The baking soda works by raising the pH level on leaf surfaces, making it more difficult for fungus to survive. </p><p>However, it’s more likely to slow the growth of fungicides, rather than to act as a cure.  </p><p><strong>What to do</strong></p><p><strong>1.</strong> Mix one teaspoon of baking soda and one teaspoon of soap into one quart of water. </p><p><strong>2. </strong>Place the solution into a spray bottle and spray onto infected areas. </p><p><strong>3.</strong> Continue to spray once a week to prevent the fungus from coming back.</p><h2 id="5-clean-up">5. Clean 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yCG332BLeaKP552ZsWQYDT" name="shutterstock_2268075029" alt="Gardener's dirty hands" src="https://cdn.mos.cms.futurecdn.net/yCG332BLeaKP552ZsWQYDT.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Once you’ve been digging in the garden, planting seeds or pruning, you’ll want to give your hands a good wash to clean away all the soil. And even if you have been wearing one of the <a href="https://www.tomsguide.com/best-picks/best-gardening-gloves">best pairs of gardening gloves</a>, they’ll still need a good wash.</p><p>While you’re giving your hands a thorough clean with soap, add a small amount of baking soda, it will act as an abrasive to help shift the grime. What’s more, it can even be used with vinegar to <a href="https://www.tomsguide.com/home/outdoors/how-to-spring-clean-your-gardening-tools-two-household-ingredients-that-really-work">clean your gardening tools.</a></p><h2 id="bonus-tip-improve-your-tomatoes">Bonus tip — improve your tomatoes</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5990px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="35xUxxG3VM9b8kqFBBpiyL" name="shutterstock_1931910020.jpg" alt="Tony Tim cherry tomatoes" src="https://cdn.mos.cms.futurecdn.net/35xUxxG3VM9b8kqFBBpiyL.jpg" mos="" align="middle" fullscreen="" width="5990" height="3369" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>There is some thought that baking soda can help sweeten <a href="https://www.tomsguide.com/home/gardening/toms-guide-to-tomatoes">tomatoes</a> by reducing soil acidity, and we already know it can neutralize acidic soils.</p><p><strong>What to do</strong></p><p>Sprinkle a small amount of baking soda around the base of your tomato plants, avoiding the plant itself. It’s best applied during the plant’s early growth stages. </p><p>However, be careful how much you apply. If you’re too heavy-handed, the baking soda can harm the soil structure and interfere with nutrient uptake. It’s also a salt, which can burn or stunt your plant if you apply too much.</p><p>However, there is no exact science behind this tomato sweetening hack. For reliable results, opt to grow sweet varieties, such as Sungold, Sweet Million or Cherokee Purple, which naturally have high sugar content.</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/gardening-pros-swear-by-this-ingenious-tomato-watering-trick-try-it-for-juicier-plumper-tomatoes">Gardening pros swear by this ingenious tomato-watering trick — try it for juicier, plumper tomatoes</a></li><li><a href="https://www.tomsguide.com/home/gardening/this-10-minute-gardening-routine-has-made-a-huge-difference-to-my-outdoor-space-heres-why-i-do-it-every-evening">This 10-minute gardening routine has made a huge difference to my outdoor space — here's why I do it every evening</a></li><li><a href="https://www.tomsguide.com/home/supercharge-your-yard-without-spending-a-dime-5-household-items-to-repurpose-right-now">Supercharge your yard without spending a dime: 5 household items to repurpose right now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Create the ultimate hummingbird hangout this summer: 5 essential upgrades starting from $3 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/create-the-ultimate-hummingbird-hangout-this-summer-5-essential-upgrades-starting-from-usd3</link>
                                                                            <description>
                            <![CDATA[ Turn your backyard into a VIP lounge for hummingbirds: 5 products worth grabbing in the Prime Day Sales. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">FktDqvw6Y2fSRmD7SLVgZZ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/JPKEDcN7FB7ePXFfiZFqVY-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 26 Jun 2026 10:44:20 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/JPKEDcN7FB7ePXFfiZFqVY-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Hummingbird with Prime Day badge]]></media:description>                                                            <media:text><![CDATA[Hummingbird with Prime Day badge]]></media:text>
                                <media:title type="plain"><![CDATA[Hummingbird with Prime Day badge]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/JPKEDcN7FB7ePXFfiZFqVY-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’m here to help you turn your backyard into the ultimate hummingbird paradise this summer. These tiny, energetic creatures will appreciate not only somewhere to feed, but a place to cool down and chill. </p><p>And with all my top picks in the <a href="https://www.tomsguide.com/live/news/prime-day-summer-sales-editors-top-deals-2026">Prime Day sales</a> right now, you can help support these tiny beauties in the heat for less. </p><p>Attract them to your yard with a colorful hummingbird feeder and fill it with calorie-rich nectar; give them some time to play on a swing and enjoy a breeze; and watch them cool down in a bird bath with a solar sprinkler. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong>Burpee Hummingbird & Butterfly Wildflower Seeds: </strong><a href="https://www.amazon.com/Burpee-Wildflower-Seed-Mix-Hummingbirds/dp/B077XD5NJ7/ref=sr_1_13_sspa?" target="_blank" rel="nofollow"><strong>was $8 now $3</strong></a></li><li><strong>Mixxidea Hummingbird Swing (3-pack): </strong><a href="https://www.amazon.com/Hummingbird-Swing-Perch-Wooden-Outdoor/dp/B09F5YG5CW/ref=sr_1_9?" target="_blank" rel="nofollow"><strong>was $13 now $11</strong></a></li><li><strong>Kingsland Glass Hummingbird Feeder: </strong><a href="https://www.amazon.com/gp/aw/d/B08W43F9TC/?" target="_blank" rel="nofollow"><strong>was $17 now $14</strong></a></li><li><strong>Hummer's Galore Hummingbird Food: </strong><a href="https://www.amazon.com/Hummers-Hummingbird-Natural-Healthy-Hummingbirds/dp/B00JTI4HIK/ref=sr_1_3_sspa?" target="_blank" rel="nofollow"><strong>was $35 now $28</strong></a></li><li><strong>Vivohome Bird Bath with Solar Fountain: </strong><a href="https://www.amazon.com/VIVOHOME-Polyresin-Antique-Outdoor-Fountain/dp/B0876H67LP/ref=sr_1_20_sspa?" target="_blank" rel="nofollow"><strong>was $59 now $47</strong></a></li></ul><h3 class="article-body__section" id="section-my-favorite-deals"><span>My favorite deals</span></h3><div class="product"><a data-dimension112="b2d6244d-ea37-4b95-afda-0248e00e24b3" data-action="Deal Block" data-label="This pack of wildflower seeds will attract hummingbirds and butterflies to your yard. Each pack contains a mix of 18 flower varieties, including calendula, cornflower, cosmos and foxgloves. Scatter them in a sunny area, after the last chance of frost has past." data-dimension48="This pack of wildflower seeds will attract hummingbirds and butterflies to your yard. Each pack contains a mix of 18 flower varieties, including calendula, cornflower, cosmos and foxgloves. Scatter them in a sunny area, after the last chance of frost has past." data-dimension25="$3" href="https://www.amazon.com/Burpee-Wildflower-Seed-Mix-Hummingbirds/dp/B077XD5NJ7/ref=sr_1_13_sspa?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:583px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vHmavX6T7wt33ttMQspaf8" name="Burpee Hummingbird & Wildflower seed mix" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vHmavX6T7wt33ttMQspaf8.jpg" mos="" align="middle" fullscreen="" width="583" height="583" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This pack of wildflower seeds will attract hummingbirds and butterflies to your yard. Each pack contains a mix of 18 flower varieties, including calendula, cornflower, cosmos and foxgloves. Scatter them in a sunny area, after the last chance of frost has past.<a class="view-deal button" href="https://www.amazon.com/Burpee-Wildflower-Seed-Mix-Hummingbirds/dp/B077XD5NJ7/ref=sr_1_13_sspa?" target="_blank" rel="nofollow" data-dimension112="b2d6244d-ea37-4b95-afda-0248e00e24b3" data-action="Deal Block" data-label="This pack of wildflower seeds will attract hummingbirds and butterflies to your yard. Each pack contains a mix of 18 flower varieties, including calendula, cornflower, cosmos and foxgloves. Scatter them in a sunny area, after the last chance of frost has past." data-dimension48="This pack of wildflower seeds will attract hummingbirds and butterflies to your yard. Each pack contains a mix of 18 flower varieties, including calendula, cornflower, cosmos and foxgloves. Scatter them in a sunny area, after the last chance of frost has past." data-dimension25="$3">View Deal</a></p></div><div class="product"><a data-dimension112="9114de63-fde6-4a56-a7d4-37376443d399" data-action="Deal Block" data-label="This pack of three swings is designed for hummingbirds to perch on. The metal swings have a wooden perch and come in three attractive designs, each with a metal chain and hook for attaching to a branch. Place them near your patio or hummingbird feeder and watch the birds have fun." data-dimension48="This pack of three swings is designed for hummingbirds to perch on. The metal swings have a wooden perch and come in three attractive designs, each with a metal chain and hook for attaching to a branch. Place them near your patio or hummingbird feeder and watch the birds have fun." data-dimension25="$11" href="https://www.amazon.com/Hummingbird-Swing-Perch-Wooden-Outdoor/dp/B09F5YG5CW/ref=sr_1_9?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1526px;"><p class="vanilla-image-block" style="padding-top:100.07%;"><img id="nxBgkkpPmfhgts3dr4SXB6" name="Mixxidea hummingbird perches" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/nxBgkkpPmfhgts3dr4SXB6.jpg" mos="" align="middle" fullscreen="" width="1526" height="1527" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This pack of three swings is designed for hummingbirds to perch on. The metal swings have a wooden perch and come in three attractive designs, each with a metal chain and hook for attaching to a branch. Place them near your patio or hummingbird feeder and watch the birds have fun.<a class="view-deal button" href="https://www.amazon.com/Hummingbird-Swing-Perch-Wooden-Outdoor/dp/B09F5YG5CW/ref=sr_1_9?" target="_blank" rel="nofollow" data-dimension112="9114de63-fde6-4a56-a7d4-37376443d399" data-action="Deal Block" data-label="This pack of three swings is designed for hummingbirds to perch on. The metal swings have a wooden perch and come in three attractive designs, each with a metal chain and hook for attaching to a branch. Place them near your patio or hummingbird feeder and watch the birds have fun." data-dimension48="This pack of three swings is designed for hummingbirds to perch on. The metal swings have a wooden perch and come in three attractive designs, each with a metal chain and hook for attaching to a branch. Place them near your patio or hummingbird feeder and watch the birds have fun." data-dimension25="$11">View Deal</a></p></div><div class="product"><a data-dimension112="c271b8e5-7bdf-4635-bfd0-ee94ea690000" data-action="Deal Block" data-label="This bright red hummingbird feeder features six flower feeding ports, a hummingbird perch and an ingenious ant moat that hangs above to keep insects out of the feeder. Plus, to stop any sticky leaks, it has a built-in double gasket." data-dimension48="This bright red hummingbird feeder features six flower feeding ports, a hummingbird perch and an ingenious ant moat that hangs above to keep insects out of the feeder. Plus, to stop any sticky leaks, it has a built-in double gasket." data-dimension25="$14" href="https://www.amazon.com/gp/aw/d/B08W43F9TC/?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:507px;"><p class="vanilla-image-block" style="padding-top:97.04%;"><img id="J3Lgzd8wGopULEQFkkwDTX" name="Kingsland hummingbird feeder" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/J3Lgzd8wGopULEQFkkwDTX.png" mos="" align="middle" fullscreen="" width="507" height="492" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This bright red hummingbird feeder features six flower feeding ports, a hummingbird perch and an ingenious ant moat that hangs above to keep insects out of the feeder. Plus, to stop any sticky leaks, it has a built-in double gasket.<a class="view-deal button" href="https://www.amazon.com/gp/aw/d/B08W43F9TC/?" target="_blank" rel="nofollow" data-dimension112="c271b8e5-7bdf-4635-bfd0-ee94ea690000" data-action="Deal Block" data-label="This bright red hummingbird feeder features six flower feeding ports, a hummingbird perch and an ingenious ant moat that hangs above to keep insects out of the feeder. Plus, to stop any sticky leaks, it has a built-in double gasket." data-dimension48="This bright red hummingbird feeder features six flower feeding ports, a hummingbird perch and an ingenious ant moat that hangs above to keep insects out of the feeder. Plus, to stop any sticky leaks, it has a built-in double gasket." data-dimension25="$14">View Deal</a></p></div><div class="product"><a data-dimension112="09f9c153-6349-4efb-9493-989e395707fc" data-action="Deal Block" data-label="Each pack of hummingbird food contains four ready-to-mix feed packets. The pre-measured powder, when mixed with water, makes up 16oz of feed, ready to pour straight into your feeder for the hummingbirds to enjoy." data-dimension48="Each pack of hummingbird food contains four ready-to-mix feed packets. The pre-measured powder, when mixed with water, makes up 16oz of feed, ready to pour straight into your feeder for the hummingbirds to enjoy." data-dimension25="$28" href="https://www.amazon.com/Hummers-Hummingbird-Natural-Healthy-Hummingbirds/dp/B00JTI4HIK/ref=sr_1_3_sspa?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:609px;"><p class="vanilla-image-block" style="padding-top:99.84%;"><img id="GbKqypsgVRmpk5df39tPFQ" name="Hummer's Galore Hummingbird Bird Food" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GbKqypsgVRmpk5df39tPFQ.jpg" mos="" align="middle" fullscreen="" width="609" height="608" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Each pack of hummingbird food contains four ready-to-mix feed packets. The pre-measured powder, when mixed with water, makes up 16oz of feed, ready to pour straight into your feeder for the hummingbirds to enjoy. <a class="view-deal button" href="https://www.amazon.com/Hummers-Hummingbird-Natural-Healthy-Hummingbirds/dp/B00JTI4HIK/ref=sr_1_3_sspa?" target="_blank" rel="nofollow" data-dimension112="09f9c153-6349-4efb-9493-989e395707fc" data-action="Deal Block" data-label="Each pack of hummingbird food contains four ready-to-mix feed packets. The pre-measured powder, when mixed with water, makes up 16oz of feed, ready to pour straight into your feeder for the hummingbirds to enjoy." data-dimension48="Each pack of hummingbird food contains four ready-to-mix feed packets. The pre-measured powder, when mixed with water, makes up 16oz of feed, ready to pour straight into your feeder for the hummingbirds to enjoy." data-dimension25="$28">View Deal</a></p></div><div class="product"><a data-dimension112="ec289142-998f-40fe-a406-e0b86ee5bf6a" data-action="Deal Block" data-label="This two-in-one product will provide a place for your visiting hummingbirds to drink and cool down in the heat. The raised bird bath, with a 20-inch bowl, will keep them safe from prey, while the solar fountain will provide them with a fine mist of spray. For easy cleaning, the bowl can be unscrewed from the base." data-dimension48="This two-in-one product will provide a place for your visiting hummingbirds to drink and cool down in the heat. The raised bird bath, with a 20-inch bowl, will keep them safe from prey, while the solar fountain will provide them with a fine mist of spray. For easy cleaning, the bowl can be unscrewed from the base." data-dimension25="$47" href="https://www.amazon.com/VIVOHOME-Polyresin-Antique-Outdoor-Fountain/dp/B0876H67LP/ref=sr_1_20_sspa?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:590px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="b3tcDjx5yyS24GZTEPD7rW" name="Vivohome Bird Bath with Solar Fountain" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/b3tcDjx5yyS24GZTEPD7rW.jpg" mos="" align="middle" fullscreen="" width="590" height="590" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This two-in-one product will provide a place for your visiting hummingbirds to drink and cool down in the heat. The raised bird bath, with a 20-inch bowl, will keep them safe from prey, while the solar fountain will provide them with a fine mist of spray. For easy cleaning, the bowl can be unscrewed from the base.<a class="view-deal button" href="https://www.amazon.com/VIVOHOME-Polyresin-Antique-Outdoor-Fountain/dp/B0876H67LP/ref=sr_1_20_sspa?" target="_blank" rel="nofollow" data-dimension112="ec289142-998f-40fe-a406-e0b86ee5bf6a" data-action="Deal Block" data-label="This two-in-one product will provide a place for your visiting hummingbirds to drink and cool down in the heat. The raised bird bath, with a 20-inch bowl, will keep them safe from prey, while the solar fountain will provide them with a fine mist of spray. For easy cleaning, the bowl can be unscrewed from the base." data-dimension48="This two-in-one product will provide a place for your visiting hummingbirds to drink and cool down in the heat. The raised bird bath, with a 20-inch bowl, will keep them safe from prey, while the solar fountain will provide them with a fine mist of spray. For easy cleaning, the bowl can be unscrewed from the base." data-dimension25="$47">View Deal</a></p></div><h2 id="home-appliances">HOME APPLIANCES</h2><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-home-appliance-deals"><span>We're tracking all the best Prime Day home appliance deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Home+Appliances&price=50_&min_discount_ratio=0.95&offer_type=all&rows=4&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&show_countdown=true&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right {      right: 0;      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>\n        \x3C/div>\n      \x3C/div>\n    \x3C/div>          \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const encodedTag = encodeURIComponent(this.activeDealTag.toLowerCase().replace(/\s+/g, '-'));             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map(v => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              return `                \x3Ca href="${this.escapeHTML(linkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item">                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let existingChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             if (this.getViewMode() === 'carousel') {                 if (!existingChevron) {                     gridWrapper.insertAdjacentHTML('beforeend', '\n                 \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: \'smooth\'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>');                 }             } else {                 if (existingChevron) {                     existingChevron.remove();                 }             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));               }            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Gardeners urged not to make this mistake with their grass clippings: Here’s why you shouldn’t throw them away ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardeners-urged-not-to-make-this-mistake-with-their-grass-clippings-heres-why-you-shouldnt-throw-them-away</link>
                                                                            <description>
                            <![CDATA[ Don’t ditch your grass clippings — they are golden fodder for your lawn. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">tLDyYawf86geaR5p7aKh3e</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/S8BVzKFdeXfKQFjcKpeZgW-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 26 Jun 2026 08:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Lawn Care]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/S8BVzKFdeXfKQFjcKpeZgW-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lawn with savings squad badge]]></media:description>                                                            <media:text><![CDATA[Lawn with savings squad badge]]></media:text>
                                <media:title type="plain"><![CDATA[Lawn with savings squad badge]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/S8BVzKFdeXfKQFjcKpeZgW-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As summer arrives, there’s something satisfying about getting the lawnmower out for a weekly cut. I find the familiar hum of the mowers across my neighborhood almost comforting and a signal that summer gardening season is in full swing.</p><p>The smell of freshly mown grass is a scent we associate with summer, but the question for gardeners is, do you leave your clippings on your lawn or remove them after each cut? </p><p>With the help of a lawn care expert, I look at what you should do with your lawn clippings and why. </p><h2 id="the-lawn-clipping-debate-ditch-or-leave">The lawn clipping debate: Ditch or leave?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4672px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="enN98V4uCe4ozFatsPNzv8" name="Mowing lawn - crop.jpg" alt="Man mowing lawn in garden" src="https://cdn.mos.cms.futurecdn.net/enN98V4uCe4ozFatsPNzv8.jpg" mos="" align="middle" fullscreen="" width="4672" height="2628" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>I remember my dad painfully raking up every last lawn clipping each time his mower made an appearance, but he could have saved himself the time and effort by leaving the clippings where they lay. Because left in situ, they become the ultimate fertilizer. </p><p>If your lawn is small, removing the clippings doesn’t require much effort, but for those with a large lawn, it’s more exhausting, especially in the summer heat. Luckily, the good news is you don’t need to rake up your clippings to have the <a href="https://www.tomsguide.com/features/the-ultimate-lawn-care-guide-essential-tips-and-tricks-for-getting-the-perfect-lawn">perfect lawn</a>,  because there’s a benefit to leaving them be.</p><h2 id="why-you-shouldn-t-ditch-your-lawn-clippings">Why you shouldn't ditch your lawn clippings</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3674px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="NjWkfUvHLyPUtkvTurLgtf" name="shutterstock_1811358859.jpg" alt="Grass clippings being held" src="https://cdn.mos.cms.futurecdn.net/NjWkfUvHLyPUtkvTurLgtf.jpg" mos="" align="middle" fullscreen="" width="3674" height="2067" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>If your lawn clippings are short and dry, there’s an advantage to leaving them on your lawn, as they act as a mulch. Marc Kerr, co-founder with Luke Taylor, at <a href="https://www.instagram.com/soandmolawns/" target="_blank">So & Mo</a>, explains, “Mulching involves leaving finely chopped clippings on the lawn to decompose naturally. This acts as a natural fertilizer, returning essential nutrients like nitrogen to the soil and helping to retain moisture.”</p><p>Apart from helping your lawn, it has other benefits too. “Mulching saves time and effort, as you won’t need to stop mowing to empty a bag or worry about disposal. It’s also eco-friendly, keeping organic material on site and reducing waste,” Kerr adds.</p><h2 id="it-won-t-look-so-neat">It won’t look so neat</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="idLLH3J6HXsa6u3oYvZcD8" name="shutterstock_1543295789 (1).jpg" alt="A pile of grass clippings on a lawn" src="https://cdn.mos.cms.futurecdn.net/idLLH3J6HXsa6u3oYvZcD8.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: Shutterstock)</span></figcaption></figure><p>The only downside is that the clippings won’t create a perfectly manicured lawn, and, under certain conditions, they can harm your lawn. “Mulching may not provide the pristine look collecting clippings does, and if the grass is wet or too long, clippings can clump together, potentially smothering the grass beneath,” says Kerr.</p><p>Just as there’s <a href="https://www.tomsguide.com/home/outdoors/garden-experts-share-the-best-time-to-water-your-lawn-and-ive-been-getting-it-all-wrong">a perfect time to water your lawn</a>, Kerr has clear guidance on how to use clippings. “Mulching is most effective when mowing is done regularly and you keep the grass at an ideal length, so when you mow, there isn’t much waste.”</p><h2 id="how-to-decide-which-path-to-take">How to decide which path to take?</h2><p>Whether you leave your grass clippings or clear them up depends on your priorities. Kerr explains, “If you’re seeking a tidy, weed-free appearance or have a composting system in place, collecting clippings might be your best bet. If you prefer a low-maintenance, sustainable approach that boosts your lawn’s health, mulch is the better option.”</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-evvVae"></div>                            </div>                            <script src="https://kwizly.com/embed/evvVae.js" async></script><h2 id="when-to-remove-grass-clippings-from-your-lawn">When to remove grass clippings from your lawn</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="kFbGSvtv7QbcuQeZL6xiGU" name="shutterstock_1971390056edit.jpg" alt="Young man hand-pulling dandelions from a lawn" src="https://cdn.mos.cms.futurecdn.net/kFbGSvtv7QbcuQeZL6xiGU.jpg" mos="" align="middle" fullscreen="" width="1800" height="1012" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Weeds are common in all gardens, especially <a href="https://www.tomsguide.com/how-to/how-to-get-rid-of-dandelions">dandelions</a>, <a href="https://www.tomsguide.com/home/what-is-crabgrass-and-why-is-it-bad-for-your-lawn">crabgrass</a> and bindweed. However, using the clippings as a mulch where weeds are prominent will spread the seeds and make the situation worse. </p><p>In this scenario, Kerr says boxing and disposing of the clippings is best. The same applies if your lawn is long, as you may not be able to see the hidden weeds beneath the tall grass.</p><h2 id="the-low-maintenance-alternative">The low-maintenance alternative</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1999px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="6hEmScD6zfEgQib7esm6fX" name="Husqvarna Automower 450XH EPOS Review -8.jpg" alt="Husqvarna Automower 450XH EPOS robotic lawn mower cutting lawn." src="https://cdn.mos.cms.futurecdn.net/6hEmScD6zfEgQib7esm6fX.jpg" mos="" align="middle" fullscreen="" width="1999" 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>Of course, you don’t have to spend your weekends pushing a heavy mower to keep your lawn tidy.<strong> </strong>A robot lawnmower will take over the chore, giving you time to sit back and enjoy your yard. Although if you’re like me, you’ll find another job to do!</p><p>The benefits go beyond just saving effort. Instead of going for a weekly chop, a robot lawnmower will cut your lawn between 3 and 4 times a week. And rather than removing long blades, a robot mower will cut a fraction during each sweep, leaving the minute clippings behind to act as a fertilizer for a healthy lawn. </p><h3 class="article-body__section" id="section-lawncare-essentials-we-love"><span>Lawncare essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="2fc412af-c657-4601-8210-b4c24c2b5a5c">            <a href="https://www.amazon.com/Scotts-17508/dp/B0168K936W/ref=sr_1_1_sspa?" data-model-name="Scotts Ez Seed Patch & Repair for Sun and Shade" 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/ZRWks9aKfGEVKLwPaLqmhh.jpg" alt="Scotts Ez Seed Patch & Repair for Sun and Shade - Combination Mulch, Sun and Shade Grass Seed & Fertilizer for Bare Spots & Lawn Patch Repair, Covers Up to 85 Sq. Ft., 3.75 Lb."></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Scotts Ez Seed Patch & Repair for Sun and Shade</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="781d6964-2f6f-426a-aa33-bc452e3732e8">            <a href="https://www.amazon.com/Garden-Guru-Handheld-Spreader-Shaker/dp/B0F8P8QM3V/ref=sr_1_8?" data-model-name="Garden Guru Handheld Seed Spreader Shaker" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:82.80%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/ezrwVY6BYsgBZtBcNhMTm9.jpg" alt="Garden Guru Handheld Seed Spreader Shaker – Multi Use Grass Seed, Fertilizer, Salt, Ice & Snow Melt Spreader – Adjustable Twist Cap W Multiple Size Openings – Lightweight 1l Capacity Hand Seeder"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Garden Guru Handheld Seed Spreader Shaker</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="b59ad128-9b56-4483-a8ed-831c006525a4">            <a href="https://www.amazon.com/Fiskars-339950-1002-Puller-Gardening-Removal/dp/B0030MIHAU?" data-model-name="Fiskars Stand-Up Weed Puller Tool" 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/68PWsuXsMu9y5iotDQ8BaZ.jpg" alt="Fiskars Stand-Up Weed Puller Tool, 4 Serrated Stainless Steel Claws Grip Roots for Permanent Removal, Reinforced Foot Platform Penetrates Tough Soil, Easy-Eject & Ergonomic Offset Handle, 39""></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Fiskars Stand-Up Weed Puller Tool</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="71dbe221-a992-49f8-9832-f2168fb20373">            <a href="https://www.amazon.com/Greenworks-G-MAX-Mower-Batteries-Charger/dp/B086K59Q79/ref=sr_1_3?" data-model-name="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower" 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/8LF2UvRs8EXvmebaZefwzA.jpg" alt="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower (200+ Compatible Tools), (2) 4.0ah Batteries and Dual Port Rapid Charger Included"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/home/outdoors/the-secret-to-a-lush-green-lawn-is-this-usd3-bathroom-item-and-you-might-already-own-it">The secret to a lush green lawn is this $3 bathroom item — and you might already own it</a><strong></strong></li><li><a href="https://www.tomsguide.com/home/outdoors/lawn-care-jobs-for-june">7 expert tips to make your lawn look amazing this summer</a></li><li><a href="https://www.tomsguide.com/home/dont-make-a-costly-mistake-7-signs-your-yard-isnt-suitable-for-a-robot-lawnmower">Don't make a costly mistake: 7 signs your yard isn’t suitable for a robot lawnmower</a></li></ul><h2 id="2"></h2>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Why do I have yellow patches in my lawn? Gardening experts share their top tips on how to fix it ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/why-do-i-have-yellow-patches-in-my-lawn-gardening-experts-share-their-top-tips-on-how-to-fix-it</link>
                                                                            <description>
                            <![CDATA[ Do you have unsightly yellow patches ruining your grass? Gardeners reveal the possible reasons why and how to fix it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">kAymuRVnGuJ2L9D9NnqARU</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/tyBNke4AjR6gYGGH8NUiDZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 26 Jun 2026 04:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/tyBNke4AjR6gYGGH8NUiDZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Brown patches in grass]]></media:description>                                                            <media:text><![CDATA[Brown patches in grass]]></media:text>
                                <media:title type="plain"><![CDATA[Brown patches in grass]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/tyBNke4AjR6gYGGH8NUiDZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Summer is here, and we’re not the only ones who are feeling parched in the heat. If you take pride in your lush and <a href="https://www.tomsguide.com/how-to/how-to-make-grass-greener">green grass</a>, it can be disheartening when you notice yellow patches suddenly appearing that quickly ruin the overall look. </p><p>This is especially the case if you’re hosting those backyard barbecues or gatherings. So if you’ve been watering and maintaining your yard, you’re probably wondering why you have yellow patches in your lawn. </p><p>We’ve called on the gardening and lawn care experts at hand to share their top tips on how to get rid of those discolored spots on your lawn and what causes them in the first place. So, read on if you want to revive and bring your lawn back to life this summer.</p><h2 id="what-causes-the-yellow-patches-in-my-lawn">What causes the yellow patches in my lawn?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5390px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RwnyCYupmo4CsDXuzHHtpJ" name="shutterstock_2249537999.jpg" alt="Brown spots in grass in garden" src="https://cdn.mos.cms.futurecdn.net/RwnyCYupmo4CsDXuzHHtpJ.jpg" mos="" align="middle" fullscreen="" width="5390" height="3032" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Brown patches in grass </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Essentially, a yellowing lawn is common when the weather switches from heavy rain to a sudden dry spell. Scientifically, this yellowing is known as chlorosis. </p><p>Particularly, when grass undergoes stress, the green chlorophyll breaks down, and this process exposes the underlying yellow carotenoid pigments that are typically concealed during healthier periods.<strong> </strong></p><p>According to experts, there are various causes for your lackluster lawn. One obvious reason could be not watering your lawn adequately during hot spells, which can dry out the soil. Ideally, you should water deeply and infrequently, as this helps the roots grow stronger and penetrate deeper into the soil.</p><p>“If you notice yellow patches in your lawn, it might be a sign that you are overwatering or underwatering your grass,” said Allison Koenig, a lawn and garden expert at <a href="https://www.tractorsupply.com/" target="_blank">Tractor Supply</a>.</p><p>Basically, if your grass looks dry, turns brown, or has a crispy texture to it, you're likely under-watering, and your grass is parched. But if the grass is constantly soggy, has yellowing patches, or shows signs of mold or fungus, it’s a clear sign of overwatering, and you should reduce the amount of water your lawn is getting. </p><p>“The best way to tell what your lawn needs is through a quick soil check," Koenig said. "If it feels compacted and doesn’t absorb water well, you may be overwatering, while a dry, hard soil signals that your lawn needs more moisture.”</p><div><blockquote><p>Pet urine can also cause those yellow or brown spots on your lawn because of the high nitrogen levels, which essentially burn the grass.</p><p>Allison Koenig, lawn and garden expert </p></blockquote></div><p>Another reason could be diseases or pests, in particular chaffer grubs and leatherjackets that are known to feed directly on the grass roots, literally sucking out the water and essential nutrients it needs to thrive.  </p><p>“As they feed directly on the roots of the grass, they sever your lawn’s connection to its water and nutrient supply,” adds Angelika Zaber, Lawn Care Specialist and Gardening Expert working for <a href="https://www.onlineturf.co.uk" target="_blank">Online Turf.</a>  </p><p>“In terms of diseases, Fusarium is a common culprit since it often shows up as small, yellow, circular patches. To treat it, reduce the amount of thatch and loosen the soil by scarifying and aerating your lawn. Additionally, avoid high-nitrogen fertilizers. Instead, use a fertilizer that is low in nitrogen but high in potassium.”</p><p>Furthermore, for those with furry companions, discolored spots frequently stem from animal waste. “Pet urine can also cause those yellow or brown spots on your lawn because of the high nitrogen levels, which essentially burn the grass,” explained Koenig.</p><p>“To prevent these spots, one effective approach is to immediately water the area where your pet has urinated," Koenig said. "This dilutes the nitrogen and prevents it from "burning" the grass, preventing the brown spots from appearing. You can also try training your pet to use a designated area of the yard, such as a gravel or mulch patch, where the urine won’t harm your lawn.” </p><h2 id="how-do-i-fix-any-yellow-patches">How do I fix any yellow patches?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4345px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4obTEfSTnQVSYL2uvtvu8G" name="Main.jpg" alt="A thatching rake removing thatch from the grass" src="https://cdn.mos.cms.futurecdn.net/4obTEfSTnQVSYL2uvtvu8G.jpg" mos="" align="middle" fullscreen="" width="4345" height="2444" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">A thatching rake removing thatch from the grass </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>First, it’s advisable to start with a soil test to help you determine the pH levels and what nutrients it’s deficient in. </p><p>"This will help you determine the pH levels of the soil as well as if it has adequate nutrients and organic matter present," said Theresa Smith, the SVP at NaturaLawn of America.</p><p>“If the soil test results show signs of the soil having adequate nutrient content, then you know the yellowing or browning of the grass is being caused by an environmental factor or is under physical stress”.<strong> </strong></p><p>So, once you have established the cause for your discolored grass, how do you fix your unsightly patches? "The best way to fix this is by overseeding,” advises Zaber.</p><p>“Overseeding is a practice of spreading grass seed onto an already existing lawn to thicken it and give it that healthy, green appearance. Start by mowing, then scarifying and aerating the soil. </p><p>“Then, spread the seed at a rate of 25 grams per square meter and add a light layer of topsoil on top. This will improve the seed-to-soil contact, which is critical for good germination rates, and also protect the seeds from being eaten by birds or blown away by wind.”</p><p>Bear in mind that you may need a period of two to four weeks for initial growth, though achieving a fully restored, and lush lawn can take up to six months.“Grass usually takes around 2-4 weeks to germinate, depending on the weather. However, to fully establish, it can take up to 6 months,” added Zaber.</p><p>For more top tips, check out <a href="https://www.tomsguide.com/home/lawn-care/how-to-tell-if-your-lawn-needs-overseeding-3-signs-you-cant-ignore">how to tell if your lawn needs overseeding</a>, especially if you want to maintain healthy grass all year round. Or if you just want a lush lawn, try these <a href="https://www.tomsguide.com/home/lawn-care/11-secrets-to-a-lawn-thats-greener-than-your-neighbors">11 secrets to a lawn that’s greener than your neighbor's.</a></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eG0N2W"></div>                            </div>                            <script src="https://kwizly.com/embed/eG0N2W.js" async></script><h3 class="article-body__section" id="section-lawncare-essentials-we-love"><span>Lawncare essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="908cae43-55fa-4da3-8574-24b29266d738">            <a href="https://www.amazon.com/Garden-Guru-Handheld-Spreader-Shaker/dp/B0F8P8QM3V/ref=sr_1_8?" data-model-name="Garden Guru Handheld Seed Spreader Shaker" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:82.80%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/ezrwVY6BYsgBZtBcNhMTm9.jpg" alt="Garden Guru Handheld Seed Spreader Shaker – Multi Use Grass Seed, Fertilizer, Salt, Ice & Snow Melt Spreader – Adjustable Twist Cap W Multiple Size Openings – Lightweight 1l Capacity Hand Seeder"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Garden Guru Handheld Seed Spreader Shaker</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="f740eec9-fe02-43b7-b239-5b64bced9d51">            <a href="https://www.amazon.com/dp/B07BD2GZW8" data-model-name="Garden Gloves" 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/YyBJP4YUpLVNV4q2yKFfjS.jpg" alt="Amazing Stuff For You green and gray gardening gloves"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazing Stuff</div>                                        <div class="featured__title">Garden Gloves</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="36c3c5ee-d7ff-4592-9d90-3e70c1b065ba">            <a href="https://www.amazon.com/Grampas-Weeder-CW-01-Original-Remover/dp/B001D1FFZA?" data-model-name="Grampa's Weeder" 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/kP7pgu2tpxz8d34HtVQgxC.jpg" alt="Grampa's Weeder The Original Stand Up Weed Puller Tool with Long Handle"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Grampa's Weeder</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e9b94b08-caad-456c-b104-34a12eed1cce">            <a href="https://www.amazon.com/Greenworks-G-MAX-Mower-Batteries-Charger/dp/B086K59Q79/ref=sr_1_3?" data-model-name="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower" 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/8LF2UvRs8EXvmebaZefwzA.jpg" alt="Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower (200+ Compatible Tools), (2) 4.0ah Batteries and Dual Port Rapid Charger Included"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Greenworks 48v (24v X 2) 17" Cordless (push) Lawn Mower</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/how-to/7-common-lawn-care-mistakes-you-are-probably-making-right-now"><u>7 common lawn care mistakes you’re probably making right now</u></a></li><li><a href="https://www.tomsguide.com/how-to/9-ways-to-get-the-most-out-of-your-lawn-mower">9 ways to get the most out of your lawn mower</a></li><li><a href="https://www.tomsguide.com/how-to/5-plants-that-will-keep-wasps-out-of-your-yard">5 plants that will keep wasps out of your yard</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I'm seriously allergic to poison ivy — this Gemini feature helps me when I'm weeding ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/im-seriously-allergic-to-poison-ivy-this-gemini-feature-helps-me-when-im-weeding</link>
                                                                            <description>
                            <![CDATA[ There are a lot of three-leaved plants; this Google Gemini feature helps me know which is poison ivy, and which is safe to touch. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TE2bCux7zeAW29ffNeW9vE</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/TkaGkaHxBwBACsq4UGKHQh-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 25 Jun 2026 06:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Google Gemini]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                    <category><![CDATA[AI]]></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>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/TkaGkaHxBwBACsq4UGKHQh-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[An iphone taking a photo of ivy]]></media:description>                                                            <media:text><![CDATA[An iphone taking a photo of ivy]]></media:text>
                                <media:title type="plain"><![CDATA[An iphone taking a photo of ivy]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/TkaGkaHxBwBACsq4UGKHQh-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Every spring, my local gardening Facebook page starts filling up with countless pictures of three-leaved plants, each one framed with the same question: "Is this poison ivy?"</p><p>It's a legitimate concern. Poison ivy is not only invasive, but can cause a severe allergic reaction if you get its oils on your skin. I've had more than enough rashes over the course of my life to look askance at any plant that even remotely resembles poison ivy.</p><p>Rather than post something on my local social network and wait for would-be horticulturists to reply, I've started using a new Google Gemini feature on my phone to find out more quickly if the plant I'm about to grab will leave me itching and scratching. </p><p>Here's how you can use Gemini to identify poison ivy (or any other plant, for that matter), works on both Android and iOS devices, and it takes just seconds.</p><section class="howto-block">                    <h3>Take a picture of the plant in question</h3>                                        <p><p>There's a few ways to go about plant identification. The first is to take a picture of the plant in question on your phone. Make sure that you can isolate its defining features as much as possible, such as a leaf, berries, or some other distinguishing characteristic.</p></p>                </section><section class="howto-block">                    <h3>Open the Google, Google Chrome, or Gemini app on your phone</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/bvvHc7zEcLm5DYjHwdxaLo.jpg"                                        alt="Poison ivy identification using Google Lens"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/bvvHc7zEcLm5DYjHwdxaLo.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>Google gives you plenty of options here, as this works with the Google app, Chrome, or the Gemini app.</p><p>In the Google or Chrome app, <strong>press the small camera icon on the right side of the search bar</strong>. Make sure to allow Google access to both your camera and your photo library.</p><p>If you've already taken the photo, <strong>select the Album icon to the left of the shutter button</strong>. Then, select the image from your library.</p><p>As soon as the image is loaded, Google Lens will attempt to isolate the plant, and then beneath, will display an AI overview of what it thinks the plant is, along with a description and characteristics.</p></p>                </section><section class="howto-block">                    <h3>Using the Gemini app</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/V8K8wGkTzWUtKMVMHjsbZG.jpg"                                        alt="Gemini identifying poison ivy"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/V8K8wGkTzWUtKMVMHjsbZG.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>If you're using the Gemini app, the process is fairly similar.<strong> Press the Plus sign on the left of the query bar</strong>, and <strong>select either Photos or Camera.</strong> Take a photo (or upload a picture), and simply ask Gemini "what plant is this"? </p><p>Similar to Google Lens, it will return an AI summary of the plant, tell you about its characteristics, and, in the case of poison ivy, let you know what to do in case you accidentally came in contact with the plant.</p></p>                </section><section class="howto-block">                    <h3>Using Gemini Live</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/fk8J7MYeiNGfdTpG5kXLn3.jpg"                                        alt="poison ivy gemini live"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/fk8J7MYeiNGfdTpG5kXLn3.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>Within the Gemini app, <strong>press the icon with the three vertical lines</strong> to the right of the text box. Gemini will then enter Gemini Live mode. <strong>Press the Camera icon on the left</strong>. Your phone's screen should then show a view of your camera, and the search bar will shrink. Then simply say "is this poison ivy," and Gemini will attempt to analyze what it's looking at. </p><p>When I tried it, it was a lot less specific than the other methods. "No, that doesn't look like poison ivy. Poison ivy usually has three leaflets, and these leaves look different."</p></p>                </section><p>Using Google Lens to identify plants isn't exactly the newest thing around, but as I've been going around my yard pulling plants, I've found it to be helpful in avoiding poison ivy. I have several other types of ivy and three-leaved plants, so it's been very useful while weeding. It's also come in handy if I'm out for a hike, and come across a new tree or shrub I haven't seen before. </p><p>So, just like <a href="https://www.tomsguide.com/home/outdoors/this-garden-tool-is-a-real-mean-machine-with-weeds-in-my-yard-and-its-under-usd35">Grampa's Weeder</a>, this has become yet another important tool in my gardening kit.</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/gardening/this-stihl-hand-pruner-has-been-so-popular-with-my-neighbors-that-one-of-them-is-buying-it-for-her-husband-for-fathers-day"><strong>This Stihl hand pruner has been so popular with my neighbors that one of them is buying it for her husband for Father’s Day</strong></a></li><li><a href="https://www.tomsguide.com/home/gardening/why-are-my-tomato-plant-leaves-turning-yellow-5-steps-to-save-your-harvest-clone"><strong>How to double your tomato harvest — the 3-step pruning system for massive yields</strong></a></li><li><a href="https://www.tomsguide.com/home/gardening/stop-your-hydrangea-blooms-from-turning-brown-too-early-with-these-3-top-tips"><strong>Stop your hydrangea blooms from turning brown too early with these 3 top tips</strong></a></li></ul><div class="product"><a data-dimension112="2abc3045-cded-4510-bfee-5665a5aaf136" data-action="Deal Block" data-label="This weeding tool isn't cheap, but it saves you from having to bend down to dig up weeds from your yard. The 4-claw design can get rid of weeds easily on soft soil. Our U.S. Editor-in-Chief, Mike Prospero, wrote: "It worked very well in my testing, saving me from unnecessary back pain."" data-dimension48="This weeding tool isn't cheap, but it saves you from having to bend down to dig up weeds from your yard. The 4-claw design can get rid of weeds easily on soft soil. Our U.S. Editor-in-Chief, Mike Prospero, wrote: "It worked very well in my testing, saving me from unnecessary back pain."" data-dimension25="$32" href="https://www.amazon.com/Grampas-Weeder-CW-01-Original-Remover/dp/B001D1FFZA/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="airedale-jnRKLfDxcRfxyueVnDCLbH-17" name="Stand Up Weed Puller.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9qw5MdG27GHCVZsTZWNJac.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This weeding tool isn't cheap, but it saves you from having to bend down to dig up weeds from your yard. The 4-claw design can get rid of weeds easily on soft soil. Our U.S. Editor-in-Chief, Mike Prospero, wrote: "It worked very well in my testing, saving me from unnecessary back pain."<a class="view-deal button" href="https://www.amazon.com/Grampas-Weeder-CW-01-Original-Remover/dp/B001D1FFZA/" target="_blank" rel="nofollow" data-dimension112="2abc3045-cded-4510-bfee-5665a5aaf136" data-action="Deal Block" data-label="This weeding tool isn't cheap, but it saves you from having to bend down to dig up weeds from your yard. The 4-claw design can get rid of weeds easily on soft soil. Our U.S. Editor-in-Chief, Mike Prospero, wrote: "It worked very well in my testing, saving me from unnecessary back pain."" data-dimension48="This weeding tool isn't cheap, but it saves you from having to bend down to dig up weeds from your yard. The 4-claw design can get rid of weeds easily on soft soil. Our U.S. Editor-in-Chief, Mike Prospero, wrote: "It worked very well in my testing, saving me from unnecessary back pain."" data-dimension25="$32">View Deal</a></p></div><div class="product"><a data-dimension112="273d33a3-8a85-4b9e-896b-7e70af72ea05" data-action="Deal Block" data-label="This handy supplies kit includes gloves, cultivator and weeder for, hand fork, hand rake, trowel and transporter — everything needed to get the job done well. What’s more, these are all organized in a floral, multi-pocketed tote bag making it easy to carry around the garden, and machine-washable." data-dimension48="This handy supplies kit includes gloves, cultivator and weeder for, hand fork, hand rake, trowel and transporter — everything needed to get the job done well. What’s more, these are all organized in a floral, multi-pocketed tote bag making it easy to carry around the garden, and machine-washable." data-dimension25="$23" href="https://www.amazon.com/Grenebo-Gardening-Tool-Set-Rust-Proof/dp/B09F9C3KFS" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="airedale-jnRKLfDxcRfxyueVnDCLbH-13" name="Gardening Tools 9-Piece.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LNogvcSma2XUKt52NRpnLf.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This handy supplies kit includes gloves, cultivator and weeder for, hand fork, hand rake, trowel and transporter — everything needed to get the job done well. What’s more, these are all organized in a floral, multi-pocketed tote bag making it easy to carry around the garden, and machine-washable. <a class="view-deal button" href="https://www.amazon.com/Grenebo-Gardening-Tool-Set-Rust-Proof/dp/B09F9C3KFS" target="_blank" rel="nofollow" data-dimension112="273d33a3-8a85-4b9e-896b-7e70af72ea05" data-action="Deal Block" data-label="This handy supplies kit includes gloves, cultivator and weeder for, hand fork, hand rake, trowel and transporter — everything needed to get the job done well. What’s more, these are all organized in a floral, multi-pocketed tote bag making it easy to carry around the garden, and machine-washable." data-dimension48="This handy supplies kit includes gloves, cultivator and weeder for, hand fork, hand rake, trowel and transporter — everything needed to get the job done well. What’s more, these are all organized in a floral, multi-pocketed tote bag making it easy to carry around the garden, and machine-washable." data-dimension25="$23">View Deal</a></p></div><div class="product"><a data-dimension112="630cd3b2-a944-4d90-b620-4e67099148b2" data-action="Deal Block" data-label="Tools and power equipment: up to 40% off" data-dimension48="Tools and power equipment: up to 40% off" data-dimension25="$0" href="https://www.homedepot.com/b/Tool-Savings/N-5yc1vZ1z1zuqf" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="airedale-CHZyXBFMgYKYBkGmp4Nt9S-6" name="Tools and power equipment: up to 40% off.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dpUAvmuGfk45EUpVuzYMyk.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Tools and power equipment: </strong><a href="https://www.homedepot.com/b/Tool-Savings/N-5yc1vZ1z1zuqf" target="_blank" rel="nofollow" data-dimension112="630cd3b2-a944-4d90-b620-4e67099148b2" data-action="Deal Block" data-label="Tools and power equipment: up to 40% off" data-dimension48="Tools and power equipment: up to 40% off" data-dimension25="$0"><strong>up to 40% off</strong></a><br>There's a large range of savings across Home Depot's vast collection of tools right now. These offers include serious savings on everything from power drills to riding mowers.<a class="view-deal button" href="https://www.homedepot.com/b/Tool-Savings/N-5yc1vZ1z1zuqf" target="_blank" rel="nofollow" data-dimension112="630cd3b2-a944-4d90-b620-4e67099148b2" data-action="Deal Block" data-label="Tools and power equipment: up to 40% off" data-dimension48="Tools and power equipment: up to 40% off" data-dimension25="$0">View Deal</a></p></div><div class="product"><a data-dimension112="6584f154-b956-4eea-a8ed-e6e3092059db" data-action="Deal Block" data-label="Add comfortable seating for up to three people to your garden for just $55. The bench is made of durable metal, and the cross-patterned backrest gives it a unique, eye-catching look." data-dimension48="Add comfortable seating for up to three people to your garden for just $55. The bench is made of durable metal, and the cross-patterned backrest gives it a unique, eye-catching look." data-dimension25="$55" href="https://www.homedepot.com/p/SVOPES-46-in-Metal-Outdoor-Garden-Bench-480-lbs-Load-Capacity-with-Backrest-and-Armrests-for-Patio-Park-and-Front-Porch-GYZYJS46YC00W8FDQV0-0819/333288727" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="airedale-CHZyXBFMgYKYBkGmp4Nt9S-9" name="46 in. Metal Outdoor Garden Bench.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dNBxkYyGQhMNXHDkGXVgPF.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Add comfortable seating for up to three people to your garden for just $55. The bench is made of durable metal, and the cross-patterned backrest gives it a unique, eye-catching look.<a class="view-deal button" href="https://www.homedepot.com/p/SVOPES-46-in-Metal-Outdoor-Garden-Bench-480-lbs-Load-Capacity-with-Backrest-and-Armrests-for-Patio-Park-and-Front-Porch-GYZYJS46YC00W8FDQV0-0819/333288727" target="_blank" rel="nofollow" data-dimension112="6584f154-b956-4eea-a8ed-e6e3092059db" data-action="Deal Block" data-label="Add comfortable seating for up to three people to your garden for just $55. The bench is made of durable metal, and the cross-patterned backrest gives it a unique, eye-catching look." data-dimension48="Add comfortable seating for up to three people to your garden for just $55. The bench is made of durable metal, and the cross-patterned backrest gives it a unique, eye-catching look." data-dimension25="$55">View Deal</a></p></div><div class="product"><a data-dimension112="3923c8fa-f89b-40fb-bb42-a1f3b6416564" data-action="Deal Block" data-label="Perfect for a compact space or balcony, this 3-piece set consists of two, high back armchairs with sponge-filled cushions for extra comfort, and a tempered glass tabletop for your drinks and food. With its premium PE rattan design, these are sturdy, weatherproof and easy to clean/maintain. A stylish addition to any backyard." data-dimension48="Perfect for a compact space or balcony, this 3-piece set consists of two, high back armchairs with sponge-filled cushions for extra comfort, and a tempered glass tabletop for your drinks and food. With its premium PE rattan design, these are sturdy, weatherproof and easy to clean/maintain. A stylish addition to any backyard." data-dimension25="$89" href="https://www.amazon.com/Flamaker-Furniture-All-Weather-Outdoor-Tempered/dp/B0CH36DTRL" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="airedale-KErVJa4TFphiKHRmMtmFeR-14" name="All-Weather Rattan Outdoor Set.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rbo4eFEx2Qu5fkfDXwLrYT.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Perfect for a compact space or balcony, this 3-piece set consists of two, high back armchairs with sponge-filled cushions for extra comfort, and a tempered glass tabletop for your drinks and food. With its premium PE rattan design, these are sturdy, weatherproof and easy to clean/maintain. A stylish addition to any backyard.  <a class="view-deal button" href="https://www.amazon.com/Flamaker-Furniture-All-Weather-Outdoor-Tempered/dp/B0CH36DTRL" target="_blank" rel="nofollow" data-dimension112="3923c8fa-f89b-40fb-bb42-a1f3b6416564" data-action="Deal Block" data-label="Perfect for a compact space or balcony, this 3-piece set consists of two, high back armchairs with sponge-filled cushions for extra comfort, and a tempered glass tabletop for your drinks and food. With its premium PE rattan design, these are sturdy, weatherproof and easy to clean/maintain. A stylish addition to any backyard." data-dimension48="Perfect for a compact space or balcony, this 3-piece set consists of two, high back armchairs with sponge-filled cushions for extra comfort, and a tempered glass tabletop for your drinks and food. With its premium PE rattan design, these are sturdy, weatherproof and easy to clean/maintain. A stylish addition to any backyard." data-dimension25="$89">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I gave the Dyson Airwrap i.d. 5 stars in my review — and it's $210 off for Prime Day ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/i-gave-the-dyson-airwrap-i-d-5-stars-in-my-review-and-its-usd210-off-for-prime-day</link>
                                                                            <description>
                            <![CDATA[ The Dyson Airwrap i.d. is one of the few devices I've reviewed and awarded with a perfect score. This Prime Day, it's $210 off. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">EG7hPF7WYkemsyaoWHBmUY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ZZCwSe6562CbpMPrRRKFX3-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 24 Jun 2026 18:49:21 +0000</pubDate>                                                                                                                                <updated>Wed, 24 Jun 2026 18:54:22 +0000</updated>
                                                                                                                                            <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ZZCwSe6562CbpMPrRRKFX3-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Dyson Airwrap id]]></media:description>                                                            <media:text><![CDATA[Dyson Airwrap id]]></media:text>
                                <media:title type="plain"><![CDATA[Dyson Airwrap id]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ZZCwSe6562CbpMPrRRKFX3-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There are very few hair tools that genuinely live up to the hype. The Dyson Airwrap i.d. is one of them, and right now, it's 30% off for Prime Day, <a href="https://www.amazon.com/gp/aw/d/B0GQD9Y72Z" target="_blank" rel="nofollow">bringing it down from $709 to $499</a>. If you've been on the fence, this is the moment.</p><p>The Airwrap i.d. is a 6-in-1 multi-styler that curls, waves, smooths, volumizes, dries, and detangles, all without exceeding the heat threshold at which hair damage occurs. Dyson's technology measures temperature 40 times per second to stay below 302°F, which sounds like marketing BS until you actually use it. </p><p>Here's what sets it apart from everything else. (For more personal recommendations, check out our <a href="https://www.tomsguide.com/live/news/savings-squad-prime-day-live-blog-amazon-best-buy-walmart">Savings Squad summer sale live blog</a> where we're covering all of this week's top sales).</p><ul><li><strong></strong><a href="https://www.amazon.com/primeday" target="_blank" rel="nofollow"><strong>shop all Prime Day deals</strong></a><strong></strong></li></ul><div class="product"><a data-dimension112="d88eb848-f610-42b7-99fa-0482fda3859a" data-action="Deal Block" data-label="The Airwrap i.d. is Bluetooth connected and pairs with the MyDyson app to create a personalised styling routine based on your hair type, length, and goals. Six attachments are included in the box: a conical barrel, fast dryer, anti-snag loop brush, large round volumising brush, and two more depending on your hair type, covering everything from defined curls to a smooth blowout finish. The Chitosan Post-Style Serum is also included in this Amazon-exclusive bundle." data-dimension48="The Airwrap i.d. is Bluetooth connected and pairs with the MyDyson app to create a personalised styling routine based on your hair type, length, and goals. Six attachments are included in the box: a conical barrel, fast dryer, anti-snag loop brush, large round volumising brush, and two more depending on your hair type, covering everything from defined curls to a smooth blowout finish. The Chitosan Post-Style Serum is also included in this Amazon-exclusive bundle." data-dimension25="$499" href="https://www.amazon.com/gp/aw/d/B0GQD9Y72Z" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1890px;"><p class="vanilla-image-block" style="padding-top:83.17%;"><img id="sF4P3LXPaWnitjFtQ4SuHZ" name="Dyson Airwrap i.d." caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/sF4P3LXPaWnitjFtQ4SuHZ.png" mos="" align="middle" fullscreen="" width="1890" height="1572" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Airwrap i.d. is Bluetooth connected and pairs with the MyDyson app to create a personalised styling routine based on your hair type, length, and goals. Six attachments are included in the box: a conical barrel, fast dryer, anti-snag loop brush, large round volumising brush, and two more depending on your hair type, covering everything from defined curls to a smooth blowout finish. The Chitosan Post-Style Serum is also included in this Amazon-exclusive bundle.<a class="view-deal button" href="https://www.amazon.com/gp/aw/d/B0GQD9Y72Z" target="_blank" rel="nofollow" data-dimension112="d88eb848-f610-42b7-99fa-0482fda3859a" data-action="Deal Block" data-label="The Airwrap i.d. is Bluetooth connected and pairs with the MyDyson app to create a personalised styling routine based on your hair type, length, and goals. Six attachments are included in the box: a conical barrel, fast dryer, anti-snag loop brush, large round volumising brush, and two more depending on your hair type, covering everything from defined curls to a smooth blowout finish. The Chitosan Post-Style Serum is also included in this Amazon-exclusive bundle." data-dimension48="The Airwrap i.d. is Bluetooth connected and pairs with the MyDyson app to create a personalised styling routine based on your hair type, length, and goals. Six attachments are included in the box: a conical barrel, fast dryer, anti-snag loop brush, large round volumising brush, and two more depending on your hair type, covering everything from defined curls to a smooth blowout finish. The Chitosan Post-Style Serum is also included in this Amazon-exclusive bundle." data-dimension25="$499">View Deal</a></p></div><p><a href="https://www.tomsguide.com/home/i-was-skeptical-about-the-dyson-airwrap-i-d-curly-coily-two-months-later-im-a-convert">I tested the Curly + Coily version</a>, which shares the same unit as this one with just a slightly different attachment lineup, and came away genuinely converted. I gave it a rare five stars, and the verdict was simple: the hype is <em>real</em>. </p><p>The heat control is the best I've experienced on any styling tool, the build quality is premium throughout, and the magnetic attachments click in and out with a satisfying precision that makes switching mid-session feel completely effortless.</p><p>This Amazon-exclusive bundle is the sweetest deal in the lineup, it pairs the Airwrap i.d. with Dyson's Chitosan Post-Style Serum, which locks in your finished style with flexible all-day hold.</p><p>At $499, it's obviously still a serious investment. But as I put it in my review: it's "the kind of investment that reframes how you think about it. Less an impulse buy, more a decision you make once and don't revisit."</p><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&min_discount_ratio=0.95&offer_type=all&view_mode=carousel&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=light_blue" 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');                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;                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');            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[ Yes, you absolutely need another plant — especially at these Prime Day prices ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/yes-you-absolutely-need-another-plant-especially-at-these-prime-day-prices</link>
                                                                            <description>
                            <![CDATA[ Prime Day isn't just for tech. These five houseplants are seriously reduced right now, and they're the easiest way to make any space feel more like home. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">GXky5Mrs8ysZJD4VkyUcJj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/JPFrMMTfKvLasjtJnbXLWM-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 24 Jun 2026 17:45:59 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/JPFrMMTfKvLasjtJnbXLWM-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Houseplants]]></media:description>                                                            <media:text><![CDATA[Houseplants]]></media:text>
                                <media:title type="plain"><![CDATA[Houseplants]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/JPFrMMTfKvLasjtJnbXLWM-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I recently moved house, and if I'm honest, sorting out my plant situation was higher up the to-do list than unpacking the kitchen. There's something about a new space that makes you want to fill it with greenery, and for the first time I actually have the windowsills, the shelves, and the corners to do it properly. </p><p>If you're in the same boat, or you've just been waiting for the right moment to commit to the houseplant life, Prime Day is a great time to start. Some of the best houseplants you can buy are significantly reduced right now, and I've picked five, relatively low maintenance plants, that will thrive in your home. (For more deals, check out our personal recommendations in our <a href="https://www.tomsguide.com/live/news/savings-squad-prime-day-live-blog-amazon-best-buy-walmart">Tom's Guide Savings Squad live blog</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/Live-Plants/s?k=Live+Plants" target="_blank" rel="nofollow"><strong>shop all Prime Day plant deals at Amazon</strong></a></li><li><strong>Costa Farms Peace Lily: </strong><a href="https://www.amazon.com/Costa-Farms-Spathiphyllum-Gift-Wrapped-Decorator/dp/B07BC8W8KN" target="_blank" rel="nofollow"><strong>was $23 now $17</strong></a></li><li><strong>Costa Farms ZZ Plant: </strong><a href="https://www.amazon.com/Costa-Farms-ZZ-Zamioculcas-White-Natural/dp/B07RJYZ7W3" target="_blank" rel="nofollow"><strong>was $28 now $20</strong></a></li><li><strong>Costa Farms Money Tree: </strong><a href="https://www.amazon.com/Costa-Farms-Pachira-Premium-16-Inches/dp/B07G853D6N" target="_blank" rel="nofollow"><strong>was $33 now $24</strong></a></li><li><strong>Costa Farms 6-Pack Indoor Houseplants: </strong><a href="https://www.amazon.com/Costa-Farms-Clean-Collection-Assorted/dp/B08541R6NR" target="_blank" rel="nofollow"><strong>was $38 now $28</strong></a></li><li><strong>Costa Farms Monstera Swiss Cheese Plant: </strong><a href="https://www.amazon.com/dp/B07RM5P1C2" target="_blank" rel="nofollow"><strong>was $55 now $47</strong></a></li></ul><h3 class="article-body__section" id="section-best-prime-day-plant-deals"><span>Best Prime Day plant deals </span></h3><div class="product"><a data-dimension112="d88eb848-f610-42b7-99fa-0482fda3859a" data-action="Deal Block" data-label="The peace lily is one of those plants that makes you feel like you know what you're doing, even if you absolutely don't. It's forgiving, it's elegant, and those white blooms that appear through the year feel like a little reward for keeping it alive. It thrives in indirect light, needs about a cup of water a week, and will actually droop slightly when it's thirsty — which is the plant equivalent of a very polite reminder. NASA studies have flagged it as an air purifier too, so it's doing double duty as both decor and a quiet improvement to your home environment. At under $18 it's one of the best value plants you can buy right now." data-dimension48="The peace lily is one of those plants that makes you feel like you know what you're doing, even if you absolutely don't. It's forgiving, it's elegant, and those white blooms that appear through the year feel like a little reward for keeping it alive. It thrives in indirect light, needs about a cup of water a week, and will actually droop slightly when it's thirsty — which is the plant equivalent of a very polite reminder. NASA studies have flagged it as an air purifier too, so it's doing double duty as both decor and a quiet improvement to your home environment. At under $18 it's one of the best value plants you can buy right now." data-dimension25="$17" href="https://www.amazon.com/Costa-Farms-Spathiphyllum-Gift-Wrapped-Decorator/dp/B07BC8W8KN" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1894px;"><p class="vanilla-image-block" style="padding-top:85.96%;"><img id="tTZLFm7WnpXV8Ehf6mPLGX" name="Costa Farms Peace Lily" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tTZLFm7WnpXV8Ehf6mPLGX.png" mos="" align="middle" fullscreen="" width="1894" height="1628" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The peace lily is one of those plants that makes you feel like you know what you're doing, even if you absolutely don't. It's forgiving, it's elegant, and those white blooms that appear through the year feel like a little reward for keeping it alive. It thrives in indirect light, needs about a cup of water a week, and will actually droop slightly when it's thirsty — which is the plant equivalent of a very polite reminder. NASA studies have flagged it as an air purifier too, so it's doing double duty as both decor and a quiet improvement to your home environment. At under $18 it's one of the best value plants you can buy right now.<a class="view-deal button" href="https://www.amazon.com/Costa-Farms-Spathiphyllum-Gift-Wrapped-Decorator/dp/B07BC8W8KN" target="_blank" rel="nofollow" data-dimension112="d88eb848-f610-42b7-99fa-0482fda3859a" data-action="Deal Block" data-label="The peace lily is one of those plants that makes you feel like you know what you're doing, even if you absolutely don't. It's forgiving, it's elegant, and those white blooms that appear through the year feel like a little reward for keeping it alive. It thrives in indirect light, needs about a cup of water a week, and will actually droop slightly when it's thirsty — which is the plant equivalent of a very polite reminder. NASA studies have flagged it as an air purifier too, so it's doing double duty as both decor and a quiet improvement to your home environment. At under $18 it's one of the best value plants you can buy right now." data-dimension48="The peace lily is one of those plants that makes you feel like you know what you're doing, even if you absolutely don't. It's forgiving, it's elegant, and those white blooms that appear through the year feel like a little reward for keeping it alive. It thrives in indirect light, needs about a cup of water a week, and will actually droop slightly when it's thirsty — which is the plant equivalent of a very polite reminder. NASA studies have flagged it as an air purifier too, so it's doing double duty as both decor and a quiet improvement to your home environment. At under $18 it's one of the best value plants you can buy right now." data-dimension25="$17">View Deal</a></p></div><div class="product"><a data-dimension112="aa92d53e-4617-48a9-9252-aa0298e6e059" data-action="Deal Block" data-label="If you have ever killed a cactus, the ZZ plant is your redemption arc. This is genuinely one of the most resilient houseplants in existence — it thrives on neglect, tolerates low light, and requires watering so infrequently that forgetting about it is basically part of the care routine. The glossy, upright leaves give it a sleek, architectural look that works brilliantly on a desk, shelf, or in a corner that needs a bit of life. It arrives in a decorative pot ready to go." data-dimension48="If you have ever killed a cactus, the ZZ plant is your redemption arc. This is genuinely one of the most resilient houseplants in existence — it thrives on neglect, tolerates low light, and requires watering so infrequently that forgetting about it is basically part of the care routine. The glossy, upright leaves give it a sleek, architectural look that works brilliantly on a desk, shelf, or in a corner that needs a bit of life. It arrives in a decorative pot ready to go." data-dimension25="$20" href="https://www.amazon.com/Costa-Farms-ZZ-Zamioculcas-White-Natural/dp/B07RJYZ7W3" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1686px;"><p class="vanilla-image-block" style="padding-top:95.14%;"><img id="9A7hSVa6BwdHZ8UUCUcc3e" name="Costa Farms ZZ plant" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9A7hSVa6BwdHZ8UUCUcc3e.png" mos="" align="middle" fullscreen="" width="1686" height="1604" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you have ever killed a cactus, the ZZ plant is your redemption arc. This is genuinely one of the most resilient houseplants in existence — it thrives on neglect, tolerates low light, and requires watering so infrequently that forgetting about it is basically part of the care routine. The glossy, upright leaves give it a sleek, architectural look that works brilliantly on a desk, shelf, or in a corner that needs a bit of life. It arrives in a decorative pot ready to go. <a class="view-deal button" href="https://www.amazon.com/Costa-Farms-ZZ-Zamioculcas-White-Natural/dp/B07RJYZ7W3" target="_blank" rel="nofollow" data-dimension112="aa92d53e-4617-48a9-9252-aa0298e6e059" data-action="Deal Block" data-label="If you have ever killed a cactus, the ZZ plant is your redemption arc. This is genuinely one of the most resilient houseplants in existence — it thrives on neglect, tolerates low light, and requires watering so infrequently that forgetting about it is basically part of the care routine. The glossy, upright leaves give it a sleek, architectural look that works brilliantly on a desk, shelf, or in a corner that needs a bit of life. It arrives in a decorative pot ready to go." data-dimension48="If you have ever killed a cactus, the ZZ plant is your redemption arc. This is genuinely one of the most resilient houseplants in existence — it thrives on neglect, tolerates low light, and requires watering so infrequently that forgetting about it is basically part of the care routine. The glossy, upright leaves give it a sleek, architectural look that works brilliantly on a desk, shelf, or in a corner that needs a bit of life. It arrives in a decorative pot ready to go." data-dimension25="$20">View Deal</a></p></div><div class="product"><a data-dimension112="97b963c3-2657-47a1-ac40-953c3fd2b371" data-action="Deal Block" data-label="The money tree is having a serious moment right now. The braided trunk is beautiful and it looks like something you'd find in a carefully curated interiors shop rather than on Amazon. It also arrives pre-potted in a decorative planter so there's no fuss involved. It's pet-friendly and non-toxic, which immediately puts it ahead of a lot of the competition, and in Feng Shui tradition it's said to bring luck and prosperity. Whether or not you believe that, it's a very good looking plant at a very good price." data-dimension48="The money tree is having a serious moment right now. The braided trunk is beautiful and it looks like something you'd find in a carefully curated interiors shop rather than on Amazon. It also arrives pre-potted in a decorative planter so there's no fuss involved. It's pet-friendly and non-toxic, which immediately puts it ahead of a lot of the competition, and in Feng Shui tradition it's said to bring luck and prosperity. Whether or not you believe that, it's a very good looking plant at a very good price." data-dimension25="$24" href="https://www.amazon.com/Costa-Farms-Pachira-Premium-16-Inches/dp/B07G853D6N" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1530px;"><p class="vanilla-image-block" style="padding-top:105.62%;"><img id="5i9kzyAJHLw42dQYgFFHN6" name="Costa Farms Money Tree" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/5i9kzyAJHLw42dQYgFFHN6.png" mos="" align="middle" fullscreen="" width="1530" height="1616" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The money tree is having a serious moment right now. The braided trunk is beautiful and it looks like something you'd find in a carefully curated interiors shop rather than on Amazon. It also arrives pre-potted in a decorative planter so there's no fuss involved. It's pet-friendly and non-toxic, which immediately puts it ahead of a lot of the competition, and in Feng Shui tradition it's said to bring luck and prosperity. Whether or not you believe that, it's a very good looking plant at a very good price.<a class="view-deal button" href="https://www.amazon.com/Costa-Farms-Pachira-Premium-16-Inches/dp/B07G853D6N" target="_blank" rel="nofollow" data-dimension112="97b963c3-2657-47a1-ac40-953c3fd2b371" data-action="Deal Block" data-label="The money tree is having a serious moment right now. The braided trunk is beautiful and it looks like something you'd find in a carefully curated interiors shop rather than on Amazon. It also arrives pre-potted in a decorative planter so there's no fuss involved. It's pet-friendly and non-toxic, which immediately puts it ahead of a lot of the competition, and in Feng Shui tradition it's said to bring luck and prosperity. Whether or not you believe that, it's a very good looking plant at a very good price." data-dimension48="The money tree is having a serious moment right now. The braided trunk is beautiful and it looks like something you'd find in a carefully curated interiors shop rather than on Amazon. It also arrives pre-potted in a decorative planter so there's no fuss involved. It's pet-friendly and non-toxic, which immediately puts it ahead of a lot of the competition, and in Feng Shui tradition it's said to bring luck and prosperity. Whether or not you believe that, it's a very good looking plant at a very good price." data-dimension25="$24">View Deal</a></p></div><div class="product"><a data-dimension112="a38acd1d-c599-476d-b449-33cb91d60a9e" data-action="Deal Block" data-label="This is the one to buy if you want to go from zero plants to fully committed in one delivery. The six-pack is hand-curated and typically includes a mix of varieties; Peace Lily, Snake Plant, Pothos, and Fern — all chosen to be low maintenance and beginner friendly. At $4 per plant it's great value, and having six at once means you can actually start to figure out which ones you love and which spots in your home suit which plants. It also arrives in individual nursery pots, so you can repot them into something prettier when you're ready." data-dimension48="This is the one to buy if you want to go from zero plants to fully committed in one delivery. The six-pack is hand-curated and typically includes a mix of varieties; Peace Lily, Snake Plant, Pothos, and Fern — all chosen to be low maintenance and beginner friendly. At $4 per plant it's great value, and having six at once means you can actually start to figure out which ones you love and which spots in your home suit which plants. It also arrives in individual nursery pots, so you can repot them into something prettier when you're ready." data-dimension25="$28" href="https://www.amazon.com/Costa-Farms-Clean-Collection-Assorted/dp/B08541R6NR" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2308px;"><p class="vanilla-image-block" style="padding-top:74.52%;"><img id="46tkneTQjpZsTL9dbbmVnE" name="Costa Farms Live Indoor House Plants (6-Pack)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/46tkneTQjpZsTL9dbbmVnE.png" mos="" align="middle" fullscreen="" width="2308" height="1720" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is the one to buy if you want to go from zero plants to fully committed in one delivery. The six-pack is hand-curated and typically includes a mix of varieties; Peace Lily, Snake Plant, Pothos, and Fern — all chosen to be low maintenance and beginner friendly. At $4 per plant it's great value, and having six at once means you can actually start to figure out which ones you love and which spots in your home suit which plants. It also arrives in individual nursery pots, so you can repot them into something prettier when you're ready. <a class="view-deal button" href="https://www.amazon.com/Costa-Farms-Clean-Collection-Assorted/dp/B08541R6NR" target="_blank" rel="nofollow" data-dimension112="a38acd1d-c599-476d-b449-33cb91d60a9e" data-action="Deal Block" data-label="This is the one to buy if you want to go from zero plants to fully committed in one delivery. The six-pack is hand-curated and typically includes a mix of varieties; Peace Lily, Snake Plant, Pothos, and Fern — all chosen to be low maintenance and beginner friendly. At $4 per plant it's great value, and having six at once means you can actually start to figure out which ones you love and which spots in your home suit which plants. It also arrives in individual nursery pots, so you can repot them into something prettier when you're ready." data-dimension48="This is the one to buy if you want to go from zero plants to fully committed in one delivery. The six-pack is hand-curated and typically includes a mix of varieties; Peace Lily, Snake Plant, Pothos, and Fern — all chosen to be low maintenance and beginner friendly. At $4 per plant it's great value, and having six at once means you can actually start to figure out which ones you love and which spots in your home suit which plants. It also arrives in individual nursery pots, so you can repot them into something prettier when you're ready." data-dimension25="$28">View Deal</a></p></div><div class="product"><a data-dimension112="8b9199b6-c4ce-4fad-9830-ff8c793ce8e5" data-action="Deal Block" data-label="The monstera is the houseplant that started my whole indoor plant collection. Those big, dramatic split leaves are instantly recognizable and look incredible in any space. This one arrives at 2-3 feet tall, which means it already makes an impact the moment it comes out of the box. It's an air purifier, it grows quickly once it's happy, tolerates practically every soil, and its a delight to watch it grow. Just remember these plants are climbers, so you'll need a moss pole or the like at some point." data-dimension48="The monstera is the houseplant that started my whole indoor plant collection. Those big, dramatic split leaves are instantly recognizable and look incredible in any space. This one arrives at 2-3 feet tall, which means it already makes an impact the moment it comes out of the box. It's an air purifier, it grows quickly once it's happy, tolerates practically every soil, and its a delight to watch it grow. Just remember these plants are climbers, so you'll need a moss pole or the like at some point." data-dimension25="$47" href="https://www.amazon.com/dp/B07RM5P1C2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2480px;"><p class="vanilla-image-block" style="padding-top:63.23%;"><img id="M6HZLpGTa85dSgiYiywMtP" name="Costa Farms Monstera" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/M6HZLpGTa85dSgiYiywMtP.png" mos="" align="middle" fullscreen="" width="2480" height="1568" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The monstera is the houseplant that started my whole indoor plant collection. Those big, dramatic split leaves are instantly recognizable and look incredible in any space. This one arrives at 2-3 feet tall, which means it already makes an impact the moment it comes out of the box. It's an air purifier, it grows quickly once it's happy, tolerates practically every soil, and its a delight to watch it grow. Just remember these plants are climbers, so you'll need a moss pole or the like at some point. <a class="view-deal button" href="https://www.amazon.com/dp/B07RM5P1C2" target="_blank" rel="nofollow" data-dimension112="8b9199b6-c4ce-4fad-9830-ff8c793ce8e5" data-action="Deal Block" data-label="The monstera is the houseplant that started my whole indoor plant collection. Those big, dramatic split leaves are instantly recognizable and look incredible in any space. This one arrives at 2-3 feet tall, which means it already makes an impact the moment it comes out of the box. It's an air purifier, it grows quickly once it's happy, tolerates practically every soil, and its a delight to watch it grow. Just remember these plants are climbers, so you'll need a moss pole or the like at some point." data-dimension48="The monstera is the houseplant that started my whole indoor plant collection. Those big, dramatic split leaves are instantly recognizable and look incredible in any space. This one arrives at 2-3 feet tall, which means it already makes an impact the moment it comes out of the box. It's an air purifier, it grows quickly once it's happy, tolerates practically every soil, and its a delight to watch it grow. Just remember these plants are climbers, so you'll need a moss pole or the like at some point." data-dimension25="$47">View Deal</a></p></div><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&min_discount_ratio=0.95&offer_type=all&view_mode=carousel&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=light_blue" 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');                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;                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');            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've been using this surprising bathroom item to keep slugs and snails out of my garden — and it’s not coffee grounds ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/ive-been-using-this-surprising-bathroom-item-to-keep-slugs-and-snails-out-of-my-garden-and-its-not-coffee-grounds</link>
                                                                            <description>
                            <![CDATA[ Stop using coffee grounds and beer: Why this bathroom staple is a better slug and snail deterrent. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">iAh6uJaoMsujaFqUeNqfEb</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/fgxdbhdeYVo9yEP8fnPbJj-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 23 Jun 2026 07:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 23 Jun 2026 10:58:41 +0000</updated>
                                                                                                                                            <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/fgxdbhdeYVo9yEP8fnPbJj-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Snail on leaf]]></media:description>                                                            <media:text><![CDATA[Snail on leaf]]></media:text>
                                <media:title type="plain"><![CDATA[Snail on leaf]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/fgxdbhdeYVo9yEP8fnPbJj-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Slugs and snails have officially made their seasonal debut in my yard. During a recent morning stroll to check on my plants, I spotted a whole family of snails tucked in the corner of a container pot, looking far too comfortable. </p><p>Without intervention, I knew these little creatures would soon be munching through my leaves, fruits and vegetables, turning my hard work into a buffet. </p><p>So before the contents of my pots become a free dinner for slugs and snails, I know I need to take action. And it just so happens that I’ve come across a slug and snail deterrent that’s not coffee grounds, beer or eggshells.</p><h2 id="warn-off-slugs-and-snails-with-a-slippery-slide">Warn off slugs and snails with a slippery slide</h2><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="L7AuqX2XPmZcs5q9eDpgMS" name="Deter slugs and snails using Vaseline" alt="Deter slugs and snails using Vaseline" src="https://cdn.mos.cms.futurecdn.net/L7AuqX2XPmZcs5q9eDpgMS.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Camilla Sharman)</span></figcaption></figure><p>There are plenty of <a href="https://www.tomsguide.com/home/gardening/you-only-need-these-5-items-to-banish-slugs-from-your-garden">non-toxic slug and snail deterrents</a> that you can try to prevent these little pests from eating their way through your garden. And there are also specific <a href="https://www.tomsguide.com/home/outdoors/5-slug-resistant-plants-to-stop-slugs-in-their-tracks">plants that will stop slugs and snails in their tracks</a>, such as lavender and hellebores.</p><p>But aside from these deterrents, there’s another, more unusual hack to prevent slugs and snails taking over, and you'll find it tucked away in your bathroom cupboard. <br><br>Petroleum jelly, more commonly known as <a href="https://www.amazon.com/Vaseline-Petroleum-Jelly-Original-pack/dp/B001ECQ4L2" target="_blank" rel="nofollow">Vaseline</a>, can create a slippery barrier that slugs and snails can't cross. All you need to do is apply a thick layer around the rim of the container or raised planter to stop them encroaching and reaching your plants.</p><p><strong>Once isn't enough</strong></p><p>To ensure they stay out, the layer must be thick enough to stop them from reaching the other side, with no gaps for them to sneak through. </p><p>Another cautionary warning is not to think the job is complete for the rest of the season. Due to general wear and weathering, the petroleum jelly will start to disappear and will need to be reapplied. Keep an eye on your pots and check how the Vaseline is faring, especially after a heavy downpour.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XZj02X"></div>                            </div>                            <script src="https://kwizly.com/embed/XZj02X.js" async></script><h2 id="alternative-ways-i-prevent-slugs-and-snails-in-my-yard">Alternative ways I prevent slugs and snails in my yard</h2><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="KmKTyA2nR2Cc2ZAttCoffK" name="Snail" alt="Snail on wooden sleeper" src="https://cdn.mos.cms.futurecdn.net/KmKTyA2nR2Cc2ZAttCoffK.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Camilla Sharman)</span></figcaption></figure><p><strong>The human touch</strong><br>Slugs and snails don’t just appear in plant pots, but when I spot them elsewhere, I remove them humanely. I take them from my pots (if a few have snuck inside) and from other areas of my yard, then place them in an area I dedicate specifically to wildlife. </p><p>I have a small wildflower area with some old wooden sleepers placed on some lawn, to attract the birds, bees, frogs, and hedgehogs. By encouraging natural predators, the job is done without any effort.</p><p><strong>Watering right</strong><br>Slugs and snails love moisture and will be drawn to any areas where it’s damp. One way to discourage them is to water your plants earlier in the day, rather than the evening. What’s more, early morning watering is the <a href="https://www.tomsguide.com/home/gardeners-urged-to-water-their-gardens-at-this-exact-time-in-summer-for-healthy-plants">best time of day to water your plants</a>, according to the experts. </p><h3 class="article-body__section" id="section-gardening-essentials-we-love"><span>Gardening essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="92e1b7de-72c1-443e-ae92-1f6d2d7e28b2">            <a href="https://www.amazon.com/Felco-F-2-Classic-Manual-Pruner/dp/B00023RYS6" data-model-name="F2 Pruning Shears" 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/pVTQGL4DSUSgfk9pVKhLgm.jpg" alt="Felco 2 bypass pruners"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Felco </div>                                        <div class="featured__title">F2 Pruning Shears</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="55046367-d7a2-4244-8a2c-4968937b1a34">            <a href="https://www.amazon.com/dp/B07BD2GZW8" data-model-name="Garden Gloves" 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/YyBJP4YUpLVNV4q2yKFfjS.jpg" alt="Amazing Stuff For You green and gray gardening gloves"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazing Stuff</div>                                        <div class="featured__title">Garden Gloves</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="8511ee6a-1c80-4d11-afda-baf223b1debe">            <a href="https://www.homedepot.com/pep/Corona-ComfortGEL-6-5-in-Comfort-Grip-Stainless-Steel-Hand-Trowel-CT-3214/205811685?" data-model-name="ComfortGEL 6.5 inch Stainless Steel Hand Trowel:" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:99.84%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/pFmmWavYqAu55zSSvQ7b8U.png" alt="Corona hand trowel"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corona </div>                                        <div class="featured__title">ComfortGEL 6.5 inch Stainless Steel Hand Trowel:</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d9033bef-8173-4ced-ab8a-7212bc9d5ba8">            <a href="https://www.amazon.com/Grampas-Weeder-CW-01-Original-Remover/dp/B001D1FFZA?" data-model-name="Grampa's Weeder" 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/kP7pgu2tpxz8d34HtVQgxC.jpg" alt="Grampa's Weeder The Original Stand Up Weed Puller Tool with Long Handle"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Grampa's Weeder</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/home/outdoors/how-to-rat-proof-your-yard-5-expert-tips-to-keep-rodents-away">How to rat-proof your yard — 5 expert tips to keep rodents away</a></li><li><a href="https://www.tomsguide.com/how-to/how-to-get-rid-of-mosquitoes">How to get rid of mosquitoes in your home and your yard</a></li><li><a href="https://www.tomsguide.com/home/gardening/stop-birds-from-pooping-on-your-patio-these-7-quick-and-proven-hacks-will-actually-work">I finally stopped birds from pooping on my patio — 7 hacks that I swear by</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 signs your plant needs a bigger pot right now ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/5-signs-your-plant-needs-a-bigger-pot-right-now</link>
                                                                            <description>
                            <![CDATA[ Learn the most common houseplant care mistakes and simple fixes that keep plants thriving. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CKgFGLrx5oMvrHhVbjmXAe</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/pg7DcTraQP5Buiw6ghjPFW-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 20 Jun 2026 09:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alice Carroll ]]></dc:creator>                                                                                                        <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/pg7DcTraQP5Buiw6ghjPFW-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                        <media:description><![CDATA[A range of houseplants lined up on a shelf]]></media:description>                                                            <media:text><![CDATA[Repotting snake plant]]></media:text>
                                <media:title type="plain"><![CDATA[Repotting snake plant]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/pg7DcTraQP5Buiw6ghjPFW-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If some of your potted plants aren’t looking so good and you think you’ve tried everything, they may be root-bound. This stealthy condition often mimics under-watering or nutrient deficiencies, leaving many well-meaning plant parents completely baffled. </p><p>It happens quietly beneath the soil line, slowly choking off the plant's lifelines until intervention becomes absolutely critical. ‘Root-bound’ simply means the plant has outgrown its container. Its roots have filled all of the space and formed a dense, tangled mass. To learn the signs of a root-bound plant and how to save it, read on.</p><section class="howto-block">                    <h3>1. Visible roots </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/7jb7oc4bJDRpAwM2ogjcYZ.jpg"                                        alt="Repotting aloe vera plant "                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/7jb7oc4bJDRpAwM2ogjcYZ.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Can you see roots emerging from the drainage holes at the bottom of the pot or from the soil on the surface? Visible roots are the most obvious sign that a plant’s roots need more space and are actively searching for a way out. </p><p>When roots begin wrapping tightly around the upper rim of the soil, the plant is practically begging for a larger home.</p></p>                </section><section class="howto-block">                    <h3>2. Soil drying quickly </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/Usz7J2Fa5XZPmD8kJuDHcG.jpg"                                        alt="Watering a peace lily"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/Usz7J2Fa5XZPmD8kJuDHcG.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>If you discover that you’re having to water a plant more often, that you’re finding the topsoil dry earlier than usual, that’s probably because the roots have taken up so much space that there’s less soil to absorb moisture.</p><p>Without enough soil acting as a sponge, the water quickly evaporates. You might find yourself watering every couple of days instead of your usual weekly routine just to keep the plant upright.</p></p>                </section><section class="howto-block">                    <h3>3. Leaves turning yellow </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/SUzgdvH3LFnTVxs6kPtYKd.png"                                        alt="Overwatered monstera houseplant"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/SUzgdvH3LFnTVxs6kPtYKd.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p> If the foliage wilts soon after watering, or leaves are yellowing and falling off, that’s because the roots can no longer draw sufficient nutrients from the soil. The packed roots are limiting what moisture and nutrients the soil can provide; the roots need more space and soil to thrive. </p><p>This structural starvation often starts with the oldest, lowest leaves losing their color first as the plant prioritizes survival.</p></p>                </section><section class="howto-block">                    <h3>4. Water running straight through </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/gW4NxFr3Jbp3xwJTPWBXzE.jpg"                                        alt="Repotting a peace lily"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/gW4NxFr3Jbp3xwJTPWBXzE.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>When you water your plant, does the water seem to go through the soil and straight out the drainage holes? That’s another sign that the roots are occupying too much space, creating a solid block that forces water to slide right down the inside edges of the pot instead of soaking in. </p><p>If the drainage saucer fills up instantly while the actual root ball stays bone-dry, you have a classic root-bound situation.</p></p>                </section><section class="howto-block">                    <h3>5. Poor growth </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/mHfbHxSMppxYdpVHPqpyEc.jpg"                                        alt="Yellow leaf on orchid"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/mHfbHxSMppxYdpVHPqpyEc.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Have you noticed that new foliage isn’t growing or the growth is smaller than usual? That’s another sign that your plant is root-bound and not obtaining the nutrients it needs to thrive during its peak growing season. </p><p>Without room to expand below, the plant simply lacks the biological energy required to push out impressive new leaves above.</p></p>                </section><section class="howto-block">                    <h3>How to salvage your root-bound plant </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/SJDUVhxLTgCjB8dWkCKzng.jpg"                                        alt="Woman repotting a houseplant"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/SJDUVhxLTgCjB8dWkCKzng.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Carefully ease the plant from its pot by supporting the base of the main stem. <strong>Squeeze the plastic sides or run a blunt knife around the inner rim</strong> of rigid containers to break the suction. </p><p>Next,<strong> examine the roots and gently tease them apart with your fingers</strong> so they can grow outward. If they are completely compacted, <strong>use sterile shears to make a few shallow, vertical cuts and trim away dead or circling root</strong>s — up to 25% of the total mass.</p><p><strong>Move the plant into a new container that is one to two inches larger </strong>in diameter and features good drainage holes. <strong>Settle it on a layer of fresh potting mix</strong> at its original soil level, f<strong>ill the sides, and press down gently to remove air pockets</strong>. </p><p>Finish by <strong>watering thoroughly to settle the soil, placing the pot in bright, indirect light, and waiting 2 to 4 weeks before fertilizing </strong>so the roots can safely recover.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Wwz8ae"></div>                            </div>                            <script src="https://kwizly.com/embed/Wwz8ae.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/home/stop-misting-your-succulents-its-drying-them-out">Your succulent is dying of thirst every time you mist it — do this instead</a></li><li><a href="https://www.tomsguide.com/home/how-to-revive-a-dying-houseplant">How to revive a dying houseplant — 7 steps that actually work</a></li><li><a href="https://www.tomsguide.com/home/houseplants-taking-over-heres-how-to-repot-a-swiss-cheese-plant">Houseplants taking over? Here's how to repot a Swiss cheese plant</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Why are my homegrown tomatoes not tasty enough? 3 essential tips from the experts ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/why-are-my-homegrown-tomatoes-not-tasty-enough-i-asked-the-experts</link>
                                                                            <description>
                            <![CDATA[ If you’re wondering why your homegrown tomatoes are not flavorful and tasty, experts reveal the reasons why and how to fix it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">vjjd4YqkPD5ctbPGeAMveX</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/eGWsAiXECXnXYQUYzny3Qd-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 20 Jun 2026 04:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/eGWsAiXECXnXYQUYzny3Qd-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Woman´s hands picking fresh tomatoes to wicker basket. ]]></media:description>                                                            <media:text><![CDATA[Woman´s hands picking fresh tomatoes to wicker basket. ]]></media:text>
                                <media:title type="plain"><![CDATA[Woman´s hands picking fresh tomatoes to wicker basket. ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/eGWsAiXECXnXYQUYzny3Qd-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There’s nothing quite like the taste of<a href="https://www.tomsguide.com/home/im-going-to-be-trying-these-top-4-tips-to-get-my-tomatoes-tasting-as-if-they-were-grown-in-italy-after-an-italian-farmer-shared-why-i-shouldnt-rush-the-land"> homegrown tomatoes </a>— freshly picked off the vine and straight into your tasty meals. Even though these crops are the easiest to grow, it can be disappointing when your harvest lacks the punchy, vibrant flavor you hoped for. </p><p>In fact, this once happened to me, and it was such a let-down, especially after all my hard efforts. This time around, however, I’ve reached out to professional gardeners to uncover why this happens and to give me their top tips for ensuring a flavorsome crop. </p><p>So, if you don’t want to end up with a disappointing harvest, here are the three essential factors that determine whether your tomatoes will be packed with tasty flavor.</p><h3 class="article-body__section" id="section-1-choose-the-right-variety"><span>1. Choose the right variety</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:7939px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QjJyeJokzL9ex2ZtfbhkfS" name="Tomato seeds - crop.jpg" alt="Choosing tomato seeds" src="https://cdn.mos.cms.futurecdn.net/QjJyeJokzL9ex2ZtfbhkfS.jpg" mos="" align="middle" fullscreen="" width="7939" height="4466" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Choosing tomato seeds </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>One key factor behind your bland tomato harvest could be the variety you’re growing. According to experts, you can choose certain varieties based not only on fruit size and color, but also on certain flavors. Some tomatoes are simply not as flavorful as others.  </p><p>“The variety of tomato can determine flavor,” states Jessica Mercer, Ph.D. Horticulturist at <a href="https://plantaddicts.com/" target="_blank">Plant Addicts</a>. “Some tomatoes are bred for shipping ease, firmness, disease resistance, or high yield. </p><p>"Others, like cherry tomatoes, grape tomatoes, and many heirlooms, are known for good sugar-acid balance and aroma.”</p><p>Before picking out your plants to grow, it is worth considering your preferred taste/flavor and researching which specific varieties match your desired taste profile. That should hopefully save you a lot of disappointment when these are ready for the picking. </p><p>For more planting tips, check out <a href="https://www.tomsguide.com/home/gardening/toms-guide-to-tomatoes">Tom's Guide to tomatoes</a> for everything you need to know about growing a juicy harvest. </p><h3 class="article-body__section" id="section-2-let-your-tomatoes-soak-up-the-sun"><span>2. Let your tomatoes soak up the sun</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PSUw2CLaAQeZSVeUE3ALpY" name="Growing tomatoes in raised garden bed with marigolds" alt="Growing tomatoes in raised garden bed with marigolds" src="https://cdn.mos.cms.futurecdn.net/PSUw2CLaAQeZSVeUE3ALpY.jpg" mos="" align="middle" fullscreen="" width="4000" height="2250" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Growing tomatoes in raised garden bed with marigolds  </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Tomatoes are sun-loving plants and need at least 6-8 hours of direct sunlight daily to help them produce more fruit. Without adequate sunshine, plants struggle to photosynthesize and produce complex sugars and acids in the fruit. This essentially gives our tomato crop their tasty flavor. </p><p>"Think of the sun like a solar panel for homegrown tomato flavor — it gives them the fuel and energy they need to perform their best,” adds Corinne Beirne, gardening coach and founder of <a href="http://www.thenourishedgarden.com" target="_blank">The Nourished Garden</a>. </p><p>“Letting them ripen on the vine versus ripening them on your windowsill will maximize taste too, especially after they've been sitting in the sun for a while without too much water before a harvest." What’s more, low-light conditions are known to cause watery, bland fruit that lacks sweetness. </p><p>In addition, knowing when the right time to pick your tomatoes is can make all the difference. “For optimal flavor, tomatoes should be harvested at the right time,” adds Mercer. “Pick when the fruit has started to turn its mature color and pulls easily from the vine. </p><p>“Finish ripening it at room temperature. Tomatoes picked too early may not develop as much flavor as fruit that ripened longer on the plant.”</p><h3 class="article-body__section" id="section-3-avoid-overwatering-your-tomatoes"><span>3. Avoid overwatering your tomatoes</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:692px;"><p class="vanilla-image-block" style="padding-top:56.21%;"><img id="hyaBvfANeJWRwWMXUpLPgM" name="Watering tomato plant - crop.jpg" alt="Watering tomato plant" src="https://cdn.mos.cms.futurecdn.net/hyaBvfANeJWRwWMXUpLPgM.jpg" mos="" align="middle" fullscreen="" width="692" height="389" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Watering tomato plant </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>While the summer heat might tempt you to reach for the hose more often, overwatering or saturating your tomato crop can actually dilute its final taste and flavor. The general rule of thumb is to water only when the top two inches of soil start to dry. </p><p>“Too much water, particularly when fruit is ripening, can dilute the sugars and acids that give tomatoes their flavor,” explains Mercer. “Water deeply and consistently when the top inch or two of soil begins to dry. Check the soil for dryness before watering again.” What’s more, overwatering tomatoes, especially before a harvest, can make a real difference to their sweetness.</p><p>Plus, you’ll want to ensure your soil is kept in a healthy condition, free from disease or root rot, often triggered by overwatering. You can also add a rich, organic fertilizer like a good fish fertilizer. This is because fish contains all the essential plant nutrients such as nitrogen, phosphorus, and potassium — which are all needed for healthy growth.  </p><p>"I like to use a good organic fish fertilizer like Neptune's because it nourishes both the plant and the soil without being too harsh,” suggests Beirne.</p><p>“Healthy, nutritious soil provides the right conditions for the plant to produce the most flavorful fruit."</p><p>For more top tips, check out<a href="https://www.tomsguide.com/home/gardening/when-to-fertilize-your-tomatoes-and-how-to-get-a-bountiful-harvest"> when to fertilize tomatoes: the 3-step schedule for a bountiful harvest.</a></p><div class="product"><a data-dimension112="7aef6afe-bcdf-41fb-9788-3a5429cea489" data-action="Deal Block" data-label="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension48="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension25="$23" href="https://www.amazon.co.uk/Luster-Leaf-1601-Rapitest-Soil/dp/B0000DI845/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:709px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="BTuEKLuVH5pLwYnLD7sqmZ" name="Luster Leaf Soil Test Kit" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BTuEKLuVH5pLwYnLD7sqmZ.jpg" mos="" align="middle" fullscreen="" width="709" height="709" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash. <a class="view-deal button" href="https://www.amazon.co.uk/Luster-Leaf-1601-Rapitest-Soil/dp/B0000DI845/" target="_blank" rel="nofollow" data-dimension112="7aef6afe-bcdf-41fb-9788-3a5429cea489" data-action="Deal Block" data-label="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension48="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension25="$23">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/how-to/how-often-should-you-water-tomato-plants">How often should you water tomato plants and when should you do it?</a></li><li><a href="https://www.tomsguide.com/home/when-to-pick-tomatoes-off-the-vine">3 ways to tell that your tomatoes are ready to harvest</a></li><li><a href="https://www.tomsguide.com/how-to/7-ways-to-get-more-fruit-from-a-tomato-plant">7 ways to increase the yield from your tomato plants</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Why your tomatoes look ‘cat-faced’ — and how to grow smoother fruit ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/why-your-tomatoes-look-cat-faced-and-how-to-grow-smoother-fruit</link>
                                                                            <description>
                            <![CDATA[ Can your tomatoes get 'cat-faced'? According to garden experts, it is a real thing. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LQhnP8zQ2vyJf75G2F84Di</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HN4jE6J9rosgxmbQHPL8Fc-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 19 Jun 2026 11:05:42 +0000</pubDate>                                                                                                                                <updated>Fri, 19 Jun 2026 16:18:13 +0000</updated>
                                                                                                                                            <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/HN4jE6J9rosgxmbQHPL8Fc-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Catfaced tomatoes]]></media:description>                                                            <media:text><![CDATA[Catfaced tomatoes]]></media:text>
                                <media:title type="plain"><![CDATA[Catfaced tomatoes]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HN4jE6J9rosgxmbQHPL8Fc-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Having spent time growing and caring for your <a href="https://www.tomsguide.com/home/gardening/toms-guide-to-tomatoes">tomatoes</a>, <a href="https://www.tomsguide.com/home/outdoors/gardening-expert-reveals-the-best-time-of-day-to-water-your-tomato-plant-you-could-be-making-this-big-mistake">watering</a>,<a href="https://www.tomsguide.com/home/gardening/when-to-fertilize-your-tomatoes-and-how-to-get-a-bountiful-harvest"> fertilizing</a> and <a href="https://www.tomsguide.com/home/why-you-need-to-pinch-out-tomato-plants-heres-how-and-when-to-do-it">pinching them out</a> as needed, you’re bound to be disappointed if those luscious smooth fruits you were expecting look out of sorts.</p><p>But there could be a good reason your tomatoes are misshapen, with deep crevices, scar tissue and a feline appearance. In fact, it’s a common tomato-growing problem that’s known as ‘catfacing’. </p><p>Here, I delve into the causes of catfacing in tomatoes and how to manage your crop to avoid distorted fruits.</p><h2 id="don-t-let-catfaced-tomatoes-go-to-waste">Don't let catfaced tomatoes go to waste</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Nx4XehX3SXrWwF3sXiZeq5" name="shutterstock_304396163" alt="Chopped tomatoes" src="https://cdn.mos.cms.futurecdn.net/Nx4XehX3SXrWwF3sXiZeq5.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Catfaced tomatoes won’t win you any prizes at your local country fair for their appearance, but they are still edible. You might not want to include them in a tomato and mozzarella salad, but once the scar tissue is cut away, they are perfect for chopping or adding to sauces. </p><h2 id="what-does-catfacing-look-like">What does ‘catfacing’ look like? </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8ZtbBbFyLLnEDsXWL4p2M4" name="shutterstock_2627131643" alt="Green tomato with catfacing" src="https://cdn.mos.cms.futurecdn.net/8ZtbBbFyLLnEDsXWL4p2M4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Thankfully, catfacing is not caused by pests or diseases. According to Linda Ly at <a href="https://gardenbetty.com/" target="_blank">Garden Betty</a>, it’s a “physiological disorder that causes a tomato to develop severe physical abnormalities on the blossom end of the fruit.”</p><p>And she describes the affected tomatoes as having “irregular lobes, crevices, or indentations in the fruit, with cracking and cork-like brown scars that look like rings or zippers.”</p><p>Ly also mentions that the damage may extend into the flesh, causing a misshapen tomato, or it may form on the surface, with the only sign of catfacing being a scar on the bottom of the fruit.</p><h2 id="what-causes-catfacing-in-tomatoes">What causes catfacing in tomatoes?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fBJdVu4Sh6pbpxmAzKmwJP" name="shutterstock_1799095618edit.jpg" alt="Man pruning a tomato plant from the top" src="https://cdn.mos.cms.futurecdn.net/fBJdVu4Sh6pbpxmAzKmwJP.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Although catfacing is a common problem, there’s not much research on its causes. However, the main theory by agricultural scientists is that it’s primarily caused during cold weather during early flower development.</p><p><strong>Cold nights</strong></p><p>Cold weather below 50°F is thought to hinder pollination of the bloom. “When the flower is stressed right after it’s pollinated, the tomato ends up puckering and bulging as it tries to grow around the damaged flower,” explains Ly.</p><p><strong>Soil temperature</strong></p><p>Dramatic fluctuations in soil temperature are also thought to develop the cracks in the stem end of the fruit, with heirloom tomato varieties particularly susceptible, according to <a href="https://www.gardeners.com/" target="_blank">Gardener’s Supply Company</a>.</p><p><strong>Too much nitrogen</strong></p><p>Excess nitrogen in the soil is also suspected to cause catfacing, but there is little support for this theory, and for the reasons why.</p><p><strong>Excessive pruning</strong></p><p>Heavy pruning is thought to be another cause affecting indeterminate tomatoes, and is explained by Tracey Besmer, Editor in Chief at <a href="https://www.ruralsprout.com/" target="_blank">Rural Sprout</a>. “The theory is that heavy pruning depletes the plant of a type of growth hormone called auxins. Auxins are necessary for things like cell division and root and tip growth.”</p><p>And she mentions that in this scenario, catfacing would appear to be caused by something on the cellular level.</p><div class="product"><a data-dimension112="7aef6afe-bcdf-41fb-9788-3a5429cea489" data-action="Deal Block" data-label="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension48="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension25="$23" href="https://www.amazon.co.uk/Luster-Leaf-1601-Rapitest-Soil/dp/B0000DI845/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:709px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="BTuEKLuVH5pLwYnLD7sqmZ" name="Luster Leaf Soil Test Kit" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BTuEKLuVH5pLwYnLD7sqmZ.jpg" mos="" align="middle" fullscreen="" width="709" height="709" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash. <a class="view-deal button" href="https://www.amazon.co.uk/Luster-Leaf-1601-Rapitest-Soil/dp/B0000DI845/" target="_blank" rel="nofollow" data-dimension112="7aef6afe-bcdf-41fb-9788-3a5429cea489" data-action="Deal Block" data-label="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension48="This soil test will give you at-home results to show your soil pH, nitrogen, phosphorus and potash levels. It contains all the components needed for 40 tests; 10 each for pH, nitrogen, phosphorus and potash." data-dimension25="$23">View Deal</a></p></div><h2 id="how-to-prevent-catfacing-in-tomatoes">How to prevent catfacing in tomatoes</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="pTUojGGFDstVVoiPa4rNKf" name="shutterstock_137490083edit.jpg" alt="Planting tomato plants in ground" src="https://cdn.mos.cms.futurecdn.net/pTUojGGFDstVVoiPa4rNKf.jpg" mos="" align="middle" fullscreen="" width="1800" height="1013" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>The suspected causes of catfacing will give you insight into what to avoid to prevent this tomato problem. Here are four measures to help you manage your crop.</p><p><strong>1. Wait for warm weather</strong></p><p>Ensure night temperatures remain above 50°F for at least two weeks after the last frost date. After this time, it's safe to transplant your seedlings.</p><p><strong>2. Test your soil before adding fertilizer</strong></p><p>To avoid adding too much nitrogen to your tomatoes, test your soil before you apply any fertilizer. Besmer then suggests skipping the nitrogen feed completely once the tomatoes begin to set fruit and switching to a phosphorus feed to encourage bloom growth. </p><p><strong>3. Choose your resistant types</strong></p><p>Rather than heirloom tomatoes that are susceptible to catfacing, opt for smaller types, such as cherry, grape or pear tomatoes. Helega George, PhD at <a href="https://gardenerspath.com/" target="_blank">Gardeners Path</a> recommends growing ‘Countil’, ‘Duke’, ‘Floradade’, ‘Monte Carlo’ and ‘Walter’.</p><p><strong>4. Avoid aggressive pruning</strong></p><p>Overpruning is one of the <a href="https://www.tomsguide.com/home/7-pruning-mistakes-that-could-damage-your-tomato-plant">common tomato pruning mistakes</a>; it’s all about getting the right balance. If you’re overzealous with your <a href="https://www.tomsguide.com/best-picks/best-pruning-shears">pruning shears</a>, you could put your tomatoes at risk of becoming more feline-looking than you’d hoped. </p><a href="https://follow.it/articles-by-camilla-sharman-staff-writer-homes-tom-s-guide?leanpub." class="button button--large button--primary">Follow Camilla Sharman for all things homes and gardens</a><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/how-to/how-often-should-you-water-tomato-plants">How often should you water tomato plants and when should you do it?</a></li><li><a href="https://www.tomsguide.com/home/when-to-pick-tomatoes-off-the-vine">3 ways to tell that your tomatoes are ready to harvest</a></li><li><a href="https://www.tomsguide.com/how-to/7-ways-to-get-more-fruit-from-a-tomato-plant">7 ways to increase the yield from your tomato plants</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This is what's really causing your tomato leaves to curl — and how to actually fix it ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/this-is-whats-really-causing-your-tomato-leaves-to-curl-and-how-to-actually-fix-it</link>
                                                                            <description>
                            <![CDATA[ Learn what causes tomato leaves to curl and how to restore your plants to health. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">tgcyvXDWegXG4E6diRLHiT</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/dhiQPnNqEPpgVKEGWHDndT-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 19 Jun 2026 06:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/dhiQPnNqEPpgVKEGWHDndT-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Ripening tomato plant with curled leaves]]></media:description>                                                            <media:text><![CDATA[Ripening tomato plant with curled leaves]]></media:text>
                                <media:title type="plain"><![CDATA[Ripening tomato plant with curled leaves]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/dhiQPnNqEPpgVKEGWHDndT-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Curling tomato leaves are your plant's way of telling you something is wrong. When you notice the foliage starting to curl, roll, or twist, it's tempting to panic. But understanding what causes tomato leaves to curl is crucial because different problems require different solutions. </p><p>Some causes resolve on their own once conditions improve. Others demand immediate action. Here are the five most common reasons your tomato plants are curling and exactly what to do about each one. </p><section class="howto-block">                    <h3>1. Heat stress strikes first</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/Sjmn35uGYyzGmrbEi64zFH.jpg"                                        alt="Growing tomato plants with curled leaves"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/Sjmn35uGYyzGmrbEi64zFH.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Hot, dry conditions are the most common culprit behind curling tomato leaves. When temperatures spike and moisture becomes scarce, tomato plants face an impossible choice: they're losing water through evaporation faster than their roots can absorb it. </p><p>The plant responds by curling leaf margins upward — a survival strategy that reduces sun exposure and water loss. You'll typically notice this on lower leaves first.</p><p>To fix this, water deeply and consistently.<strong> Aim for 1 inch of water per week delivered directly to the root zone with a drip line or soaker hose rather than overhead watering</strong>, which spreads disease. </p><p>You can also <strong>add a 2-inch mulch layer around the base to slow soil moisture evaporation</strong>. Once conditions cool or moisture returns, the curling typically resolves within days. The good news is that temporary leaf curl from heat stress rarely impacts your final harvest or plant growth long-term.</p></p>                </section><section class="howto-block">                    <h3>2. When you prune too much </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/UFB2o7HwSJud7AywrZAb7A.jpg"                                        alt="Curling tomato plant"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/UFB2o7HwSJud7AywrZAb7A.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Pruning tomato plants encourages fruit production, but removing too much foliage at once creates shock. When you strip away energy-generating leaves suddenly, the remaining foliage curls as the plant struggles to cope with the stress and loss of photosynthetic capacity.</p><p>The remedy is straightforward: <strong>water thoroughly and wait</strong>. The plant needs time to recover and grow new leaves. Within a couple of weeks, new foliage should emerge and the curling should disappear. </p><p>In the future, <strong>prune conservatively and gradually </strong>rather than removing large sections of growth at once. Focus on removing only lower leaves and suckers between main stems.</p></p>                </section><section class="howto-block">                    <h3> 3. Transplant trauma</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="http://cdn.mos.cms.futurecdn.net/oMJydkdU4C9Ti6H2gqTsCJ.jpg"                                        alt="Watering seedlings by window"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="http://cdn.mos.cms.futurecdn.net/oMJydkdU4C9Ti6H2gqTsCJ.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Moving seedlings into the garden disrupts roots and exposes plants to temperature fluctuations. Some tomato varieties respond by curling their leaves as they acclimate to outdoor conditions. This stress is temporary but worth preventing when possible.</p><p>If your transplanted tomatoes already show curling leaves, <strong>increase watering to help them settle in</strong>. Most plants recover naturally within two weeks without intervention. </p><p>To minimize transplant shock in future seasons,<strong> harden off seedlings by gradually exposing them to outdoor conditions before planting</strong>. Transplant on a cooler, overcast day rather than in full sun, and <strong>handle root balls gently</strong>. </p><p>Temporary shade from a cloth or tarp for the first few days also reduces stress significantly.</p></p>                </section><section class="howto-block">                    <h3>4. Viruses look different than stress</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/LThGCzgFA47PJxzRWqcBo3.jpg"                                        alt="Early tomato blight showing on tomato plant leaves"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/LThGCzgFA47PJxzRWqcBo3.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Tomato blight appears as brown or dark spots on leaves that rapidly expand and kill foliage. Early blight shows up after plants have set fruit and appears as concentric rings on lower leaves first. </p><p>Late blight is more severe. It spreads quickly in cool, wet conditions and can destroy an entire plant in days. Blight-infected leaves curl, yellow, and drop, leaving fruit exposed to sunscald.</p><p>Blight is a fungal disease spread by water splash and poor air circulation. Once you see it, act immediately.<strong> Remove all infected leaves and dispose of them in the trash —never compost blight-infected material</strong>. To improve airflow around the base of the plant, you can prune lower branches. </p><p>If blight continues spreading despite these steps, <strong>remove the entire plant</strong> to prevent it from infecting neighboring tomatoes.</p><p>Prevention is far more effective than treatment. <strong>Choose blight-resistant varieties like Mountain Magic F1 or Artemis F1 when planting</strong>. Space plants far enough apart for air circulation, mulch to prevent soil splash, and remove lower leaves as the plant grows. These practices eliminate the humid conditions blight needs to thrive.</p></p>                </section><section class="howto-block">                    <h3>5. Chemical drift is irreversible</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/sQLgTPm98ScYywUxY37Vea.jpg"                                        alt="Curled tomato plant leaves "                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/sQLgTPm98ScYywUxY37Vea.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>Weed killer drifting from nearby lawn treatments can destroy tomato foliage. When herbicides like 2,4-D or dicamba blow onto your plants, they cause leaves to bend downward with individual leaflets curling upward in a cup-like pattern. This looks distinctly different from heat-stress curling. </p><p>Another sneaky source is contaminated compost or mulch containing persistent herbicides like picloram or clopyralid, which are chemicals that linger in soil for years.</p><p>Unfortunately, there's no cure for herbicide injury. You're left with a "wait and see" approach. Some plants recover and produce fruit despite the damage. Others decline and fail to fruit. Prevention is your only real defense. <strong>Keep weed killers away from tomato areas entirely</strong>.<strong> </strong></p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XZQZ5O"></div>                            </div>                            <script src="https://kwizly.com/embed/XZQZ5O.js" async></script><figure class="van-image-figure pull-right inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:676px;"><p class="vanilla-image-block" style="padding-top:31.51%;"><img id="ZCwuUFRE3YeboHR4zyEWmb" name="r3t8zZ5ve4GewFTeoCM3R6" alt="Google" src="https://cdn.mos.cms.futurecdn.net/ZCwuUFRE3YeboHR4zyEWmb.jpg" mos="" align="right" fullscreen="" width="676" height="213" attribution="" endorsement="" class="pull-rightinline"></p></div></div><figcaption itemprop="caption description" class="pull-right inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/home/gardening/why-are-my-tomato-plant-leaves-turning-yellow-5-steps-to-save-your-harvest-clone">Double your tomato harvest with this 3-step pruning system</a></li><li><a href="https://www.tomsguide.com/home/gardening/why-are-my-tomato-plant-leaves-turning-yellow-5-steps-to-save-your-harvest">Why are my tomato plant leaves turning yellow? 5 steps to save your harvest</a></li><li><a href="https://www.tomsguide.com/home/gardening/why-marigolds-are-the-best-companion-flower-for-a-pest-free-vegetable-garden-especially-tomatoes">Why marigolds are the best companion flower for a pest-free vegetable garden (especially tomatoes)</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Grow more for less: What to plant in a budget-friendly garden ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/grow-more-for-less-what-to-plant-in-a-budget-friendly-garden</link>
                                                                            <description>
                            <![CDATA[ Enjoy your garden for less: The best plants that give you back more than they cost. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">NESdsQxviL6FaRhkML6zeG</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/FnzpjGiXqJLW4VgdBWmwaA-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 19 Jun 2026 05:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/FnzpjGiXqJLW4VgdBWmwaA-1280-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Woman watering garden]]></media:description>                                                            <media:text><![CDATA[Woman watering garden]]></media:text>
                                <media:title type="plain"><![CDATA[Woman watering garden]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/FnzpjGiXqJLW4VgdBWmwaA-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There’s no doubt about it. It’s almost impossible to have any kind of garden, no matter how small, without spending at least something.<strong> </strong>Even though I’ve been gardening for three decades, I am still astounded at the cost of buying plants every time I visit my local nursery.</p><p>But it’s not just plants that make a garden. Those plants need feeding, <a href="https://www.tomsguide.com/best-picks/best-pruning-shears">pruning</a> with a quality pair of shears and watering. Then, of course, you have the added expense of buying containers if you’re not planting straight into beds. </p><p>If you are new to gardening, the costs could put you off before you even get started. However, there are smart ways to build a garden on a budget, using clever planting ideas. With the help of expert gardeners, I share the best ways to create a beautifully planted garden for less. </p><h2 id="1-focus-on-long-term-value">1. Focus on long-term value</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BCGLBLH8yVm9Xbg4Sm5ps6" name="shutterstock_2234538091edit.jpg" alt="Purple coneflowers growing in native plant garden" src="https://cdn.mos.cms.futurecdn.net/BCGLBLH8yVm9Xbg4Sm5ps6.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>The key to planting a budget garden is to think long-term. “Start by looking at perennials. You buy them once, and they come back every year,” says Lindsey Chastain, founder and editor at <a href="https://waddleandcluck.com/" target="_blank">Waddle and Cluck</a>. And although she says you have a higher upfront cost, you can build up your collection over time. </p><p>As an alternative to buying plants, James Syrett, co-founder and garden designer at <a href="about:blank" target="_blank">Byrga Geniht</a>, suggests starting them from seed. “the outlay is about as low as it gets,” he says.</p><p>What’s more, he adds that most seeds can be sown outside after the last frost, and you don’t need to go to the expense of buying a greenhouse. </p><p><strong>Plants to try</strong><br>Chastain recommends growing hardy geraniums, purple coneflowers, yarrow, and creeping thyme.</p><h2 id="2-prioritize-plants-that-self-seed-and-multiply">2. Prioritize plants that self-seed and multiply</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6230px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="VoHketKq7xtQCU2q72A43o" name="shutterstock_2284523819.jpg" alt="Bee Balm" src="https://cdn.mos.cms.futurecdn.net/VoHketKq7xtQCU2q72A43o.jpg" mos="" align="middle" fullscreen="" width="6230" height="3504" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Choosing plants that multiply on their own allows you to fill a garden for free. With this method, you don’t even need to buy seeds, as the plants you’ve invested in give you back more each year.</p><p>To support this process, Chastain recommends leaving the flower heads alone so the seeds can fall. These self-seeders don’t need seed trays or a greenhouse to grow, while they’ll naturally fill gaps in your borders.</p><p><strong>Plants to try</strong><br>Great options include foxgloves, nasturtiums and sunflowers. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OKJ9mW"></div>                            </div>                            <script src="https://kwizly.com/embed/OKJ9mW.js" async></script><h2 id="3-propagate-and-divide-for-free">3. Propagate and divide for free</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:7348px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="R3MPWh3PwnLngssasv6DzA" name="shutterstock_2173878893.jpg" alt="Daylilies" src="https://cdn.mos.cms.futurecdn.net/R3MPWh3PwnLngssasv6DzA.jpg" mos="" align="middle" fullscreen="" width="7348" height="4133" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Dividing plants in your garden can give you dozens of plants for free, if you already grow perennials and bulbs. You can split mature clumps and plant them elsewhere in your yard, or swap with neighbors. </p><p>And unlike planting from seed, established plants already have strong roots and foliage and will give instant impact in your yard, without waiting to see if your seeds succeed. It’s also a way to stop plants overcrowding your yard if they get out of hand. </p><p>Daylilies, ferns and Shasta daisies all make excellent plants to divide, with Gene Caballero, co-founder at <a href="https://www.yourgreenpal.com/" target="_blank">GreenPal</a>, specifically recommending daylilies. “A single plant can grow into a large clump over a few seasons and be divided into multiple plants at no cost. They are also very drought-tolerant and require little maintenance.”</p><p>Apart from divisions, another method to grow plants is to <a href="https://www.tomsguide.com/home/gardening/plants-you-should-propagate-in-august">propagate what you already grow</a>. “Lavender is great for cuttings and so are fuchsias,” says Chastain. </p><p>“After you take the cutting, put it in a pot of compost and you will have a new plant in a few weeks,” she adds.</p><h2 id="4-choose-hard-working-multipurpose-plants">4. Choose hard-working, multipurpose plants</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CH3N7WrptFkVoAeNpyN5MH" name="shutterstock_1939925398" alt="Viburnum" src="https://cdn.mos.cms.futurecdn.net/CH3N7WrptFkVoAeNpyN5MH.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>It’s worth picking plants that will hold up for more than one season. “Evergreens are a good choice and so are bushes like viburnum that flower in spring and have berries in the fall,” says Chastain.</p><p>Mirela Bajic, senior garden designer at <a href="https://housedesigner.com/online-garden-design/" target="_blank">House Designer</a>, also supports growing evergreens, and suggests growing pittosporum.  “It works as a hedge or a standalone specimen, grows steadily, tolerates most conditions and looks good year-round."</p><p>Apart from choosing plants that work hard across the seasons, others can create ground cover that suppresses weeds. Callebro suggests planting creeping thyme for this reason. “It acts as a living mulch, and as it spreads, it will fill in bare space, helping to suppress weeds, and reduce the amount of mulch and maintenance needed,” he explains.</p><p>Other plants, apart from being standout specimens in their own right, can help repel pests, saving you time and money on pest control. These are also referred to as <a href="https://www.tomsguide.com/home/gardening/why-marigolds-are-the-best-companion-flower-for-a-pest-free-vegetable-garden-especially-tomatoes">companion plants</a>, such as growing marigolds with tomatoes to protect the crop. </p><p>Anastasia Borisevich, a plant expert at <a href="https://myplantum.com/" target="_blank">Plantum</a>, recommends growing lavender for its fragrance and attractive appearance, and placing it near a patio or entryway to deter pests. </p><h2 id="the-golden-rules-for-budget-gardeners">The golden rules for budget gardeners</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5666px;"><p class="vanilla-image-block" style="padding-top:54.55%;"><img id="TDGLbVcNmFq7Cr4sUc2U6i" name="shutterstock_2122185587edit.jpg" alt="Man sowing seeds into seed trays" src="https://cdn.mos.cms.futurecdn.net/TDGLbVcNmFq7Cr4sUc2U6i.jpg" mos="" align="middle" fullscreen="" width="5666" height="3091" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Whether you are dealing with a tight budget, landscaping a rental, or trying to fill an expanse, the key to creating a garden for less is to select plants that are easy to propagate, return year after year and perform multiple roles in your outdoor space. </p><p>The only trade-off is your time, but the reward is getting to see and learn about your plants as your garden matures.</p><h3 class="article-body__section" id="section-gardening-essentials-we-love"><span>Gardening essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="2c7aa5b7-cef6-4eb2-923b-c9a1d013d168">            <a href="https://www.amazon.com/Felco-F-2-Classic-Manual-Pruner/dp/B00023RYS6" data-model-name="F2 Pruning Shears" 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/pVTQGL4DSUSgfk9pVKhLgm.jpg" alt="Felco 2 bypass pruners"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Felco </div>                                        <div class="featured__title">F2 Pruning Shears</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="0bf0f123-343a-459a-b2f5-7a27a3aa4509">            <a href="https://www.amazon.com/dp/B07BD2GZW8" data-model-name="Garden Gloves" 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/YyBJP4YUpLVNV4q2yKFfjS.jpg" alt="Amazing Stuff For You green and gray gardening gloves"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazing Stuff</div>                                        <div class="featured__title">Garden Gloves</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="6becec3e-75fc-478d-ae61-c20f86776e0d">            <a href="https://www.homedepot.com/pep/Corona-ComfortGEL-6-5-in-Comfort-Grip-Stainless-Steel-Hand-Trowel-CT-3214/205811685?" data-model-name="ComfortGEL 6.5 inch Stainless Steel Hand Trowel:" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:99.84%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/pFmmWavYqAu55zSSvQ7b8U.png" alt="Corona hand trowel"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corona </div>                                        <div class="featured__title">ComfortGEL 6.5 inch Stainless Steel Hand Trowel:</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="51010475-b095-4572-aad3-9affabfbd938">            <a href="https://www.amazon.com/Grampas-Weeder-CW-01-Original-Remover/dp/B001D1FFZA?" data-model-name="Grampa's Weeder" 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/kP7pgu2tpxz8d34HtVQgxC.jpg" alt="Grampa's Weeder The Original Stand Up Weed Puller Tool with Long Handle"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Grampa's Weeder</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/home/transform-your-backyard-for-less-this-summer-5-garden-tools-i-recommend-under-usd25">Transform your backyard for less this summer: 5 garden tools I recommend under $25</a></li><li><a href="https://www.tomsguide.com/home/7-zero-maintenance-plants-that-will-make-your-front-porch-look-amazing-and-skyrocket-your-curb-appeal">7 zero-maintenance plants that will make your front porch look amazing (and skyrocket your curb appeal)</a></li><li><a href="https://www.tomsguide.com/home/7-tips-to-upgrade-your-yard-on-a-budget-and-get-it-ready-for-summer">7 cheap ways to upgrade your yard for the summer</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Stop your hydrangea blooms from turning brown too early with these 3 top tips ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/stop-your-hydrangea-blooms-from-turning-brown-too-early-with-these-3-top-tips</link>
                                                                            <description>
                            <![CDATA[ How to stop your hydrangea blooms from turning brown? Find out the reasons why and you can do to help them thrive all summer. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">bravUeJVz3aNaUfADxuoYc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/QQVivPiQSsovGufhVj5G8Q-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 18 Jun 2026 13:59:41 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/QQVivPiQSsovGufhVj5G8Q-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Man pruning mophead hydrangea]]></media:description>                                                            <media:text><![CDATA[Man pruning mophead hydrangea]]></media:text>
                                <media:title type="plain"><![CDATA[Man pruning mophead hydrangea]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/QQVivPiQSsovGufhVj5G8Q-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As the warmer weather arrives, there is nothing quite like seeing hydrangeas ready to showcase their vibrant blooms for the summer. </p><p>And with their bright blooms of blue hues, white, and pinks, hydrangeas can instantly add a splash of color to a backyard or porch plant. That’s why it can be disheartening when you start to see them turning brown too early.  </p><p>Of course, once these colorful displays have finished their summer show, the dried flowers make a stunning addition to autumnal floral decor — but you don’t want that during the summer!</p><p>So if you’re wondering why your hydrangea blooms are turning brown so early, here's the reasons why and how to prevent it. </p><h3 class="article-body__section" id="section-not-watering-enough"><span>Not watering enough</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5397px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vt2ccmvAQJ5CGP2konHE4e" name="Watering.jpg" alt="Someone watering hydrangeas" src="https://cdn.mos.cms.futurecdn.net/vt2ccmvAQJ5CGP2konHE4e.jpg" mos="" align="middle" fullscreen="" width="5397" height="3036" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Someone watering hydrangeas </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Typically, hydrangeas are ‘thirsty’ plants, and once the soil dries out completely they can <a href="https://www.tomsguide.com/home/gardening/drooping-hydrangeas-try-these-5-tricks-to-perk-them-up-fast">droop</a>, with leaves wilting, blooms browning and generally looking worse for wear. </p><p>As a rule of thumb, established hydrangeas need roughly one inch of water weekly to thrive, aiming for a deep soaking once every 5 to 7 days. While newly planted hydrangeas should be watered a few times a week (around three inches) to help them get started and grow healthily. </p><p>Another top tip is to avoid overhead sprinklers with hand-watering, drip irrigation or hoses being the better option. This ensures that water is given low and slow so that it gets to the roots better. For best results, aim to water during the early morning hours; this allows any moisture that splashes onto the petals to evaporate quickly before the day heats up.</p><h3 class="article-body__section" id="section-too-much-direct-sunlight"><span>Too much direct sunlight</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="fUqHTp3YryfaPC8xfogqzb" name="shutterstock_2415495733edit.jpg" alt="Sunlight on a display of hydrangeas in a front garden" src="https://cdn.mos.cms.futurecdn.net/fUqHTp3YryfaPC8xfogqzb.jpg" mos="" align="middle" fullscreen="" width="1800" height="1012" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Sunlight on a display of hydrangeas in a front garden </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Another reason for your hydrangeas' browning blooms is direct sunlight, as they can’t cope with scorching heat. Similar to ourselves basking in the sun for too long, this can often cause sunburn and cause blooms to turn brown too early. This is particularly the case for big-leaf varieties.  </p><p>In fact, your hydrangea will thrive better in morning sunlight (before the temperatures start to rise during the day) or afternoon shade. </p><p>.To prevent brown blooms, it’s best to either transplant your hydrangea plants to a more shaded location in your yard or consider adding companion plants that can provide afternoon shade.</p><p>In addition, you can keep plants cool by applying a layer of mulch around the base to keep the soil cool in the summer. Simply add a two-inch layer of mulch around the plants to help retain moisture, and it also helps to keep weed growth at bay.  </p><h3 class="article-body__section" id="section-soil-isn-t-balanced"><span>Soil isn’t balanced</span></h3><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="NHk64SSRz9FfJHrpPRzXHG" name="shutterstock_2265086413 hydrangea in a pot" alt="hydrangea in a pot" src="https://cdn.mos.cms.futurecdn.net/NHk64SSRz9FfJHrpPRzXHG.jpg" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">hydrangea in a pot </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Furthermore, it is vital to ensure your soil pH is correctly balanced. A common mistake is to overfertilize our plants, especially when we notice our hydrangeas are starting to look a bit worse for wear.</p><p>If the soil is too acidic or too alkaline, it can cause flowers to turn brown prematurely. This is mainly due to a build-up of salt in the soil that can affect healthy growth and bigger blooms. </p><p>This is why it is always recommended to test your soil first, as adding more fertilizer without checking can often lead to further issues.</p><p>Another rather unusual hack is to perk up your hydrangeas with coffee grounds. Thanks to its slightly acidic quality and high carbon content, coffee grounds are beneficial to plants, contributing organic matter to the soil.</p><p>In addition, they also contain nitrogen, which is essential in the spring for promoting bigger flowers and strong stems. </p><p>Simply add around a tablespoon of coffee grounds into a spray bottle or watering can to make a weak ‘tea’. Then water your hydrangeas with the weak brew once a month until summer arrives. This is<a href="https://www.tomsguide.com/home/gardening/gardeners-being-urged-to-add-coffee-grounds-when-watering-hydrangeas-in-may-to-make-them-survive-hot-weather-heres-how"> why gardeners are being urged to use old coffee grounds to feed hydrangeas now</a>, just in time for the summer. </p><p>So, if you notice your hydrangea blooms are beginning to discolor, there is still time to revitalize them so they can finish the summer looking their very best.</p><p>For more top tips, check out <a href="https://www.tomsguide.com/how-to/4-easy-steps-to-grow-hydrangeas-from-cuttings">how to grow hydrangeas from cuttings</a> and avoid these <a href="https://www.tomsguide.com/home/5-hydrangea-pruning-mistakes-you-need-to-avoid">hydrangea pruning mistakes</a>. Knowing <a href="https://www.tomsguide.com/how-to/how-to-prune-hydrangeas-and-when-you-should-do-it">how to prune hydrangeas</a> can keep this beautiful plant in check for spring and future seasons. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XkGD6X"></div>                            </div>                            <script src="https://kwizly.com/embed/XkGD6X.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/how-to/how-to-prune-hydrangeas-and-when-you-should-do-it">How to prune hydrangeas and when you should do it</a></li><li><a href="https://www.tomsguide.com/home/hydrangea-not-blooming-heres-why-and-how-to-fix-the-problem">Hydrangea not blooming? Here’s why and how to fix the problem</a></li><li><a href="https://www.tomsguide.com/how-to/4-easy-steps-to-grow-hydrangeas-from-cuttings">How to grow hydrangeas from cuttings — easy steps to get more blooms</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I finally stopped birds from pooping on my patio — 7 hacks that I swear by ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/stop-birds-from-pooping-on-your-patio-these-7-quick-and-proven-hacks-will-actually-work</link>
                                                                            <description>
                            <![CDATA[ Bird poop on your patio? There’s no need to banish birds completely from your yard, discover 7 ways to keep them at bay. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">aSMBb9c5j6bH6HpUV4kM9M</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/iZUM4Tsn4qFvMkCejPHxHG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 18 Jun 2026 10:14:26 +0000</pubDate>                                                                                                                                <updated>Fri, 19 Jun 2026 08:37:20 +0000</updated>
                                                                                                                                            <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/iZUM4Tsn4qFvMkCejPHxHG-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Patio Furniture]]></media:description>                                                            <media:text><![CDATA[Patio Furniture]]></media:text>
                                <media:title type="plain"><![CDATA[Patio Furniture]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/iZUM4Tsn4qFvMkCejPHxHG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There’s nothing like sitting in the sun on your patio and enjoying the surrounding sound of<a href="https://www.tomsguide.com/home/outdoors/ive-discovered-the-best-way-to-encourage-birds-into-my-backyard-and-you-can-too"> birdsong</a>. That’s until you cast your eye downwards and notice that those feathered beauties have pelted your patio slabs or decking with bird poop. </p><p>What’s more, if the droppings have landed on your patio, it’s more than likely that your outdoor furniture and parasol have been targeted too.</p><p>Apart from looking unsightly, bird droppings are hard to clean, but you won’t want to banish them completely. Birds are vital to our gardens — they do a grand job of <a href="https://www.tomsguide.com/home/natural-pest-repellents-heres-how-to-save-money-and-skip-the-exterminator">pest control </a>and assist with <a href="https://www.tomsguide.com/home/7-ways-to-attract-pollinators-to-your-yard">pollination</a>, bringing life to our outdoor spaces.  </p><p>The goal isn’t to get rid of them completely, but to manage where they do their business. Here are 7 tips to keep your garden patio and outdoor furniture poop-free while still encouraging biodiversity in your yard. </p><h2 id="1-be-careful-where-you-hang-bird-feeders">1.  Be careful where you hang bird feeders </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="JQKMs8A9KxbCtEBRtSHdaK" name="shutterstock_517012903edit.jpg" alt="Great tits feeding on a bird feeder" src="https://cdn.mos.cms.futurecdn.net/JQKMs8A9KxbCtEBRtSHdaK.jpg" mos="" align="middle" fullscreen="" width="1800" height="1012" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>There’s no need to discourage birds from your yard  —  the trick is in knowing how to prevent them from pooping in areas where you want to sit.</p><p>I have two bird feeders in my yard, which I hang from the branches of an ornamental tree. Luckily, a flower bed sits below the tree’s canopy, so any droppings land in the flower bed rather than on my patio. </p><p>By keeping bird feeders away from seating areas, you can still enjoy watching the birdlife in your yard without having to clean up their mess.</p><h2 id="2-add-some-scent">2.  Add some scent </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="vF6dt3RBMNgBiPJSvwk8uc" name="shutterstock_2119369739edit.jpg" alt="Bright green leaves of peppermint" src="https://cdn.mos.cms.futurecdn.net/vF6dt3RBMNgBiPJSvwk8uc.jpg" mos="" align="middle" fullscreen="" width="1800" height="1012" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Even though your garden may already be full of fragrant flowers, especially in the spring and summer when everything is blooming, you can introduce some further scent to repel birds from your seating areas. </p><div  class="fancy-box"><div class="fancy_box-title">How to make a peppermint spray</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="HL9kstwwKXEH8SoVgriMMo" name="Peppermint-oil-edit.jpg" caption="" alt="Peppermint essential oil in labeled bottle with fresh peppermint on the side" src="https://cdn.mos.cms.futurecdn.net/HL9kstwwKXEH8SoVgriMMo.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: Shutterstock)</span></figcaption></figure><p class="fancy-box__body-text">Mix 14 drops of peppermint oil with 14 drops of lemon oil, adding ½ cup of white vinegar and ½ cup of water.</p></div></div><p>Birds detest strong, intense scents like those found in essential oils, such as peppermint, eucalyptus, lavender, and citronella. You can make a spray containing essential oils to distribute around your seating area or light a candle to keep birds at a distance when you’re entertaining. However, if using a spray, the scent will fade, so you'll need to use it regularly if you want to keep birds at bay in the long-term.</p><p><strong>Top tip</strong><br>Burning a citronella candle will also help ward off pesky mosquitoes.</p><h2 id="3-clear-up-uneaten-food">3. Clear up uneaten food</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="sdiGa9iQAJwJNxvormun4A" name="shutterstock_1584872812edit.jpg" alt="Sparrow on a garden table eating crumbs" src="https://cdn.mos.cms.futurecdn.net/sdiGa9iQAJwJNxvormun4A.jpg" mos="" align="middle" fullscreen="" width="1800" height="1012" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Birds will quickly swoop in and grab a quick meal if you leave crumbs and leftover food about. Ensure you wipe over any tables and sweep up your patio and decking to keep them clear of tiny morsels that the birds will relish. If not, you'll be sending them an open invitation and they may leave behind more than they take!</p><h2 id="4-introduce-reflective-surfaces">4.  Introduce reflective surfaces </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="s35xL8jWJ2vCogimXHB428" name="GettyImages-1277867938edit.jpg" alt="Shiny CD hanging from a tree branch in sunlight" src="https://cdn.mos.cms.futurecdn.net/s35xL8jWJ2vCogimXHB428.jpg" mos="" align="middle" fullscreen="" width="1800" height="1013" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>Bright, reflective surfaces naturally deter birds, so hanging light-reflective objects can keep them away from sitting areas. While suspending unwanted CDs and aluminium cans will work, they may not be the look you’re going for in your outdoor seating areas.</p><p>Instead, opt for decorative ornaments like small hanging mirrors and sun catchers or try some reflective Bird Scare Discs (<a href="https://www.amazon.com/Chephon-Upgraded-Bird-Repellent-Discs/dp/B01LYEI23V/" target="_blank" rel="nofollow">$17 at Amazon</a>).</p><h2 id="5-go-undercover">5. Go undercover</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1497px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wuzcwDEABsdFVkRjs6b3kU" name="Gazebo - Amazon jpg.jpg" alt="White gazebo" src="https://cdn.mos.cms.futurecdn.net/wuzcwDEABsdFVkRjs6b3kU.jpg" mos="" align="middle" fullscreen="" width="1497" height="842" 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>Rather than giving the birds free rein of your patio areas, where they can hop on and off at their leisure, an awning, canopy or large parasol, will put them off. Instead of having a direct landing path, they will have an obstacle to negotiate first.</p><p>While some patio awnings can be attached directly to an outside wall and pulled out when needed, they are only practical if your patio or decking area is adjacent to your home. If your patio area is further down your garden, there are plenty of other options available. Choose from gazebos, outdoor canopies, and patio umbrellas.</p><p><strong>Top tip</strong><br>For added protection against the birds, add a mirror garland to the edge of your chosen cover, like this reflective mirror garland (<a href="https://www.amazon.com/Mirror-Garland-Strand-Inches-Mirrors/dp/B06W2M5ZWB" target="_blank" rel="nofollow"><u>$30, Amazon</u></a>).  </p><div class="product"><a data-dimension112="19b8ada2-b9fe-453e-ae3f-854105b9b93a" data-action="Deal Block" data-label="This oversized, rectangular patio umbrella offers excellent coverage over your patio furniture and is available in dark blue or dark brown. It features a steel pole, with 12 anti-rust steel ribs, giving strength and durability. The included base provides extra support." data-dimension48="This oversized, rectangular patio umbrella offers excellent coverage over your patio furniture and is available in dark blue or dark brown. It features a steel pole, with 12 anti-rust steel ribs, giving strength and durability. The included base provides extra support." data-dimension25="$141" href="https://www.lowes.com/pd/Kozyard-15-ft-Garden-Patio-Umbrella/5014934975" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:643px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="AR9tu2pazXSeZzFWKNbHA6" name="Screenshot-2024-06-17-155611edit.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AR9tu2pazXSeZzFWKNbHA6.jpg" mos="" align="middle" fullscreen="" width="643" height="643" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This oversized, rectangular patio umbrella offers excellent coverage over your patio furniture and is available in dark blue or dark brown. It features a steel pole, with 12 anti-rust steel ribs, giving strength and durability. The included base provides extra support.<a class="view-deal button" href="https://www.lowes.com/pd/Kozyard-15-ft-Garden-Patio-Umbrella/5014934975" target="_blank" rel="nofollow" data-dimension112="19b8ada2-b9fe-453e-ae3f-854105b9b93a" data-action="Deal Block" data-label="This oversized, rectangular patio umbrella offers excellent coverage over your patio furniture and is available in dark blue or dark brown. It features a steel pole, with 12 anti-rust steel ribs, giving strength and durability. The included base provides extra support." data-dimension48="This oversized, rectangular patio umbrella offers excellent coverage over your patio furniture and is available in dark blue or dark brown. It features a steel pole, with 12 anti-rust steel ribs, giving strength and durability. The included base provides extra support." data-dimension25="$141">View Deal</a></p></div><h2 id="6-keep-your-patio-and-decking-clean">6. Keep your patio and decking clean</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="g566NPJXD9XRGSwDAW2ByM" name="shutterstock_405167752edit.jpg" alt="Cleaning a patio with water and a broom" src="https://cdn.mos.cms.futurecdn.net/g566NPJXD9XRGSwDAW2ByM.jpg" mos="" align="middle" fullscreen="" width="1800" height="1012" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Birds are attracted to a dirty and grimy patio or decking area. They see it as a feast in waiting where they can find a good meal. To keep them at a distance, ensure you <a href="https://www.tomsguide.com/home/paving-expert-reveals-how-to-clean-your-patio-and-what-mistakes-to-avoid">clean your patio</a> and seal your decking every few years with a protective oil. Apart from protecting the wood from moisture and UV damage, decking oil will discourage the birds from landing. </p><h2 id="7-plant-a-decoy">7.  Plant a decoy</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1800px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="dTeVxJpCijKCzEGVCuDUQk" name="shutterstock_2024492153edit.jpg" alt="Owl predator decoy in garden" src="https://cdn.mos.cms.futurecdn.net/dTeVxJpCijKCzEGVCuDUQk.jpg" mos="" align="middle" fullscreen="" width="1800" height="1013" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Planting a decoy is one easy method of deterring the birds from your seating areas. Owls make a good choice for a decoy as birds view them as predators and will keep their distance. For a life-like predator, opt for an owl decoy with a rotating head, like this fake owl by Hedoc (<a href="https://www.amazon.com/Hedoc-Rotating-Scarecrow-Deterrent-Protectors/dp/B08Y5H55WH?th=1" target="_blank" rel="nofollow">$21 at Amazon</a>).</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/how-to/7-ways-to-keep-birds-from-ruining-your-plants">Discover 7 ways to keep birds from ruining your plants in your yard</a></li><li><a href="https://www.tomsguide.com/how-to/7-ways-to-get-rid-of-pigeons-in-your-yard">And 7 ways to get rid of pigeons in your yard</a></li><li><a href="https://www.tomsguide.com/home/5-plants-to-attract-butterflies-and-other-pollinators-to-your-yard">Plus, 5 ways to attract butterflies and other pollinators to your yard </a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This Stihl hand pruner has been so popular with my neighbors that one of them is buying it for her husband for Father’s Day ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/this-stihl-hand-pruner-has-been-so-popular-with-my-neighbors-that-one-of-them-is-buying-it-for-her-husband-for-fathers-day</link>
                                                                            <description>
                            <![CDATA[ I've been using the Stihl GTA 30 pruner for over a month, and it's become one of the most popular tools among my neighbors. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7YkKZX25AV8MqW3G9cgWBY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HVRsVyj4HCSYVrsXwR7x8K-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 18 Jun 2026 09:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></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>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/HVRsVyj4HCSYVrsXwR7x8K-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Stihl GTA 30]]></media:description>                                                            <media:text><![CDATA[Stihl GTA 30]]></media:text>
                                <media:title type="plain"><![CDATA[Stihl GTA 30]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HVRsVyj4HCSYVrsXwR7x8K-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>What DIY dad doesn’t love a chainsaw? There’s something about owning a power tool that can dismember with the ability to dismember you that brings a little extra excitement to your outdoor chores. </p><p>But, there’s a lot of times when even the smallest chainsaw is overkill. You don’t want to look like a horror movie villain just to prune a couple of branches. For the past few months, I’ve been testing the Stihl GTA 30, an electrical pruner that’s perfect for those times when a chainsaw is too much, but a pair of loppers isn’t nearly enough. And, it’s made some of my yardwork so much easier.</p><div class="product"><a data-dimension112="f9703798-6fa0-4c45-9c0e-0b957eefdc37" data-action="Deal Block" data-label="The Stihl GTA 30 has a six-inch cutting bar and can accommodate two batteries. It's also IPX4-rated against splashes of water." data-dimension48="The Stihl GTA 30 has a six-inch cutting bar and can accommodate two batteries. It's also IPX4-rated against splashes of water." data-dimension25="$329" href="https://www.acehardware.com/departments/lawn-and-garden/outdoor-power-equipment/chainsaws/F008567" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:461px;"><p class="vanilla-image-block" style="padding-top:90.24%;"><img id="duoHdJqmCXgx5P4g4UXe4Q" name="GTA 30" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/duoHdJqmCXgx5P4g4UXe4Q.png" mos="" align="middle" fullscreen="" width="461" height="416" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Stihl GTA 30 has a six-inch cutting bar and can accommodate two batteries. It's also IPX4-rated against splashes of water.<a class="view-deal button" href="https://www.acehardware.com/departments/lawn-and-garden/outdoor-power-equipment/chainsaws/F008567" target="_blank" rel="nofollow" data-dimension112="f9703798-6fa0-4c45-9c0e-0b957eefdc37" data-action="Deal Block" data-label="The Stihl GTA 30 has a six-inch cutting bar and can accommodate two batteries. It's also IPX4-rated against splashes of water." data-dimension48="The Stihl GTA 30 has a six-inch cutting bar and can accommodate two batteries. It's also IPX4-rated against splashes of water." data-dimension25="$329">View Deal</a></p></div><p>The GTA 30 is basically a mini-chainsaw; it has just a 6-inch blade, and is small and light enough that you can use it one-handed. Despite its smaller size compared to even a small chainsaw, I was able to easily cut through 4-inch branches. And, because it can be used with just one hand, I was able to use my other hand to pull aside branches that were in the way. </p><p>For example, I had to remove a bush that died, but was inconveniently wedged in between two others; I was able to hold branches in one hand while I used the GTA 30 to work my way down to the base, where it sliced through the trunk like butter.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:222px;"><p class="vanilla-image-block" style="padding-top:177.48%;"><img id="mYiqXo2MioKfAETWoztziC" name="Stihl GTA 30" alt="Stihl GTA 30" src="https://cdn.mos.cms.futurecdn.net/mYiqXo2MioKfAETWoztziC.gif" mos="" align="middle" fullscreen="" width="222" height="394" attribution="" endorsement="" 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 GTA 30, which is new for this year, is an upgraded (and more expensive) version of the GTA 26. The GTA 30 has a 6-inch bar and two batteries, where the GTA 26 has a 4-inch bar and a single battery slot. </p><p>The GTA 26 kit, which includes the saw, a battery, and a charger, costs $199; the GTA 30 kit, which has the saw, two batteries, and a charger, costs $329. I suspect most will be able to use the GTA 26 just fine, but it is nice to have the longer battery charge and reach of the GTA 30. </p><div class="product"><a data-dimension112="d54061d5-b080-42cf-8684-efcbd3e55df4" data-action="Deal Block" data-label="The GTA 26 has a smaller 4-inch blade and a single battery slot, but should be enough for most folks." data-dimension48="The GTA 26 has a smaller 4-inch blade and a single battery slot, but should be enough for most folks." data-dimension25="$199" href="https://www.acehardware.com/departments/lawn-and-garden/gardening-tools/pruning-tools/7008545" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:480px;"><p class="vanilla-image-block" style="padding-top:83.33%;"><img id="Nf8rnTvPiBSE97oqFgLhS4" name="GTA 26" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nf8rnTvPiBSE97oqFgLhS4.png" mos="" align="middle" fullscreen="" width="480" height="400" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The GTA 26 has a smaller 4-inch blade and a single battery slot, but should be enough for most folks.<a class="view-deal button" href="https://www.acehardware.com/departments/lawn-and-garden/gardening-tools/pruning-tools/7008545" target="_blank" rel="nofollow" data-dimension112="d54061d5-b080-42cf-8684-efcbd3e55df4" data-action="Deal Block" data-label="The GTA 26 has a smaller 4-inch blade and a single battery slot, but should be enough for most folks." data-dimension48="The GTA 26 has a smaller 4-inch blade and a single battery slot, but should be enough for most folks." data-dimension25="$199">View Deal</a></p></div><p>Cleverly, the GTA 30 is designed to be used by either righties or lefties; there’s a safety switch on either side that you have to hold down with your thumb before you can pull the trigger. It's a small detail, but a nice one.</p><p>Two batteries slot into the handle of the GTA 30, and there’s a small battery indicator further up; I didn’t time it, but I cut a lot of branches before I had to recharge the batteries. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:57.50%;"><img id="zza8BFYzMCSmHR364Fv9kP" name="stihl GTA 30 kit" alt="Stihl GTA 30 kit" src="https://cdn.mos.cms.futurecdn.net/zza8BFYzMCSmHR364Fv9kP.jpg" mos="" align="middle" fullscreen="" width="2000" height="1150" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Adjusting the tension on the saw chain was pretty simple, too. You just unlock and turn a small knob on the side of the saw to remove the protective cover, and then you can move the bar around easily to get the tension that you need.</p><p>I quickly ran out of things to prune in my yard, so I lent it to my neighbors, who quickly put it to use cutting down privets and other low-hanging branches. They all found it dead simple to use.</p><p>Perhaps the greatest validation came when one of them sent me a text, asking for its name, so that she could surprise her husband on Father’s Day. Hopefully he doesn’t read this until then. Hopefully he likes it just as much as I do!</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/home/gardening/i-tried-a-new-method-to-clean-my-pruning-shears-heres-why-it-cant-beat-my-time-honored-routine"><strong>I tried a new method to clean my pruning shears — here's why it can't beat my time-honored routine</strong></a></li><li><a href="https://www.tomsguide.com/best-picks/best-pruning-shears"><strong>Best pruning shears: Tested and rated</strong></a></li><li><strong></strong><a href="https://www.tomsguide.com/home/5-hydrangea-pruning-mistakes-you-need-to-avoid"><strong>5 hydrangea pruning mistakes you need to avoid</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to choose the best rose for your garden — it’s not just about the scent ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/how-to-choose-the-best-rose-for-your-garden-its-not-just-about-the-scent</link>
                                                                            <description>
                            <![CDATA[ Are you choosing the wrong rose for your garden? An expert shares what you need to know. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">qndwgVC8a72uW2QjWwMYEj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/AbgRGggbE8KLNekSnLE634-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 18 Jun 2026 05:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/AbgRGggbE8KLNekSnLE634-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Mid-pink roses in full bloom]]></media:description>                                                            <media:text><![CDATA[Mid-pink roses in full bloom]]></media:text>
                                <media:title type="plain"><![CDATA[Mid-pink roses in full bloom]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/AbgRGggbE8KLNekSnLE634-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Plants like roses complement virtually any garden design, from rustic traditional cottages to contemporary outdoor spaces. But with over 30,000 varieties to choose from, it can feel overwhelming to pick the right rose for your garden, and know the difference between a hybrid or floribunda rose.</p><p>Here, with the help of Julian Palphramad, head of plants at <a href="https://www.britishgardencentres.com/" target="_blank">British Garden Centres</a>, I explain the different types of roses and how to choose the best type of rose for your garden. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W3wEjW"></div>                            </div>                            <script src="https://kwizly.com/embed/W3wEjW.js" async></script><h2 id="hybrid-tea-roses">Hybrid tea roses</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="phfPu4f7ucTRu7myBHpp6D" name="shutterstock_2122857098" alt="Hybrid tea rose" src="https://cdn.mos.cms.futurecdn.net/phfPu4f7ucTRu7myBHpp6D.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Known for their beauty and scent, hybrid tea roses have large, single flowers that are often 3 to 5 inches in diameter. Palphramad explains that because they bear tall, pointed buds on long stems, they are ideal for cutting. </p><p>These roses are also free-branching and upright, and are perfect for planting in beds and borders. What’s more, hybrid tea roses are moderately hardy and will generally thrive in USDA zones 5 through 9. </p><h2 id="floribunda-roses">Floribunda roses</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="E3JEVkvdqMK9Ehsopj9Tuc" name="shutterstock_2276043327" alt="Floribunda rose" src="https://cdn.mos.cms.futurecdn.net/E3JEVkvdqMK9Ehsopj9Tuc.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Rather than producing single stems like hybrid roses, floribunda roses produce clusters of flowers at the ends of their stems. “The looser blooms make them a great garden display, but they aren’t as good for vase arrangements,” Palphramad says.</p><p>He adds, “Standard roses —the ones grown on top of a long trunk — are most commonly the Floribunda type and bloom from early summer all the way through to early winter.”</p><h2 id="shrub-roses">Shrub roses</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9YBcZNd65mNsMF76QRVWFo" name="shutterstock_2396623267" alt="Flower bed featuring the shrub rose, Rugosa rose" src="https://cdn.mos.cms.futurecdn.net/9YBcZNd65mNsMF76QRVWFo.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Shrub roses are a popular choice if you are looking for a low-maintenance rose. “They produce large clusters of ‘old rose’ flowers that bloom from summer to fall, and many are fragrant,” says Palphramad.</p><p>They take on a natural, spreading form that grows into a rounded or arching shape, and are a good choice for informal hedging and mixed borders.  </p><p>“Modern shrub roses are often bred from old-fashioned roses for repeat blooms, disease resistance, and a variety of colors,” Palphramad adds. </p><h2 id="ground-cover-roses">Ground cover roses</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.10%;"><img id="UNa4g65z3nmJwLxCUnYNyA" name="shutterstock_2790110287" alt="Apricot drift, groundcover rose" src="https://cdn.mos.cms.futurecdn.net/UNa4g65z3nmJwLxCUnYNyA.jpg" mos="" align="middle" fullscreen="" width="2000" height="1122" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>I never think of roses as creating ground cover, but Palphramad says this type creates a “spreading carpet of color and gives roses a whole new level of versatility in the garden.”</p><p>And he adds, “As long as they have plenty of sun, they’ll provide masses of rose flowers for most of the year and can be used in borders, cascading over walls and rockeries or spilling from large containers.”</p><h2 id="climbing-roses">Climbing roses</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AdFzCqJAtRbQtmGJDdCb2Y" name="shutterstock_2305032865" alt="Climbing pink rose" src="https://cdn.mos.cms.futurecdn.net/AdFzCqJAtRbQtmGJDdCb2Y.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Climbing roses produce abundant blooms on just one spreading plant. “They can transform the facade of a house, a fence, or even a shed wall as long as they get ample sunlight,” says Palphramad.</p><p>And he explains that most hybrid tea roses and multiflora roses also come in climbing varieties. However, climbing roses will need some support, as he says their branches need to be level.</p><h2 id="miniature-roses">Miniature roses</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hx4cKK5kgmpYyy4FS4YMqj" name="shutterstock_1925994719" alt="Beautiful Pale Orange Rose "Sweet Dream"" src="https://cdn.mos.cms.futurecdn.net/hx4cKK5kgmpYyy4FS4YMqj.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Even if you have a tiny outside space, you can still grow roses, as miniature types are perfect for patios and sunny balconies. Aside from their size, they offer just as much as a full-size version. </p><p>“Miniature roses are perfectly proportioned, dwarfed versions of their larger siblings, with all parts scaled down. They look super cute planted in garden containers or arranged in rows to fill window frames or planters,” says Palphramad.</p><p>You can also find them as standard stems, grafted onto 15-24-inch-tall stems. What’s more, they are easy to care for and full of blooms. </p><h2 id="how-to-choose-the-best-rose-for-your-garden">How to choose the best rose for your garden</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3izNt7ZQb84z3o4Qx9o6jf" name="shutterstock_2276111639edit.jpg" alt="Pale ping Emily Bronte English shrub rose" src="https://cdn.mos.cms.futurecdn.net/3izNt7ZQb84z3o4Qx9o6jf.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>If you’re working with a patio, balcony or small terrace, Palphramad recommends growing miniature, patio and floribunda roses, as they perform well in containers. For a border, wall or pergola, a climbing, rambling or groundcover variety will spread and fill the space beautifully. </p><p>And of course, if fragrance is the reason you love growing roses, make this your priority and choose a variety for its aroma. Hybrid tea roses, ‘Double Delight’ and ‘Mister Lincoln’, are favored for their beautiful scent. </p><p>If your plan is to cut your roses to display in a vase, choose a hybrid tea rose, as it flowers on a single stem. If you’re keen to add height to your garden, a climbing rose will add a cascade of blooms. </p><p>You may also want to consider how resilient the rose is to pests and when and how long it blooms. What’s more, if you’re looking for a show-stopper, you’ll want to find a big bloomer in a standout color.</p><h2 id="consider-your-growing-conditions">Consider your growing conditions</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5751px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RUbd8NpAUYU2stDheNKDXW" name="Roses - crop.jpg" alt="Planting roses in the soil" src="https://cdn.mos.cms.futurecdn.net/RUbd8NpAUYU2stDheNKDXW.jpg" mos="" align="middle" fullscreen="" width="5751" height="3235" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>But whatever you’re looking for in a rose, for it to succeed, you’ll need to consider the growing conditions and location.</p><p>For the best results, roses need at least 6 to 8 hours of direct sunlight each day, and they will thrive in well-draining soil with a pH between 6.0 and 6.5. You can rebalance the soil, if needed, by adjusting its pH, improving drainage and adding organic matter.</p><h2 id="the-best-rose-for-your-usda-zone">The best rose for your USDA zone</h2><p>Location is also key when choosing a rose. Here's a mini guide to what does well and where.</p><p><strong>USDA zone 4:</strong> Plant cold-hard varieties, such as shrub roses. Although they will need mulching and winter protection.</p><p><strong>USDA zones 5-8:</strong> Most roses will perform well in these regions.</p><p><strong>USDA zones 9-11: </strong>Roses are delicate to grow in these hot regions. Opt for a rose that is hardy and disease-resistant. </p><h2 id="don-t-forget-to-keep-your-roses-well-watered">Don't forget to keep your roses well watered</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ePbFXXPrhRVe8FcFdVoc6" name="shutterstock_2099691439" alt="Watering roses with a hose" src="https://cdn.mos.cms.futurecdn.net/ePbFXXPrhRVe8FcFdVoc6.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>For roses to be successful, whatever zone you live in, they’ll also benefit from deep, slow watering. What’s more, when planting, they should be spaced sufficiently apart to allow air to circulate. This measure will help prevent fungal diseases such as black spot and powdery mildew.</p><h3 class="article-body__section" id="section-gardening-essentials-we-love"><span>Gardening essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="3b9878f9-9a91-43b6-98d8-3ea28499e636">            <a href="https://www.amazon.com/Felco-F-2-Classic-Manual-Pruner/dp/B00023RYS6" data-model-name="F2 Pruning Shears" 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/pVTQGL4DSUSgfk9pVKhLgm.jpg" alt="Felco 2 bypass pruners"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Felco </div>                                        <div class="featured__title">F2 Pruning Shears</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="9b98ce13-d040-406d-8a2a-509bae54ba2e">            <a href="https://www.amazon.com/dp/B01K119OAY?" data-model-name="Rose Pruning Gloves for Men and Women - Thorn-Proof Goatskin Leather Gardening Gloves With Gauntlet" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:75.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/RmS3tjYXpb4XDkogEQcSRR.jpg" alt="Exemplary Gardens Rose Pruning Gloves for Men and Women - Thorn Proof Goatskin Leather Gardening Gloves With Gauntlet"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Exemplary Gardens</div>                                        <div class="featured__title">Rose Pruning Gloves for Men and Women - Thorn-Proof Goatskin Leather Gardening Gloves With Gauntlet</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="7f280d6b-f4aa-4975-95aa-3b3ade611649">            <a href="https://www.homedepot.com/pep/Corona-ComfortGEL-6-5-in-Comfort-Grip-Stainless-Steel-Hand-Trowel-CT-3214/205811685?" data-model-name="ComfortGEL 6.5 inch Stainless Steel Hand Trowel:" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:99.84%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/pFmmWavYqAu55zSSvQ7b8U.png" alt="Corona hand trowel"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corona </div>                                        <div class="featured__title">ComfortGEL 6.5 inch Stainless Steel Hand Trowel:</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="c6c1d41c-49c8-450e-acd3-c8e24ded1291">            <a href="https://www.amazon.com/Grampas-Weeder-CW-01-Original-Remover/dp/B001D1FFZA?" data-model-name="Grampa's Weeder" 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/kP7pgu2tpxz8d34HtVQgxC.jpg" alt="Grampa's Weeder The Original Stand Up Weed Puller Tool with Long Handle"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Grampa's Weeder</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/home/im-a-gardener-and-i-use-this-simple-2-ingredient-kitchen-spray-to-keep-aphids-off-my-roses">I’m a gardener and I use this simple 2-ingredient kitchen spray to keep aphids off my roses</a></li><li><a href="https://www.tomsguide.com/home/what-causes-spots-on-roses-and-how-to-get-rid-of-them-according-to-garden-experts">What causes spots on roses and how to get rid of them — according to garden experts</a></li><li><a href="https://www.tomsguide.com/how-to/how-to-prune-roses">How to prune roses and when to do it</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Stop wasting money on tomato feed — here’s how I made my own free fertilizer ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/stop-wasting-money-on-tomato-feed-heres-how-i-made-my-own-free-fertilizer</link>
                                                                            <description>
                            <![CDATA[ How to save money and brew your own tomato feed for free. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">MYcyzKWG3SPgkHk9EMtRtS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/X6JgwK4CPg6pE6FxeeCivN-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 17 Jun 2026 10:42:10 +0000</pubDate>                                                                                                                                <updated>Wed, 17 Jun 2026 10:42:46 +0000</updated>
                                                                                                                                            <category><![CDATA[Home]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/X6JgwK4CPg6pE6FxeeCivN-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tomato plants ready to harvest, abundant with tomatoes]]></media:description>                                                            <media:text><![CDATA[Tomato plants ready to harvest, abundant with tomatoes]]></media:text>
                                <media:title type="plain"><![CDATA[Tomato plants ready to harvest, abundant with tomatoes]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/X6JgwK4CPg6pE6FxeeCivN-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’m all for saving money in my yard, from sowing seed rather than buying plants to taking cuttings to create new ones for free. And I continue this money-saving theme throughout, ensuring I can keep enjoying my garden for less.</p><p>Taking care of your plants doesn’t stop once they are in the ground; they need <a href="https://www.tomsguide.com/home/gardening/create-free-nutrient-rich-mulch-from-fall-leaves-all-you-need-is-your-lawnmower">mulching</a>,<a href="https://www.tomsguide.com/home/gardening-expert-warns-of-common-watering-mistake-thats-killing-your-plants"> watering at the right time</a>, and feeding to give them the best chance of success. This is certainly true for <a href="https://www.tomsguide.com/home/gardening/toms-guide-to-tomatoes">tomatoes</a>, which need plenty of water and nutrients to grow tasty fruits. </p><p>Although there are plenty of tomato feeds on the market, you can make your own for free using a common kitchen scrap. We’ve already shared how <a href="https://www.tomsguide.com/home/gardening/want-bigger-tomatoes-this-common-kitchen-scrap-could-give-your-plants-a-healthy-boost">onion peel</a> can give your tomato plants a healthy boost, but this time I’m following a tomato feed hack that uses another waste item.</p><h2 id="power-up-your-tomatoes-with-banana-peel">Power up your tomatoes with banana peel</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5896px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="yMJRJZeAFMsuNkMS8XygUC" name="shutterstock_2125813199ex.jpg" alt="Several bananas with one in foreground peeled" src="https://cdn.mos.cms.futurecdn.net/yMJRJZeAFMsuNkMS8XygUC.jpg" mos="" align="middle" fullscreen="" width="5896" height="3317" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Tomatoes are hungry plants that require nitrogen, phosphorus, potassium and calcium to grow strong vines, abundant blooms and healthy fruit.</p><p>It just so happens that bananas, the most popular fruit in my house, are rich in all four nutrients that tomatoes crave, and the fruit’s leftover skin can be used to make tomato feed. </p><p>What’s more, it’s so easy to make a tomato feed using banana skins; even if you've never made a plant fertilizer before,  you can’t go wrong.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ODnR0e"></div>                            </div>                            <script src="https://kwizly.com/embed/ODnR0e.js" async></script><h2 id="how-to-make-tomato-feed-with-banana-peel">How to make tomato feed with banana peel</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/grRa9yVkcG8kNeNnwU7tv8.jpg" alt="Home made tomato feed" /><figcaption><small role="credit">Future / Camilla Sharman</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/jxrKqywY687JgZjEqtyWX8.jpg" alt="Home made tomato feed" /><figcaption><small role="credit">Future / Camilla Sharman</small></figcaption></figure></figure><p>Rather than casting your banana peels into your trash or compost, save them for your tomatoes.</p><p><strong>1. </strong>Cut up your peels (I left mine whole as I was using one).</p><p><strong>2.</strong> Add the peel to a jar of water.</p><p><strong>3.</strong> Let it sit for 2-3 days.</p><p><strong>4.</strong> Transfer the liquid into a jug.</p><p><strong>5. </strong> Pour the feed onto your tomato plants.<br></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3268px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="HyV5Kq2o8LwHuwXSPCJ3Q9" name="Tomato feed" alt="Home made tomato feed" src="https://cdn.mos.cms.futurecdn.net/HyV5Kq2o8LwHuwXSPCJ3Q9.jpg" mos="" align="middle" fullscreen="" width="3268" height="1838" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Camilla Sharman)</span></figcaption></figure><p>As shown above, I poured the feed directly into a plant pot that I then buried in the soil. It’s another <a href="https://www.tomsguide.com/home/gardening-pros-swear-by-this-ingenious-tomato-watering-trick-try-it-for-juicier-plumper-tomatoes">tomato-growing hack</a> that ensures water and feed go directly to the roots, where needed. It also prevents water from evaporating and helps develop a resilient root system. <br><br>Once you start using your banana peels to feed your tomato plants, you’ll be conjuring up all sorts of ways to add more of these tasty fruits into your diet so you can eat them for breakfast, lunch and dinner.</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/how-to/how-to-grow-tomatoes-from-seeds">How to grow tomatoes from seeds</a></li><li><a href="https://www.tomsguide.com/home/when-to-pick-tomatoes-off-the-vine">3 ways to tell that your tomatoes are ready to harvest</a></li><li><a href="https://www.tomsguide.com/home/outdoors/gardener-shares-this-one-easy-hack-that-will-stop-tomato-blight-in-its-tracks">Gardener shares this one easy hack that will stop tomato blight in its track</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Gardening expert warns of common watering mistake that’s killing your plants ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening-expert-warns-of-common-watering-mistake-thats-killing-your-plants</link>
                                                                            <description>
                            <![CDATA[ Are you silently killing your plants? Expert reveals the watering mistakes you need to stop now to help them thrive. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">89Kokt7ifB5EgRtLZZTn2P</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/RwEx6rLyvjaHSBZyqWPrS9-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 17 Jun 2026 08:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/RwEx6rLyvjaHSBZyqWPrS9-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Man watering garden with a sprinkler hose]]></media:description>                                                            <media:text><![CDATA[Man watering garden with a sprinkler hose]]></media:text>
                                <media:title type="plain"><![CDATA[Man watering garden with a sprinkler hose]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/RwEx6rLyvjaHSBZyqWPrS9-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Now that warmer temperatures are upon us, we’re not the only ones who will be feeling the heat. Our lush lawns and plants are also parched from the heat wave, and when there are no signs of rain anytime soon, it’s not uncommon for us to increase our watering routine. </p><p>Besides knowing <a href="https://www.tomsguide.com/home/outdoors/garden-experts-share-the-best-time-to-water-your-lawn-and-ive-been-getting-it-all-wrong">the best time to water your lawn</a>, you’ll also need to know how to water your yard the right way. In fact, this can make all the difference in maintaining healthy growth. What’s more, you could be wasting water (and effort) — literally pouring money down the drain. </p><p>A gardening expert has warned of this one common watering habit we often make when watering our yards. In fact, you could be inadvertently killing your plants instead. </p><p>So before you unreel your hose or set your sprinklers, don’t make this common mistake this summer. </p><h3 class="article-body__section" id="section-don-t-just-water-the-surface-of-the-soil"><span>Don't just water the surface of the soil</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4888px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="9eCCFnHdVVJ7k8UnCA6Xua" name="Watering plants - crop.jpg" alt="Watering plants outdoors with watering can" src="https://cdn.mos.cms.futurecdn.net/9eCCFnHdVVJ7k8UnCA6Xua.jpg" mos="" align="middle" fullscreen="" width="4888" height="2750" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Watering plants outdoors with watering can </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>According to experts, it’s not the amount of water that will make your plants thrive during summer — it’s <strong>how </strong>you water. Most often, we only sprinkle the top layer of the soil and do not allow the roots to get a proper ‘drink’.  </p><p>“One of the most common mistakes I see is frequent shallow watering,” states Noah Mabey, senior gardener at Thornbridge Hall and Horticultural Advisor to <a href="https://ses.prwmsg.com/CL0/https:%2F%2Fwww.platinum-spas.com%2F/1/0102019ebabd7dd5-8a49edcc-95af-44c9-8cf3-fab7f2614298-000000/JjxKqwrju6Nm4x3B1Ll-bkoLTNzCl8O241pHmXqh5pk=452" target="_blank">Platinum Spas</a>. </p><p>“A quick sprinkle may dampen the surface of the soil, but it rarely reaches the roots where plants actually need moisture. In hot weather, much of that water can simply evaporate before it has any real benefit.”</p><div><blockquote><p>A quick sprinkle may dampen the surface of the soil, but it rarely reaches the roots where plants actually need moisture.</p><p>Noah Mabey, gardener at Thornbridge Hall</p></blockquote></div><p>So what’s the best method to water our yard and ensure it’s getting the right amount of hydration? “Instead, gardeners should focus on watering deeply and thoroughly at the base of the plant. The aim is always to get moisture down to the root zone. </p><p>“This encourages roots to grow deeper into the soil, creating stronger and more resilient plants that are better equipped to cope with dry periods.” </p><p>Additionally, experts suggest that your lawn soil should be moist 5 to 6 inches beneath the surface  — however, deep watering extends this to 7 to 8 inches deep. The idea behind deep watering is to encourage deep root growth, which keeps the roots cooler and stronger, protecting your lawn during heat stress.</p><p>For more top tips on watering your lawn, check out <a href="https://www.tomsguide.com/home/outdoors/gardening-experts-share-how-to-water-your-lawn-in-a-heatwave-youll-be-surprised">how to water a thirsty lawn in a heatwave — lawn experts reveal all.</a></p><h3 class="article-body__section" id="section-avoid-watering-little-and-often"><span>Avoid watering little and often</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:7348px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3ymX6AZmE6XqZ8U6vnS8CA" name="Watering soil - crop.jpg" alt="Man watering lawn" src="https://cdn.mos.cms.futurecdn.net/3ymX6AZmE6XqZ8U6vnS8CA.jpg" mos="" align="middle" fullscreen="" width="7348" height="4133" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Man watering lawn </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Similarly, gardeners often fall into the trap of watering little and often during the hot summer months. However, this habit can literally kill your plants, causing the roots to stay near the surface, where they are prone to drying out rapidly.</p><p>“Watering little and often can actually create weaker plants because the roots remain close to the surface where they dry out more quickly,” adds Mabey. “By watering deeply and consistently, you'll use water more efficiently while encouraging healthier growth.</p><p>“For containers and newly planted specimens, it's particularly important to monitor moisture levels during warm weather, as they can dry out much faster than established plants growing in the ground.”</p><p>So it’s always best to water your lawn and plants deeply and evenly during a heatwave. If you’re in doubt as to whether you’re giving your grass too much water, check out <a href="https://www.tomsguide.com/how-to/how-often-should-you-water-your-lawn-in-a-heatwave">how often you should water your lawn in a heatwave. </a></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-egZE5X"></div>                            </div>                            <script src="https://kwizly.com/embed/egZE5X.js" async></script><h3 class="article-body__section" id="section-gardening-watering-essentials-we-love"><span>Gardening watering essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="b7842d5f-5a81-4cb0-8e2a-45b602ff7076">            <a href="https://www.amazon.co.uk/dp/B0B7LMBHGQ?" data-model-name="Rain Gauge Outdoor, 7"" 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/9tg2fJfvgkE3grMsNYVU7L.jpg" alt="Hobyluby Rain Gauge Outdoor, 7 Inch Rain Gauges for Measuring Precipitation, Garden Yard Decor"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>HOBYLUBY</div>                                        <div class="featured__title">Rain Gauge Outdoor, 7"</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="c42f5e2f-976e-4446-9a83-d4ba2deaa3b6">            <a href="https://www.amazon.com/Qilebi-Watering-Removable-Stainless-Sprinkler/dp/B0BN2T87DY/ref=sr_1_7?dib=eyJ2IjoiMSJ9.BQwmZOmIN3ah4NaG8y9uun0YIkvTunRaoeR2c3x4MOzJxhf-7vpNNYlXQ56jv_q5o6wpnJ04-Ms1lieGc30ewVlBMsbU9FH_8v1nvUpiOdV-NNL-hney7-v2yo19rsIkPmKnHcLl7JfEtyYKRmYsF4VpXiLdwvIrCoWhM0x0IUHVfgmNeXd4y2YO_ryVO9nn9Uawcqd6CBJMZkR_4fXbp0vLQVNH2z0grz1ED8TWDyYftA-DN25FXuUr5J2OQtwtDCZb-kTFraPxYvS6Bk14ejYJ2siE3y8imRsRwEs6UoA.jHTgr5ft7E-D7VF-LVNzEl6WIuwKW6g1RAPVvtxv-J8&dib_tag=se&keywords=watering%2Bcans&qid=1781014473&sr=8-7&th=1" data-model-name="2 Gallon Watering Can" 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/z27aZSuNKziTx22mMEpHGW.jpg" alt="2 Gallon Watering Can, Garden Watering Can Outdoor, Plant Water Can With Removable Long Spout and Stainless Steel Sprinkler Head, Large Plastic Outdoor Watering Cans for Gardening Flower Plants"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Qilebi</div>                                        <div class="featured__title">2 Gallon Watering Can</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="c11ac587-10a1-46b9-809e-40f2a448590a">            <a href="https://www.amazon.com/Flexi-Hose-Function-Nozzle-50FT/dp/B0DZR7VRHL/ref=sr_1_3_sspa?" data-model-name="Expandable Garden Hose with 8 Function Nozzle, 50ft" 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/9m3GKeFbvcxDuZYngMgPic.jpg" alt="Flexi Hose Expandable Garden Hose With 8 Function Nozzle, 50ft - Lightweight Retractable Garden Hose, Water Hose - No-Kink Flexibility, 3/4 Inch Solid Brass Fittings and Double Latex Core"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Flexi Hose</div>                                        <div class="featured__title">Expandable Garden Hose with 8 Function Nozzle, 50ft</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="9306f571-6f7a-4d05-8512-ae91df678dd6">            <a href="https://www.amazon.com/Gardena-Adjustable-Oscillating-Sprinkler-sprinklers/dp/B07YSTB5K4/ref=sr_1_3?" data-model-name="Aquazoom Oscillating Outdoor Sprinkler, up to 3800 sq ft" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:45.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/DNyLz9MGeS3kSyJWcuvRCA.jpg" alt="Gardena 20570 | Up to 3800 Sq Ft - Aquazoom Adjustable Oscillating Yard Sprinkler, for Watering Large Area Lawn and Garden. Aquazoom Outdoor Oscillating Sprinkler Has Wide Heavy Duty Base."></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Gardena</div>                                        <div class="featured__title">Aquazoom Oscillating Outdoor Sprinkler, up to 3800 sq ft</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/home/outdoors/gardening-expert-reveals-the-best-time-of-day-to-water-your-tomato-plant-you-could-be-making-this-big-mistake">Gardening expert reveals the best time of day to water your tomato plant — you could be making this big mistake</a></li><li><a href="https://www.tomsguide.com/home/outdoors/garden-experts-share-the-best-time-to-water-your-lawn-and-ive-been-getting-it-all-wrong">Garden experts share the best time to water your lawn — and I've been getting it all wrong</a></li><li><a href="https://www.tomsguide.com/home/outdoors/how-to-water-your-garden-less-expert-tips-that-save-money-and-help-your-plants">How to water your garden less — 8 expert tips that save money and help your plants</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tried this genius money-saving hack to give my plants a boost — all you need is a box of matches ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/i-tried-this-genius-money-saving-hack-to-give-my-plants-a-boost-all-you-need-is-a-box-of-matches</link>
                                                                            <description>
                            <![CDATA[ I'm always on the lookout for money-saving garden hacks and this one using just a box of matches surprised me – here's what happened and how to do it yourself. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">32LJdWMmh79y76W2gzYT64</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jocQFFyf2k9NtRrjoB9TcW-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 16 Jun 2026 08:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Grace Dean ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oxXqkks7wgxZkPiyYY2n6H.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/jocQFFyf2k9NtRrjoB9TcW-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Using matches to make a fertilizer water for the garden]]></media:description>                                                            <media:text><![CDATA[Using matches to make a fertilizer water for the garden]]></media:text>
                                <media:title type="plain"><![CDATA[Using matches to make a fertilizer water for the garden]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jocQFFyf2k9NtRrjoB9TcW-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>My plants have been looking a little weary lately. I'm tempted to blame the sunny weather, but I fear that I'm just not giving them the attention they need. So, I headed to social media to see if I could find a hack that would help me out (and not cost me a lot of money).</p><p>After lots of searching, I finally stumbled upon something I'd never heard of before – using matches to create my very own plant-boosting fertilizer. It's a staple of my messy kitchen drawer that I usually only pull out when I need to light a birthday candle. Suddenly, I'm looking at that little box of matches in a totally different light. Here's what happened when I followed the simple hack to help feed my plants.</p><h2 id="how-does-it-work-2">How does it work?</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="high" data-lazy-src="https://www.youtube-nocookie.com/embed/tzcRJA6BUrY" allowfullscreen></iframe></div></div><p>YouTube creator, <a href="https://www.youtube.com/@creative_explained/shorts" target="_blank" rel="nofollow">@creative_explained</a>, has a page full of clever tips and tricks to use around your home that he shares with his almost 5 million subscribers (one of which is me). He taught me a clever <a href="https://www.tomsguide.com/home/gardening/this-cheap-gardening-hack-uses-a-common-household-ingredient-youre-probably-throwing-away">potato peel hack to supercharge my garden</a> that's saved me a bunch of money on fertilizer and he's even taught me <a href="https://www.tomsguide.com/home/this-tiktok-hack-claims-vinegar-will-clean-your-shower-head-i-asked-my-plumber-husband-if-it-actually-works">how to clean a shower head with vinegar</a>. </p><p>Sometimes, I like to head back into the archives on his page to see if there's any hacks I've missed and I was surprised by what I found. The video, featured above, reveals that you can feed your plants and give them a natural boost with just a box of matches and some water. Since I already have both those things in my home, I thought it was definitely worth a try – and it turns out it's <em>really</em> simple.</p><p><strong>All you have to do is this:</strong></p><ul><li><strong>Put 5 to 10 matches into a container</strong></li><li><strong>Fill the container with some water</strong></li><li><strong>Wait for around an hour</strong></li><li><strong>Give them a stir and use the pink water to pour onto your plants</strong></li></ul><p>He explains that by letting the matches soak in the water, it'll turn pink: "That's the phosphorous and sulfur being released into the water," he explains. "Pretty much what that means is that it's food for your plants! Phosphorous will help your plants grow these nice, healthy roots and sulfur will produce nice leafy greens." </p><p>But, while in the video you'll see him light the matches and let them burn, it turns out you don't want to do that – and I learned this first-hand when I tried it out.</p><div class="product"><a data-dimension112="1c9c8951-38b0-4fc4-9f9d-e36e6829f168" data-action="Deal Block" data-label="You may not think you need 10 boxes of matches, but there's plenty of ways to use them round your home from lighting tealight and birthday candles – and now for helping your plants grow. You get 32 matches per box, which means 320 matches in total for just over $5." data-dimension48="You may not think you need 10 boxes of matches, but there's plenty of ways to use them round your home from lighting tealight and birthday candles – and now for helping your plants grow. You get 32 matches per box, which means 320 matches in total for just over $5." data-dimension25="$5.49" href="https://www.amazon.com/GreenLight-Diamond-Strike-Matches-Count/dp/B005XP4FKI" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1122px;"><p class="vanilla-image-block" style="padding-top:114.26%;"><img id="rgJfbxVH6HopodjqVBPD2c" name="matches_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rgJfbxVH6HopodjqVBPD2c.png" mos="" align="middle" fullscreen="" width="1122" height="1282" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>You may not think you need 10 boxes of matches, but there's plenty of ways to use them round your home from lighting tealight and birthday candles – and now for helping your plants grow. You get 32 matches per box, which means 320 matches in total for just over $5. <a class="view-deal button" href="https://www.amazon.com/GreenLight-Diamond-Strike-Matches-Count/dp/B005XP4FKI" target="_blank" rel="nofollow" data-dimension112="1c9c8951-38b0-4fc4-9f9d-e36e6829f168" data-action="Deal Block" data-label="You may not think you need 10 boxes of matches, but there's plenty of ways to use them round your home from lighting tealight and birthday candles – and now for helping your plants grow. You get 32 matches per box, which means 320 matches in total for just over $5." data-dimension48="You may not think you need 10 boxes of matches, but there's plenty of ways to use them round your home from lighting tealight and birthday candles – and now for helping your plants grow. You get 32 matches per box, which means 320 matches in total for just over $5." data-dimension25="$5.49">View Deal</a></p></div><h2 id="here-s-what-happened-when-i-tried-it-2">Here's what happened when I tried 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fPQWq6W68LXSzJRHWVNvQW" name="matches_hack_1" alt="Using matches to make a fertilizer water for the garden" src="https://cdn.mos.cms.futurecdn.net/fPQWq6W68LXSzJRHWVNvQW.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>As mentioned, I made the mistake of lighting the matches when I first gave this a try. I'd seen the flames that @creative_explained had lit on his video and hadn't quite paid full attention that it was just for show. Look a little closer and you'll find that the matches inside the water are still red-tipped and that's because he hasn't let them burn.</p><p>This is an important part of this hack because if you burn them, you're eliminating the phosphorous and sulfur that you <em>need</em> for the water to turn pink and nutritious for your plants. So, after a couple of failed attempts, I used the matches without letting them burn. Lesson learned.</p><p>I also thought I'd like to use a little more water than he demonstrates with to make sure I could feed the numerous plants around my home. So, I added 10 matches in one go to see if that would help infiltrate more water – and it did.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WvvTxbz9pYDRwbTfPXwUcW" name="matches_hack_3" alt="Using matches to make a fertilizer water for the garden" src="https://cdn.mos.cms.futurecdn.net/WvvTxbz9pYDRwbTfPXwUcW.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Now, I've only just started trying this new match-infused water trick on my plants, so it's hard to say whether it's making any difference <em>yet. </em>What I do know is that it was super simple to do, very affordable and I haven't seen any damaging effects to the plants. </p><p>So, I'm wiling to keep trying it out using <a href="https://www.tomsguide.com/home/my-moms-thirsty-thursdays-routine-keeps-plants-thriving-and-heres-why-i-swear-by-it">my mom's 'Thirsty Thursday' routine</a> in collaboration with the matches. Since it's so low-cost and quick, it's easy to play the long game and see if my plants get an extra boost. Either way, I feel like I'm creating potions and that's made remembering to water my plants a lot more fun, too.</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/gardening/this-cheap-garden-hack-will-help-your-roses-grow-and-all-you-need-is-a-few-old-tea-bags">This cheap garden hack will help your roses grow — and all you need is a few old tea bags</a></li><li><a href="https://www.tomsguide.com/home/ive-just-discovered-this-strange-hack-thatll-keep-pests-away-from-your-plants-and-it-uses-a-popular-cold-medicine">I've just discovered this strange hack that'll keep pests away from your plants — and it uses a popular cold medicine</a></li><li><a href="https://www.tomsguide.com/home/gardening/this-garden-hack-will-help-your-plants-thrive-and-all-you-need-to-do-is-boil-some-eggs">This garden hack will help your plants thrive — and all you need to do is boil some eggs</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Kill invasive ivy naturally with this one household staple ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/kill-invasive-ivy-naturally-with-this-one-household-staple</link>
                                                                            <description>
                            <![CDATA[ The one simple household ingredient that will get rid of invasive ivy. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CDwEQYZF3cmJaZSHF4gwZA</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ut7vTffA5TNYVuhTvpbRdN-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 16 Jun 2026 06:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ut7vTffA5TNYVuhTvpbRdN-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Ivy growing on fence]]></media:description>                                                            <media:text><![CDATA[Ivy growing on fence]]></media:text>
                                <media:title type="plain"><![CDATA[Ivy growing on fence]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ut7vTffA5TNYVuhTvpbRdN-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>My neighbor has a slightly unruly garden, and without ill intentions, some of her plants creep into my yard. While I’m happy to share plants and cuttings with friends and family, there are some invasive species I’d prefer not to accept.</p><p>Luckily, I don’t have a problem with<a href="https://www.tomsguide.com/home/how-to-get-rid-of-japanese-knotweed-and-stop-this-invasive-weed-from-taking-over-your-yard"> Japanese knotweed</a> or <a href="https://www.tomsguide.com/home/outdoors/gardeners-urged-not-to-use-this-invasive-plant-that-could-seriously-damage-homes-and-yards">bamboo</a> becoming invasive in my yard, but I do have an issue with English ivy. And since it’s an <a href="https://www.tomsguide.com/how-to/7-invasive-plants-to-keep-out-of-your-yard">invasive plant, </a>it’s not easy to remove.</p><p>However, not all ivy is invasive, so it’s worth knowing which type of ivy you’re dealing with before removing it unnecessarily.</p><h2 id="which-type-of-ivy-is-invasive">Which type of ivy is invasive?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VSwdKnsVM95VNLhfw9TXNm" name="shutterstock_2556384177" alt="The leaf of Hedera canariensis, the Canary Island ivy" src="https://cdn.mos.cms.futurecdn.net/VSwdKnsVM95VNLhfw9TXNm.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>English ivy, also known as <em>Hedera helix</em>, made its way to North America as an ornamental plant, and it is the most notorious ivy for being an invader. However, it’s not the only non-native ivy that causes an issue. </p><p>Watch out for these four other types of ivy:</p><p><strong>Irish ivy </strong>(<em>Hedera hibernica</em>) is often confused with English ivy, although it has larger, glossier leaves. </p><p><strong>Canary Island ivy</strong> (<em>Hedera canariensis</em>) has large, broad, deep-green or variegated leaves, with reddish stems.</p><p><strong>Persian ivy </strong>(<em>Hedera colchica</em>) has sizable, heart-shaped, glossy leaves, which are the largest of the species. </p><p><strong>Japanese ivy</strong> (<em>Hedera rhombea</em>), also known as Boston ivy, features palm-shaped 3-lobed leaves that are bright green in summer and turn crimson in fall.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X16Rpe"></div>                            </div>                            <script src="https://kwizly.com/embed/X16Rpe.js" async></script><h2 id="the-problem-with-invasive-plants">The problem with invasive plants</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vXwB5nwbgcCyYcGugwdLn8" name="shutterstock_2793062755" alt="Woman removing ivy from brickwork" src="https://cdn.mos.cms.futurecdn.net/vXwB5nwbgcCyYcGugwdLn8.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Invasive plants can appear attractive; however, once they take root, they can be difficult to get rid of because of their aggressive root systems. What’s more, they crowd out nearby native plants, block sunlight and inhibit photosynthesis while competing for water and nutrients. </p><p>The specific problem with English ivy is that, apart from overrunning your garden, its aerial roots latch onto trees, walls and fences, causing costly damage. In fact, it’s one of the hardest plants I deal with in my yard. </p><p>What’s more, it secretes a sticky substance that hardens and locks the plant in place, making it tricky to remove. For me, I see the sticky plant as it clings to my fences and masonry, working its way into cracks in the mortar. </p><h2 id="how-to-get-rid-on-english-ivy-with-white-vinegar">How to get rid on English ivy with white vinegar</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HebJMq8QSHHBgCGumrjDkR" name="shutterstock_2667935889" alt="White vinegar being poured into garden sprayer" src="https://cdn.mos.cms.futurecdn.net/HebJMq8QSHHBgCGumrjDkR.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>One of the most well-known ways to naturally remove ivy is by using white vinegar. And although ivy is notoriously difficult to remove, it's worth trying this natural method before resorting to alternatives. </p><p><strong>Here’s what you need to do:</strong></p><p><strong>1. </strong>Combine <strong>one part white vinegar with four parts water</strong> and place the solution in a spray bottle. </p><p><strong>2.</strong> Wearing a pair of gloves to protect your hands from skin irritation, liberally <strong>apply the solution</strong> to the leaves and stems, avoiding the plant’s base and surrounding soil.</p><p>3. <strong>Avoid spraying surrounding plants</strong>, as the solution could cause damage.</p><p>4. Leave the white vinegar solution for<strong> five days</strong> to work.</p><p>5. Check back and <strong>reapply as required</strong>.</p><h2 id="why-does-white-vinegar-work">Why does white vinegar work?</h2><p>White vinegar contains acetic acid, which acts as a natural herbicide, breaking down a plant’s cellular structure. And it’s for this reason that it’s best not to spray near other plants.</p><p>Ivy has deep roots, which are difficult to tackle, so if this natural method doesn’t work to get rid of your plant, you may need to try removing the deep root system to stop it growing back.</p><h3 class="article-body__section" id="section-gardening-essentials-we-love"><span>Gardening essentials we love</span></h3>        <div class="featured_product_block featured_block_hero" data-id="a50f3d04-06de-4520-bd3a-7b68ca9465aa">            <a href="https://www.amazon.com/Felco-F-2-Classic-Manual-Pruner/dp/B00023RYS6" data-model-name="F2 Pruning Shears" 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/pVTQGL4DSUSgfk9pVKhLgm.jpg" alt="Felco 2 bypass pruners"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Felco </div>                                        <div class="featured__title">F2 Pruning Shears</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="3962da58-4347-4d82-b597-4fb292f5bc28">            <a href="https://www.amazon.com/dp/B07BD2GZW8" data-model-name="Garden Gloves" 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/YyBJP4YUpLVNV4q2yKFfjS.jpg" alt="Amazing Stuff For You green and gray gardening gloves"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazing Stuff</div>                                        <div class="featured__title">Garden Gloves</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d52ac158-3ce5-4691-83a2-31c3e66bc71e">            <a href="https://www.homedepot.com/pep/Corona-ComfortGEL-6-5-in-Comfort-Grip-Stainless-Steel-Hand-Trowel-CT-3214/205811685?" data-model-name="ComfortGEL 6.5 inch Stainless Steel Hand Trowel:" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:99.84%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/pFmmWavYqAu55zSSvQ7b8U.png" alt="Corona hand trowel"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corona </div>                                        <div class="featured__title">ComfortGEL 6.5 inch Stainless Steel Hand Trowel:</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="54340988-6c53-42f4-80f3-dc28f40a1bc4">            <a href="https://www.amazon.com/Grampas-Weeder-CW-01-Original-Remover/dp/B001D1FFZA?" data-model-name="Grampa's Weeder" 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/kP7pgu2tpxz8d34HtVQgxC.jpg" alt="Grampa's Weeder The Original Stand Up Weed Puller Tool with Long Handle"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title">Grampa's Weeder</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </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/home/outdoors/how-to-stop-neighbors-weeds-invading-your-lawn-5-expert-tips">How to stop neighbors’ weeds invading your lawn — 5 expert tips</a></li><li><a href="https://www.tomsguide.com/home/7-ways-to-banish-weeds-from-your-lawn-that-wont-harm-the-grass">7 tips to banish weeds from your lawn that won’t harm the grass</a></li><li><a href="https://www.tomsguide.com/home/i-used-this-dollar23-garden-tool-to-rid-my-patio-of-weeds">I tried this $23 garden tool to rid my patio of weeds — and it’s super handy</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Stop making this tomato-growing mistake: It could stunt growth and encourage disease ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/stop-making-this-tomato-growing-mistake-it-could-stunt-growth-and-encourage-disease</link>
                                                                            <description>
                            <![CDATA[ Want bigger, healthier tomatoes? Then stop making this mistake with your plants. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hCEHFY4JhZx2R8MoA4DdCk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/eGWsAiXECXnXYQUYzny3Qd-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 15 Jun 2026 11:31:38 +0000</pubDate>                                                                                                                                <updated>Mon, 15 Jun 2026 11:37:46 +0000</updated>
                                                                                                                                            <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                <author><![CDATA[ camilla.sharman@futurenet.com (Camilla Sharman) ]]></author>                    <dc:creator><![CDATA[ Camilla Sharman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/nY4nvWzofHKHpvzAqN5LVH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Camilla is the Homes Staff Writer and covers everything to do with homes and gardens. She has a wealth of editorial experience, mounting over 30 years, and covers news and features, tests products for reviews and compiles buying guides.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Her work has appeared in business and consumer titles, including Ideal Home, Real Homes, House Beautiful, Homebuilding &amp;amp; Renovation, and Kitchen &amp;amp; Bathroom Business. She’s even appeared on the cover of Your Home, writing about her own house renovation.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Although she’s obsessed with decorating her home, she also enjoys baking and trying out the latest kitchen appliances. But when she’s not inside, you’ll find her pottering about in her yard, tending to her vegetable patch or taking in her prized hydrangeas. She also enjoys keeping fit, and if she&#039;s not on a spin bike trying to keep up with the class, she&#039;ll be in the pool, or trying to perfect her headstand in a yoga class.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/eGWsAiXECXnXYQUYzny3Qd-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Woman´s hands picking fresh tomatoes to wicker basket. ]]></media:description>                                                            <media:text><![CDATA[Woman´s hands picking fresh tomatoes to wicker basket. ]]></media:text>
                                <media:title type="plain"><![CDATA[Woman´s hands picking fresh tomatoes to wicker basket. ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/eGWsAiXECXnXYQUYzny3Qd-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>My <a href="https://www.tomsguide.com/home/gardening/toms-guide-to-tomatoes">tomato plants</a> are looking healthy, and I plan to keep them that way, which is why I’m on the search for tomato-growing tips. I’ve already placed <a href="https://www.tomsguide.com/home/outdoors/the-best-companion-plants-for-tomatoes-for-a-stronger-pest-free-harvest">companion plants</a> nearby to deter pests and added a plant pot in the soil to allow for<a href="https://www.tomsguide.com/home/gardening-pros-swear-by-this-ingenious-tomato-watering-trick-try-it-for-juicier-plumper-tomatoes"> deep watering</a>.</p><p>But now I’m going to share one tomato-growing mistake you should avoid. If you skip this step in your tomato care, it can encourage disease and lead to a smaller harvest. And when you’re growing your own tomatoes to enjoy fresh off the vine, you’ll want to optimize your crop and avoid making any errors.</p><div class="product"><a data-dimension112="5ff109bf-d39f-4c0a-a8bf-5694f186f73b" data-action="Deal Block" data-label="These ultra-durable bypass pruning shears are constructed of forged aluminium handles and hardened steel blades. They are suitable for any kind of pruning and also feature a wire cutter. The ergonomic handle provides added comfort and cushioned support while cutting." data-dimension48="These ultra-durable bypass pruning shears are constructed of forged aluminium handles and hardened steel blades. They are suitable for any kind of pruning and also feature a wire cutter. The ergonomic handle provides added comfort and cushioned support while cutting." data-dimension25="$64" href="https://www.amazon.com/Felco-Pruning-Shears-Performance-One-Hand/dp/B0001IOYX0/ref=sr_1_5?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:461px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Ru7w9S4JyTF5zbKN3vZB7c" name="Screenshot-2024-06-12-172543edit.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Ru7w9S4JyTF5zbKN3vZB7c.jpg" mos="" align="middle" fullscreen="" width="461" height="461" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These ultra-durable bypass pruning shears are constructed of forged aluminium handles and hardened steel blades. They are suitable for any kind of pruning and also feature a wire cutter. The ergonomic handle provides added comfort and cushioned support while cutting. <a class="view-deal button" href="https://www.amazon.com/Felco-Pruning-Shears-Performance-One-Hand/dp/B0001IOYX0/ref=sr_1_5?" target="_blank" rel="nofollow" data-dimension112="5ff109bf-d39f-4c0a-a8bf-5694f186f73b" data-action="Deal Block" data-label="These ultra-durable bypass pruning shears are constructed of forged aluminium handles and hardened steel blades. They are suitable for any kind of pruning and also feature a wire cutter. The ergonomic handle provides added comfort and cushioned support while cutting." data-dimension48="These ultra-durable bypass pruning shears are constructed of forged aluminium handles and hardened steel blades. They are suitable for any kind of pruning and also feature a wire cutter. The ergonomic handle provides added comfort and cushioned support while cutting." data-dimension25="$64">View Deal</a></p></div><h2 id="failing-to-prune-your-tomatoes">Failing to prune your tomatoes</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ExS2afw7pPGR5jqShNsPk8" name="shutterstock_2473131295" alt="Pruning lower leaves on tomato plant" src="https://cdn.mos.cms.futurecdn.net/ExS2afw7pPGR5jqShNsPk8.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>The one mistake you could be making is not pruning your tomatoes. I’m not referring to <a href="https://www.tomsguide.com/home/why-you-need-to-pinch-out-tomato-plants-heres-how-and-when-to-do-it">pinching out tomatoes</a>, which involves removing the side shoots on indeterminate plants (vining types that produce throughout the whole season), but rather to removing larger stems.</p><p>In fact, pruning your tomato plants can be key to a bumper harvest and help prevent disease. </p><p>So, before you get out your <a href="https://www.tomsguide.com/best-picks/best-pruning-shears">pruning shears</a> and start snipping at your plants, here’s exactly what you should do. </p><p><a href="https://www.instagram.com/leafmewander/reels/" target="_blank">LeafMeWander</a> on Instagram says, “Leaving the bottom branches touching the soil creates a ‘splash zone’ for pests and fungal disease like blight. By snipping them off, you maximize airflow and keep your plants healthy — meaning a way longer harvest season and much bigger fruit!”</p><div class="instagram-embed"><blockquote class="instagram-media"  data-instgrm-version="6" style="width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><p><a href="https://www.instagram.com/p/DZGKEjCRZdB/" target="_blank">A post shared by LeafMeWander 🌿 (@leafmewander)</a></p><p>A photo posted by  on </p></blockquote></div><p>Apart from improving airflow, removing the lower leaves directs more energy toward fruit production and increases sunlight penetration. </p><p>And according to <a href="https://www.instagram.com/reels/DZPthSDBrCP/" target="_blank">pinkwillow_farm</a>, who also shares this pruning method on Instagram, you can start pruning the lower leaves as soon as you plant your tomatoes. </p><p>The best thing about this tomato-growing tip is that it takes hardly any time, and all you need is a<a href="https://www.tomsguide.com/home/outdoors/extend-the-life-our-your-pruning-shears-heres-how-to-keep-them-clean-and-sharp"> clean and sharp pair of pruning shears</a> to avoid spreading disease. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OLQ7gX"></div>                            </div>                            <script src="https://kwizly.com/embed/OLQ7gX.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/home/im-going-to-be-trying-these-top-4-tips-to-get-my-tomatoes-tasting-as-if-they-were-grown-in-italy-after-an-italian-farmer-shared-why-i-shouldnt-rush-the-land">Grow your tomatoes the Mediterranean way: Top tips from an Italian farmer</a></li><li><a href="https://www.tomsguide.com/home/when-to-pick-tomatoes-off-the-vine">3 ways to tell that your tomatoes are ready to harvest</a></li><li><a href="https://www.tomsguide.com/home/gardening/why-marigolds-are-the-best-companion-flower-for-a-pest-free-vegetable-garden-especially-tomatoes">Why marigolds are the best companion flower for a pest-free vegetable garden (especially tomatoes)</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>