{"title":"Maintenance Products","description":"\u003cdiv class=\"page-headers\"\u003e\n\u003cdiv class=\"texts-box\"\u003e\n\u003cp class=\"description\"\u003eKeep your heating appliance in perfect condition with our selection of essential maintenance products.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e","products":[{"product_id":"start-up-kit","title":"START-UP KIT","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Includes: fire starter (50 bags), stove paint 12 OZ, high quality gloves, digital moisture meter, glass cleaner (500 mL - 16.9 FL.OZ) and thermometer with probe for double wall venting.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43693676757043,"sku":"AC01380","price":189.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC01380_web.webp?v=1761080732"},{"product_id":"3-pellet-stove-cleaning-kit","title":"3\" PELLET STOVE CLEANING KIT","description":"\u003cp\u003e\u003cspan\u003eIncludes: a stainless steel bristled brush along with a long scraper featuring a tough steel blade and an ergonomic handle. Efficiently removes the hardened buildup on the burn pot surface and holes, as well as the outlet of the pellet supply auger housing. A Ø3\" (76 mm) chimney brush (1\/4\"-20 thread) with flexible rods allowing cleaning up to 10 feet (3.04 m). To ease maintenance of exhaust systems with offsets. A nylon bristled tapered brush with a long steel rod and a wooden handle. Ideal for tight spaces and diameters between 1\" (25 mm) and 2 1\/4\" (57 mm). A glass cleaner (500 mL-16.9 fl.oz.). Used regularly, it prevents permanent stains on the glass.\u003c\/span\u003e\u003c\/p\u003e","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43693677412403,"sku":"AC02712","price":110.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC02712.webp?v=1761080927"},{"product_id":"4-pellet-stove-cleaning-kit","title":"4\" PELLET STOVE CLEANING KIT","description":"\u003cp\u003e\u003cspan\u003eIncludes: a stainless steel bristled brush along with a long scraper featuring a tough steel blade and an ergonomic handle. Efficiently removes the hardened buildup on the burn pot surface and holes, as well as the outlet of the pellet supply auger housing. A Ø4\" (102 mm) chimney brush (1\/4\"-20 thread) with flexible rods allowing cleaning up to 10 feet (3.04m). To ease maintenance of exhaust systems with offsets. A nylon bristled tapered brush with a long steel rod and a wooden handle. Ideal for tight spaces and diameters between 1\" (25 mm) and 2 1\/4\" (57 mm). A glass cleaner (500 mL-16.9 fl.oz.). Used regularly, it prevents permanent stains on the glass.\u003c\/span\u003e\u003c\/p\u003e","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43693678985267,"sku":"AC02714","price":125.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC02712.webp?v=1761080927"},{"product_id":"cardboard-frame-air-filter-with-support-20-x-15-x-1","title":"CARDBOARD FRAME AIR FILTER WITH SUPPORT (20\" x 15\" x 1\")","description":"\u003cp\u003e\u003cspan\u003eSet includes: 1x bracket, 2x housing plates, 1x filter and 24x screws.\u003c\/span\u003e\u003c\/p\u003e\n\u003ch4\u003e\u003cstrong\u003eManuals and Instructions\u003c\/strong\u003e\u003c\/h4\u003e\n\u003cdiv class=\"manual-description-text\"\u003e\n\u003cp\u003eConsult the available manuals and leaflets for more information on performance, installation and use requirements, etc.\u003c\/p\u003e\n\u003cp\u003e🔗\u003ca href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45695A-F_16-04-2015.pdf?v=1761081556\"\u003eInstallation and user's manual\u003c\/a\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"manual-description-text\"\u003e\u003c\/div\u003e","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43693681246259,"sku":"AC01390","price":79.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC01390.webp?v=1761081434"},{"product_id":"washable-aluminum-air-filter-with-support-20-x-15-x-1","title":"WASHABLE ALUMINUM AIR FILTER WITH SUPPORT (20\" x 15\" x 1\")","description":"\u003cp\u003e\u003cspan\u003eIncludes: 1x washable filter, 1x filter holder, 2x air deflectors and fixing screws. Be sure to clean and replace your wood furnace filter regularly to protect the blower motor from dust accumulation. If the filter is not cleaned regularly the furnace will overheat.\u003c\/span\u003e\u003c\/p\u003e\n\u003ch4\u003e\u003cstrong\u003eManuals and Instructions\u003c\/strong\u003e\u003c\/h4\u003e\n\u003cdiv class=\"manual-description-text\"\u003e\n\u003cp\u003eConsult the available manuals and leaflets for more information on performance, installation and use requirements, etc.\u003c\/p\u003e\n\u003cp\u003e🔗\u003ca href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45695A-F_16-04-2015.pdf?v=1761081556\"\u003eInstallation and user's manual\u003c\/a\u003e\u003c\/p\u003e\n\u003c\/div\u003e","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43693683015731,"sku":"AC01391","price":100.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC01391.webp?v=1761081716"},{"product_id":"cold-air-return-housing-with-filter","title":"COLD AIR RETURN HOUSING WITH FILTER","description":"\u003cp\u003e\u003cspan\u003eAllows the installation of a cold air return duct, it includes the support that is necessary for the installation of an air filter. Includes: 1x case top, 1x case bottom, 2x case sides, 1x filter, 1x filter holder, 2x air deflectors and fixing screws. Be sure to clean and replace your wood furnace filter regularly to protect the blower motor from dust accumulation.\u003c\/span\u003e\u003c\/p\u003e\n\u003ch4\u003e\u003cstrong\u003eManuals and Instructions\u003c\/strong\u003e\u003c\/h4\u003e\n\u003cdiv class=\"manual-description-text\"\u003e\n\u003cp\u003eConsult the available manuals and leaflets for more information on performance, installation and use requirements, etc.\u003c\/p\u003e\n\u003cp\u003e🔗\u003ca href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45696A-F_17-12-2014.pdf?v=1761100818\"\u003eInstallation and user's manual\u003c\/a\u003e\u003c\/p\u003e\n\u003c\/div\u003e","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695130443827,"sku":"AC01392","price":100.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC01392_2025_MFP.webp?v=1761100763"},{"product_id":"hepa-filter-with-spark-arrestor-for-ash-vacuum-ac02582","title":"HEPA FILTER WITH SPARK ARRESTOR FOR ASH VACUUM (AC02582)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      This filter HEPA allows to trap effectively the small particles of dry waste. The air sucked up by the sweeper is filtered and cleared of a very big part of allergens, for a healthier air. Resistant and easy to clean, it is enough to shake it or to rinse to remove the impurities.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695144173619,"sku":"AC02581","price":19.5,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC02581.webp?v=1761101227"},{"product_id":"sootstop-fabric-pre-filter-with-metal-filter-for-ac02582-ash-vacuum","title":"SOOTSTOP FABRIC PRE-FILTER WITH METAL FILTER FOR AC02582 ASH VACUUM","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      For a greater longevity of the engine of your sweeper, add on your filter HEPA, it pre-filters cloth and metal sootstop. Specially designed to trap effectively the particles of very small sizes so fine and volatile as the ash, it will preserve all its power of suction in spite of the accumulation of dusts. Easy maintenance: shake it simply or wash it. Replace immediately if the fabric is damaged.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695146631219,"sku":"AC02584","price":13.5,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC02584.webp?v=1761101453"},{"product_id":"filter-kit-for-ac02586-ash-vacuum-cleaner","title":"FILTER KIT FOR (AC02586) ASH VACUUM CLEANER","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Designed to effectively trap very small fine and volatile particles such as cooled ashes. Its HEPA filter ensures healthier air, improving the quality of the air you breathe. Durable and easy to install, replace it as soon as the cloth is filled with impurities or damaged, for longer vacuum motor life.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695146795059,"sku":"AC02587","price":26.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC02587.webp?v=1761116087"},{"product_id":"20-x-16-x-1-cardboard-air-filter-12-box","title":"20\" x 16\" x 1\" CARDBOARD AIR FILTER (12\/BOX)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Economical box of 12 cardboard filters.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695344779315,"sku":"AC02764B","price":119.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC02764B.webp?v=1761116271"},{"product_id":"filter-support-housing","title":"FILTER SUPPORT HOUSING","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      No descriptions available for this product\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695346384947,"sku":"SE68609","price":200.0,"currency_code":"CAD","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/SE68609.webp?v=1761116402"},{"product_id":"cardboard-air-filter-11-x-20-x-1","title":"CARDBOARD AIR FILTER 11\" x 20\" x 1\"","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      This furnace air filter plays a key role in keeping your furnace running smoothly and improving indoor air quality.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695352873011,"sku":"21040","price":25.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/21040.webp?v=1761116816"},{"product_id":"cardboard-frame-air-filter-20-x-15-x-1","title":"CARDBOARD FRAME AIR FILTER 20\" x 15\" x 1\"","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      This furnace air filter plays a key role in keeping your furnace running smoothly and improving indoor air quality.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695352938547,"sku":"21044","price":20.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/21044.webp?v=1761116855"},{"product_id":"filter-12-x-24-x-1","title":"FILTER 12\" x 24\" x 1\"","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      This furnace air filter plays a key role in keeping your furnace running smoothly and improving indoor air quality.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695356018739,"sku":"21063","price":20.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/21063.webp?v=1761117396"},{"product_id":"cardboard-air-filter-20-x-16-x-1","title":"CARDBOARD AIR FILTER 20\" x 16\" x 1\"","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      This furnace air filter plays a key role in keeping your furnace running smoothly and improving indoor air quality.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695356051507,"sku":"21231","price":20.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/21231.webp?v=1761117470"},{"product_id":"axial-blower-air-filter","title":"AXIAL BLOWER AIR FILTER","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      This furnace air filter plays a key role in keeping your furnace running smoothly and improving indoor air quality.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695356084275,"sku":"21300","price":25.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/21300.webp?v=1761117522"},{"product_id":"cardboard-air-filter-25-x-14-x-1","title":"CARDBOARD AIR FILTER 25\" x 14\" x 1\"","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      This furnace air filter plays a key role in keeping your furnace running smoothly and improving indoor air quality.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695356117043,"sku":"21367","price":20.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/21367.webp?v=1761117574"},{"product_id":"washable-aluminium-air-filter-20-x-15-x-1","title":"WASHABLE ALUMINIUM AIR FILTER 20\" x 15\" x 1\"","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Designed to be cleaned and reused several times, unlike disposable filters which have to be replaced periodically. Made from durable, resistant materials such as wire mesh or synthetic fabric, it captures particles while being washed without losing its effectiveness.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695384035379,"sku":"21439","price":75.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/21439.webp?v=1761121211"},{"product_id":"carbon-dust-filter-tdfilhen2","title":"CARBON DUST FILTER (TDFILHEN2)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      The air filter plays a key role in ensuring your appliance runs smoothly and improving indoor air quality.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695384592435,"sku":"31111","price":65.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/31111.webp?v=1761121779"},{"product_id":"teflon-type-filter-tdfite02","title":"TEFLON TYPE FILTER (TDFITE02)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      The air filter plays a key role in ensuring your appliance runs smoothly and improving indoor air quality.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695401009203,"sku":"31112","price":95.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/Untitleddesign_17.png?v=1764790950"},{"product_id":"fiberglass-rod-4-3-8-npt","title":"FIBERGLASS ROD 4' (3\/8\" NPT)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Made from 4-foot-long flexible fiberglass for easy maintenance.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695416901683,"sku":"49420","price":35.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/49420.webp?v=1761122773"},{"product_id":"ash-vacuum-cleaner","title":"ASH VACUUM CLEANER","description":"\u003cp\u003e\u003cspan\u003eConforms to UL STD. 1017. Certified to CSA STD. C22.2 No. 243-01. Avoid ending prematurely the life of your vacuum cleaner by using the ideal tool to suck up the completely cooled ashes of your wood or pellet appliance. Designed almost exclusively for ash collection, this ash vacuum cleaner will offer several years of service with proper care. Power: 1000 W.\u003c\/span\u003e\u003c\/p\u003e\n\u003ch4\u003e\u003cstrong\u003eManuals and Instructions\u003c\/strong\u003e\u003c\/h4\u003e\n\u003cdiv class=\"manual-description-text\"\u003e\n\u003cp\u003eConsult the available manuals and leaflets for more information on performance, installation and use requirements, etc.\u003c\/p\u003e\n\u003cp\u003e🔗\u003ca href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC02586_2022-08-25.pdf?v=1761129552\"\u003eOperating Instructions\u003c\/a\u003e\u003c\/p\u003e\n\u003c\/div\u003e","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695564750899,"sku":"AC02586","price":139.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC02586-1.webp?v=1761129121"},{"product_id":"ash-vac-hose-ac02582","title":"ASH VAC HOSE (AC02582)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Replacement part for vacuum cleaner AC02582.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695575957555,"sku":"30821","price":65.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/30821.webp?v=1761131669"},{"product_id":"ash-vac-aluminium-nozzle-ac02582","title":"ASH VAC ALUMINIUM NOZZLE (AC02582)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Replacement part for vacuum cleaner AC02582.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43695748218931,"sku":"30822","price":20.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/30822.webp?v=1761139023"},{"product_id":"chimney-hearth-grill-cleaner-rx-wsc","title":"CHIMNEY HEARTH \u0026 GRILL CLEANER (RX-WSC)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      No descriptions available for this product\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    🌍 \u003cstrong\u003eMade in:\u003c\/strong\u003e\n    \u003cspan class=\"flags-inline\"\u003e\n      \u003cspan class=\"flag-pair\"\u003e\n        \u003cimg class=\"flag-image\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/download.png?v=1758991613\" alt=\"Canada Flag\"\u003e\n        \u003cspan\u003eCanada\u003c\/span\u003e\n      \u003c\/span\u003e\n    \u003c\/span\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"Englander","offers":[{"title":"Default Title","offer_id":43696020160563,"sku":"AC03411","price":35.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC03512.webp?v=1761139689"},{"product_id":"dry-cleaning-pad","title":"DRY CLEANING PAD","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Our dry cleaning pad is specially designed for stove and fireplace glass. It effectively removes soot and stubborn stains without scratching the surface. Enjoy a perfectly clean glass to fully appreciate the beauty of your flames.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696021110835,"sku":"AC07824","price":16.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC07824.webp?v=1761139914"},{"product_id":"wood-appliance-glass-cleaner","title":"WOOD APPLIANCE GLASS CLEANER","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Our dry cleaning pad is specially designed for stove and fireplace glass. It effectively removes soot and stubborn stains without scratching the surface. Enjoy a perfectly clean glass to fully appreciate the beauty of your flames.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696023207987,"sku":"AC07825","price":16.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC07825.webp?v=1761140268"},{"product_id":"pellet-appliance-glass-cleaner-500-ml-16-9-fl-oz","title":"PELLET APPLIANCE GLASS CLEANER (500 mL - 16.9 FL.OZ.)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Recommended for cleaning the glass of any pellet appliances.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696024256563,"sku":"AC07827","price":14.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC07827.webp?v=1761140385"},{"product_id":"gas-appliance-glass-cleaner-236-ml-8-fl-oz","title":"GAS APPLIANCE GLASS CLEANER (236 mL - 8 FL.OZ.)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      No description available for this product\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696024780851,"sku":"OA11430","price":11.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/OA11430.webp?v=1761140504"},{"product_id":"6-round-brush-with-polypropylene-bristles-3-8-npt","title":"6\" ROUND BRUSH WITH POLYPROPYLENE BRISTLES (3\/8\" NPT)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Ideal to prevent creosote build-up inside the chimney.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696027959347,"sku":"AC04500","price":20.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC04500.webp?v=1761140786"},{"product_id":"7-round-brush-with-polypropylene-bristles-3-8-npt","title":"7\" ROUND BRUSH WITH POLYPROPYLENE BRISTLES (3\/8\" NPT)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Ideal to prevent creosote build-up inside the chimney.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696028909619,"sku":"AC04501","price":20.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC04501.webp?v=1761141073"},{"product_id":"8-round-brush-with-polypropylene-bristles-3-8-npt","title":"8\" ROUND BRUSH WITH POLYPROPYLENE BRISTLES (3\/8\" NPT)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Ideal to prevent creosote build-up inside the chimney.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696030056499,"sku":"AC04502","price":20.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC04501.webp?v=1761141073"},{"product_id":"4-pellet-stove-round-brush-1-4-20-thread","title":"4\" PELLET STOVE ROUND BRUSH (1\/4\"-20 THREAD)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Regularly clean your vent pipes to maintain optimal efficiency of your pellet appliance. This 4\"Ø brush, although made from flexible bristles, will be equally effective. Specifically designed to simplify pellet vent sweeping, in particular with installation that have 45° or 90° elbows.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696030285875,"sku":"AC04504","price":15.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC04505.webp?v=1761141265"},{"product_id":"3-round-pellet-stove-brush-1-4-20-thread","title":"3\" ROUND PELLET STOVE BRUSH (1\/4\"-20 THREAD)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Regularly clean your vent pipes to maintain optimal efficiency of your appliance. This 3\"Ø brush, although made from flexible bristles, will be equally effective. Specifically designed to simplify pellet vent sweeping, in particular with installation that have 45° or 90° elbows.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696039362611,"sku":"AC04505","price":10.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC04505.webp?v=1761141265"},{"product_id":"4-round-pellet-stove-brush-1-4-20-thread","title":"4\" ROUND PELLET STOVE BRUSH (1\/4\"-20 THREAD)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Regularly clean your vent pipes to maintain optimal efficiency of your appliance. This 4\"Ø brush, although made from flexible bristles, will be equally effective. Specifically designed to simplify pellet vent sweeping, in particular with installation that have 45° or 90° elbows.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696047521843,"sku":"AC04506","price":10.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC04505.webp?v=1761141265"},{"product_id":"5-pellet-stove-flexible-rod-1-4-20-thread","title":"5' PELLET STOVE FLEXIBLE ROD (1\/4\"-20 THREAD)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Useful to sweep your pellet stove vent pipe #AC04503 #AC04504, #AC04505 ou #AC04506. Note: 1\/4\"-20 thread and 1\/4\"NPT are NOT compatible.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696049520691,"sku":"AC04510","price":18.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC04510.webp?v=1761143639"},{"product_id":"box-of-12-5-pellet-stove-flexible-rod-1-4-20-thread","title":"BOX OF 12 5' PELLET STOVE FLEXIBLE ROD (1\/4\"-20 THREAD)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Useful to sweep your pellet stove vent pipe #AC04503 #AC04504, #AC04505 ou #AC04506. Note: ¼\"-20 thread and ¼\"NPT are NOT compatible.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    🌍 \u003cstrong\u003eMade in:\u003c\/strong\u003e\n    \u003cspan class=\"flags-inline\"\u003e\n      \u003cspan class=\"flag-pair\"\u003e\n        \u003cimg class=\"flag-image\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/usa-5bd2139a62f1d18a7eb84549b9847120.png?v=1758991655\" alt=\"USA Flag\"\u003e\n        \u003cspan\u003eUnited States\u003c\/span\u003e\n      \u003c\/span\u003e\n    \u003c\/span\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696057352243,"sku":"AC04510B","price":195.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC04510B.webp?v=1761143907"},{"product_id":"adaptor-3-8-npt-to-1-4-fem","title":"ADAPTOR (3\/8\" NPT TO 1\/4\" FEM)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Ideal for connecting a 3\/8\" NPT male pipe thread to 1\/4\" NPT female thread.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    🌍 \u003cstrong\u003eMade in:\u003c\/strong\u003e\n    \u003cspan class=\"flags-inline\"\u003e\n      \u003cspan class=\"flag-pair\"\u003e\n        \u003cimg class=\"flag-image\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/download.png?v=1758991613\" alt=\"Canada Flag\"\u003e\n        \u003cspan\u003eCanada\u003c\/span\u003e\n      \u003c\/span\u003e\n    \u003c\/span\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696058531891,"sku":"AC04514","price":14.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC04514.webp?v=1761144139"},{"product_id":"5-fibreglass-rod-3-8-npt","title":"5' FIBREGLASS ROD (3\/8\" NPT)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Easy to assemble. Fiberglass rod. Finished with a heavy metal male and female fitting.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696059154483,"sku":"AC04513","price":12.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC04513.webp?v=1761144354"},{"product_id":"heat-exchanger-scraper","title":"HEAT EXCHANGER SCRAPER","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      This scraper removes deposits from your heat exchanger to restore thermal efficiency, extend exchanger life and prevent breakdowns or failures.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    🌍 \u003cstrong\u003eMade in:\u003c\/strong\u003e\n    \u003cspan class=\"flags-inline\"\u003e\n      \u003cspan class=\"flag-pair\"\u003e\n        \u003cimg class=\"flag-image\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/download.png?v=1758991613\" alt=\"Canada Flag\"\u003e\n        \u003cspan\u003eCanada\u003c\/span\u003e\n      \u003c\/span\u003e\n    \u003c\/span\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696197566515,"sku":"PL48170","price":30.0,"currency_code":"CAD","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/PL48170.webp?v=1761148564"},{"product_id":"ash-shovel","title":"ASH SHOVEL","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Designed specifically for collecting and handling cooled ashes after using your wood-burning appliance.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    🌍 \u003cstrong\u003eMade in:\u003c\/strong\u003e\n    \u003cspan class=\"flags-inline\"\u003e\n      \u003cspan class=\"flag-pair\"\u003e\n        \u003cimg class=\"flag-image\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/download.png?v=1758991613\" alt=\"Canada Flag\"\u003e\n        \u003cspan\u003eCanada\u003c\/span\u003e\n      \u003c\/span\u003e\n    \u003c\/span\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"PSG","offers":[{"title":"Default Title","offer_id":43696200712243,"sku":"PL48171","price":45.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/PL48171.webp?v=1761148688"},{"product_id":"poker","title":"POKER","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Designed to handle logs, embers or ashes, this tool is mainly used to adjust burning logs or pieces of wood, to feed the fire, or to distribute embers to control temperature and combustion efficiency.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    🌍 \u003cstrong\u003eMade in:\u003c\/strong\u003e\n    \u003cspan class=\"flags-inline\"\u003e\n      \u003cspan class=\"flag-pair\"\u003e\n        \u003cimg class=\"flag-image\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/download.png?v=1758991613\" alt=\"Canada Flag\"\u003e\n        \u003cspan\u003eCanada\u003c\/span\u003e\n      \u003c\/span\u003e\n    \u003c\/span\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"PSG","offers":[{"title":"Default Title","offer_id":43696202580019,"sku":"PL48173","price":40.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/PL48173.webp?v=1761148774"},{"product_id":"maintenance-scraper","title":"MAINTENANCE SCRAPER","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      This scraper removes accumulated deposits from your pellet furnace to restore thermal efficiency, extend service life and prevent breakdowns or failures.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    🌍 \u003cstrong\u003eMade in:\u003c\/strong\u003e\n    \u003cspan class=\"flags-inline\"\u003e\n      \u003cspan class=\"flag-pair\"\u003e\n        \u003cimg class=\"flag-image\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/download.png?v=1758991613\" alt=\"Canada Flag\"\u003e\n        \u003cspan\u003eCanada\u003c\/span\u003e\n      \u003c\/span\u003e\n    \u003c\/span\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696203759667,"sku":"PL58640","price":40.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/PL58640.webp?v=1761148862"},{"product_id":"scraper","title":"SCRAPER","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      Removes accumulated deposits in your pellet stove, restoring thermal efficiency, extending the life of your heating appliance and preventing breakdowns or failures.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    🌍 \u003cstrong\u003eMade in:\u003c\/strong\u003e\n    \u003cspan class=\"flags-inline\"\u003e\n      \u003cspan class=\"flag-pair\"\u003e\n        \u003cimg class=\"flag-image\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/download.png?v=1758991613\" alt=\"Canada Flag\"\u003e\n        \u003cspan\u003eCanada\u003c\/span\u003e\n      \u003c\/span\u003e\n    \u003c\/span\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696205692979,"sku":"PL67171","price":30.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/Untitleddesign_17.png?v=1764790950"},{"product_id":"universal-brush","title":"UNIVERSAL BRUSH","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      This small conical brush efficiently removes deposits from your wood-burning appliance to restore thermal efficiency, extend its service life and prevent breakdowns or failures.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696206938163,"sku":"30479","price":20.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/30479_web.webp?v=1761149083"},{"product_id":"heat-exchanger-maintenance-brush-o1-1-8-42","title":"HEAT EXCHANGER MAINTENANCE BRUSH Ø1 1\/8\" - 42\"","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      This scraper removes deposits from your heat exchanger to restore thermal efficiency, extend exchanger life and prevent breakdowns or failures.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696207560755,"sku":"30798","price":45.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/30798.webp?v=1761149173"},{"product_id":"pull-ring-3-8-npt","title":"PULL RING (3\/8\" npt)","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      No description available for this product\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696209494067,"sku":"49433","price":15.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/49433.webp?v=1761149234"},{"product_id":"satin-black-stove-paint-342-g-12oz-aerosol","title":"SATIN BLACK STOVE PAINT - 342 g (12oz) AEROSOL","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      No description available for this product\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696214540339,"sku":"AC05955","price":20.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC05955.webp?v=1761149355"},{"product_id":"flat-black-stove-paint-342-g-12oz-aerosol","title":"FLAT BLACK STOVE PAINT - 342 g (12oz) AEROSOL","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      High temperature paint with quick drying, lead free. Excellent adherence and color retention.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696219750451,"sku":"AC05956","price":20.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC05956.webp?v=1761149479"},{"product_id":"metallic-charcoal-stove-paint-342-g-12oz-aerosol","title":"METALLIC CHARCOAL STOVE PAINT - 342 g (12oz) AEROSOL","description":"\u003cstyle\u003e\n  \/* Accordion styling *\/\n  .accordion {\n    border: 1px solid #ddd;\n    border-radius: 5px;\n    margin-bottom: 20px;\n    background: #f9f9f9;\n  }\n  .accordion-header {\n    padding: 12px;\n    font-weight: bold;\n    cursor: pointer;\n    background: #eee;\n  }\n  .accordion-header:hover {\n    background: #ddd;\n  }\n  .accordion-content {\n    display: none;\n    padding: 15px;\n    border-top: 1px solid #ddd;\n    background: #fff;\n  }\n  .accordion-content.open {\n    display: block;\n  }\n\n  \/* Unified link styling *\/\n  .see-link {\n    color: #f37021; \/* orange *\/\n    text-decoration: none;\n    font-weight: bold;\n    cursor: pointer;\n  }\n  .see-link:hover {\n    text-decoration: underline;\n  }\n\n  \/* Quick specs box *\/\n  #quick-specs {\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    padding: 15px;\n    background: #fff;\n    margin: 20px 0;\n    font-size: 14px;\n    line-height: 1.5;\n  }\n  #quick-specs div {\n    margin-bottom: 8px;\n  }\n  #quick-specs strong {\n    font-weight: bold;\n  }\n\n  \/* Keep the flags and country names on one line (when space allows) *\/\n  .flags-inline {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    margin-left: 5px;\n    white-space: nowrap;\n  }\n  .flag-pair {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .flag-image {\n    width: 22px;\n    height: auto;\n    vertical-align: middle;\n  }\n\u003c\/style\u003e\n\n\u003c!-- PRODUCT DESCRIPTION (SENTENCE TEASER) --\u003e\n\u003cdiv\u003e\n  \u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n  \u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n    \u003cp\u003e\n      High temperature paint with quick drying, lead free. Excellent adherence and color retention.\n    \u003c\/p\u003e\n  \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\n  Full Description\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n  \u003cdiv\u003e\n    \u003cp\u003eNo specifications available for this product\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv style=\"margin-top: 10px;\"\u003e\n    \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eFull Specifications\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eSpecifications\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003c!-- Appliance Performance Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eAppliance Performance\u003c\/h3\u003e\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo appliance performance available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- General Features Subheader --\u003e\n    \u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003eGeneral Features\u003c\/h3\u003e\n\n    \u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo general features available for this product\u003c\/p\u003e\n    \u003c\/table\u003e\n\n    \u003c!-- Clearances Subheader --\u003e\n\u003ch3 style=\"font-size: 16px; font-weight: bold; margin: 20px 0 10px; border-bottom: 2px solid #ddd; padding-bottom: 5px;\"\u003e\n  Clearances\n\u003c\/h3\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n  \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo clearances available for this product\u003c\/p\u003e\n\u003c\/table\u003e\n\n    \u003c!-- See Less link inside accordion --\u003e\n    \u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n      \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eSee Less\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n  \u003cdiv class=\"accordion-header\"\u003eManuals \u0026amp; Instructions\u003c\/div\u003e\n  \u003cdiv class=\"accordion-content\"\u003e\n    \u003cul\u003e\n      \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eNo manual or leaflet is available for this product\u003c\/p\u003e\n      \u003c!-- PDF Links Styled as Buttons --\u003e\n      \u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n      \u003c\/div\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function () {\n    \/\/ TEASER: compute first sentence from the full description content (desc-more)\n    const descTeaserP = document.getElementById('desc-teaser');\n    const descMoreSpan = document.getElementById('desc-more');\n    const descToggle = document.getElementById('seeMoreDesc');\n\n    \/\/ use textContent of the hidden desc-more to compute the first sentence\n    const fullText = descMoreSpan ? descMoreSpan.innerText.trim() : '';\n    let firstPeriod = fullText.indexOf('.');\n    if (firstPeriod === -1) firstPeriod = fullText.length;\n    descTeaserP.textContent = fullText.substring(0, firstPeriod + (firstPeriod \u003c fullText.length ? 1 : 0)).trim();\n\n    \/\/ Initially ensure full description hidden and teaser visible\n    descMoreSpan.style.display = 'none';\n    descTeaserP.style.display = 'block';\n    descToggle.textContent = 'Full Description';\n\n    descToggle.addEventListener('click', function () {\n      const teaser = descTeaserP;\n      const moreText = descMoreSpan;\n\n      if (moreText.style.display === 'none') {\n        \/\/ Expand full description: hide teaser\n        teaser.style.display = 'none';\n        moreText.style.display = 'block';\n        this.textContent = 'See Less';\n        \/\/ optional: scroll into view so user sees the expanded description\n        this.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } else {\n        \/\/ Collapse to teaser\n        moreText.style.display = 'none';\n        teaser.style.display = 'block';\n        this.textContent = 'Full Description';\n      }\n    });\n\n    \/\/ ACCORDION logic (only one open at a time) + quick-specs handling\n    const accordions = document.querySelectorAll('.accordion');\n    const quickSpecs = document.getElementById('quick-specs');\n    const specsAccordion = document.getElementById('specs-accordion');\n    const specsContent = specsAccordion.querySelector('.accordion-content');\n    const seeLessSpecs = document.getElementById('seeLessSpecs');\n    const seeFullSpecs = document.getElementById('seeFullSpecs');\n\n    function closeAllAccordions(exceptAccordion) {\n      accordions.forEach(acc =\u003e {\n        if (acc !== exceptAccordion) {\n          acc.querySelector('.accordion-content').classList.remove('open');\n        }\n      });\n    }\n\n    function refreshUIState() {\n      \/\/ If specs open =\u003e hide quick-specs and show See Less inside specs\n      if (specsContent.classList.contains('open')) {\n        quickSpecs.style.display = 'none';\n        seeLessSpecs.style.display = 'inline-block';\n      } else {\n        quickSpecs.style.display = 'block';\n        seeLessSpecs.style.display = 'none';\n      }\n    }\n\n    \/\/ Set up header click handlers to toggle and enforce \"one open at a time\"\n    document.querySelectorAll('.accordion').forEach(acc =\u003e {\n      const header = acc.querySelector('.accordion-header');\n      const content = acc.querySelector('.accordion-content');\n\n      header.addEventListener('click', function () {\n        \/\/ if clicking the same accordion that is open =\u003e close it\n        if (content.classList.contains('open')) {\n          content.classList.remove('open');\n        } else {\n          closeAllAccordions(acc); \/\/ close others\n          content.classList.add('open');\n        }\n        refreshUIState();\n      });\n    });\n\n    \/\/ \"Full Specifications\" link: open the specs accordion (or close if already open)\n    seeFullSpecs.addEventListener('click', function () {\n      if (!specsContent.classList.contains('open')) {\n        closeAllAccordions(specsAccordion);\n        specsContent.classList.add('open');\n      } else {\n        specsContent.classList.remove('open');\n      }\n      refreshUIState();\n      \/\/ scroll to specifications area when opening\n      if (specsContent.classList.contains('open')) {\n        specsAccordion.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    });\n\n    \/\/ \"See Less\" link located inside the Specifications content (after Clearances)\n    seeLessSpecs.addEventListener('click', function () {\n      if (specsContent.classList.contains('open')) {\n        specsContent.classList.remove('open');\n        refreshUIState();\n        \/\/ Reset the top Full Specifications link text if you want (kept as \"Full Specifications\")\n        \/\/ show quick specs again (handled in refreshUIState)\n        \/\/ scroll to the quick-specs area for the user's convenience\n        document.getElementById('quick-specs').scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    });\n\n    \/\/ Initial UI state\n    refreshUIState();\n  });\n\u003c\/script\u003e\n","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43696222994483,"sku":"AC05958","price":20.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC05958.webp?v=1761149562"}],"url":"https:\/\/thenorthflame.com\/collections\/maintenance-products.oembed?page=2","provider":"The North Flame","version":"1.0","type":"link"}