{"title":"Produits d'entretien","description":"\u003cdiv class=\"page-headers\"\u003e\n\n\u003cdiv class=\"texts-box\"\u003e\n\n\u003cp class=\"description\"\u003eMaintenez votre appareil de chauffage en parfait état grâce à notre sélection de produits d'entretien essentiels.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e","products":[{"product_id":"start-up-kit","title":"KIT DE DÉMARRAGE ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Comprend : allume-feu (50 sachets), peinture pour poêle 12 oz, gants de haute qualité, humidimètre numérique, nettoyant pour vitres (500 ml - 16,9 oz liq.) et thermomètre avec sonde pour ventilation à double paroi.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"KIT DE NETTOYAGE POUR POÊLE À GRANULÉS DE 3\"","description":"\u003cp\u003e\u003cspan\u003eComprend : une brosse à poils en acier inoxydable et un long grattoir doté d'une lame en acier robuste et d'une poignée ergonomique. Élimine efficacement les dépôts durcis sur la surface et les orifices du creuset, ainsi que sur la sortie du boîtier de la vis d'alimentation en granulés. Une brosse de cheminée de 76 mm (Ø 76 mm) (filetage 1\/4\"-20) avec des tiges flexibles permettant un nettoyage jusqu'à 3,04 m. Facilite l'entretien des systèmes d'évacuation des fumées décalés. Une brosse conique à poils en nylon avec une longue tige en acier et un manche en bois. Idéale pour les espaces restreints et les diamètres compris entre 25 mm (1\") et 57 mm (2 1\/4\"). Un nettoyant pour vitres (500 ml). Utilisé régulièrement, il prévient les taches permanentes sur le verre.\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":"KIT DE NETTOYAGE POUR POÊLE À GRANULÉS 4\"","description":"\u003cp\u003e\u003cspan\u003eComprend : une brosse à poils en acier inoxydable et un long grattoir doté d'une lame en acier robuste et d'une poignée ergonomique. Élimine efficacement les dépôts durcis sur la surface et les orifices du creuset, ainsi que sur la sortie du boîtier de la vis d'alimentation en granulés. Une brosse de cheminée de 102 mm (filetage 1\/4\"-20) avec des tiges flexibles permettant un nettoyage jusqu'à 3,04 m. Facilite l'entretien des systèmes d'évacuation des fumées décalés. Une brosse conique à poils en nylon avec une longue tige en acier et un manche en bois. Idéale pour les espaces restreints et les diamètres compris entre 25 mm et 57 mm. Un nettoyant pour vitres (500 ml). Utilisé régulièrement, il prévient les taches permanentes sur le verre.\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":"FILTRE À AIR AVEC CADRE EN CARTON ET SUPPORT (50,8 cm x 38,1 cm x 2,5 cm)","description":"\u003cp\u003e \u003cspan\u003eLe kit comprend : 1 support, 2 plaques de boîtier, 1 filtre et 24 vis.\u003c\/span\u003e\u003c\/p\u003e\n\n\u003ch4\u003e \u003cstrong\u003eManuels et instructions\u003c\/strong\u003e\n\u003c\/h4\u003e\n\n\u003cdiv class=\"manual-description-text\"\u003e\n\n\u003cp\u003e Consultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc.\u003c\/p\u003e\n\n \u003cp\u003e🔗 \u003ca href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45695A-F_16-04-2015.pdf?v=1761081556\"\u003eManuel d'installation et d'utilisation\u003c\/a\u003e \u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\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":"FILTRE À AIR EN ALUMINIUM LAVABLE AVEC SUPPORT (51 x 38 x 2,5 cm)","description":"\u003cp\u003e \u003cspan\u003eContenu : 1 filtre lavable, 1 porte-filtre, 2 déflecteurs d'air et les vis de fixation. Veillez à nettoyer et à remplacer régulièrement le filtre de votre poêle à bois afin de protéger le moteur du ventilateur contre l'accumulation de poussière. Un filtre non nettoyé régulièrement peut entraîner une surchauffe du poêle.\u003c\/span\u003e\u003c\/p\u003e\n\n\u003ch4\u003e \u003cstrong\u003eManuels et instructions\u003c\/strong\u003e\n\u003c\/h4\u003e\n\n\u003cdiv class=\"manual-description-text\"\u003e\n\n\u003cp\u003e Consultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc.\u003c\/p\u003e\n\n\u003cp\u003e 🔗 \u003ca href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45695A-F_16-04-2015.pdf?v=1761081556\"\u003eManuel d'installation et d'utilisation\u003c\/a\u003e\u003c\/p\u003e\n\n\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":"BOÎTIER DE RETOUR D'AIR FROID AVEC FILTRE","description":"\u003cp\u003e\u003cspan\u003ePermet l'installation d'un conduit de retour d'air froid et comprend le support nécessaire à la pose d'un filtre à air. Contenu : 1 couvercle, 1 fond, 2 panneaux latéraux, 1 filtre, 1 porte-filtre, 2 déflecteurs d'air et les vis de fixation. Veillez à nettoyer et à remplacer régulièrement le filtre de votre poêle à bois afin de protéger le moteur du ventilateur contre l'accumulation de poussière.\u003c\/span\u003e\u003c\/p\u003e\n\n\u003ch4\u003e \u003cstrong\u003eManuels et instructions\u003c\/strong\u003e\n\u003c\/h4\u003e\n\n\u003cdiv class=\"manual-description-text\"\u003e\n\n\u003cp\u003e Consultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc.\u003c\/p\u003e\n\n\u003cp\u003e 🔗 \u003ca href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45696A-F_17-12-2014.pdf?v=1761100818\"\u003eManuel d'installation et d'utilisation\u003c\/a\u003e\u003c\/p\u003e\n\n\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":"FILTRE HEPA AVEC PARE-ÉTINCELLES POUR ASPIRATEUR À CENDRES (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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003cp\u003e\u003c\/p\u003e\u003c\/span\u003e \nCe filtre HEPA permet de retenir efficacement les fines particules de déchets secs. L'air aspiré par l'aspirateur est filtré et débarrassé d'une grande partie des allergènes, pour un air plus sain. Résistant et facile à nettoyer, il suffit de le secouer ou de le rincer pour éliminer les impuretés.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"PRÉFILTRE EN TISSU SOOTSTOP AVEC FILTRE MÉTALLIQUE POUR ASPIRATEUR À CENDRES 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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Pour prolonger la durée de vie du moteur de votre balayeuse, ajoutez un filtre HEPA. Ce préfiltre les particules de suie en tissu et en métal. Spécialement conçu pour retenir efficacement les particules très fines et volatiles comme les cendres, il conservera toute sa puissance d'aspiration malgré l'accumulation de poussière. Entretien facile : il suffit de le secouer ou de le laver. Remplacez-le immédiatement si le tissu est endommagé.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n   \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eAucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"KIT DE FILTRES POUR ASPIRATEUR À CENDRES (AC02586) ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Conçu pour piéger efficacement les particules fines et volatiles, comme les cendres refroidies, son filtre HEPA garantit un air plus sain et améliore la qualité de l'air que vous respirez. Durable et facile à installer, il suffit de le remplacer dès que le tissu est saturé ou endommagé pour prolonger la durée de vie du moteur de l'aspirateur.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"FILTRE À AIR EN CARTON 20\" x 16\" x 1\" (12\/BOÎTE) ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Boîte économique de 12 filtres en carton.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"BOÎTIER DE SUPPORT DE FILTRE ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Aucune description disponible pour ce produit\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit.\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\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"FILTRE À AIR EN CARTON 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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Ce filtre à air pour fournaise joue un rôle clé dans le bon fonctionnement de votre fournaise et l'amélioration de la qualité de l'air intérieur.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"FILTRE À AIR À CADRE EN CARTON 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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e \n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003cp\u003e\nCe filtre à air pour fournaise joue un rôle clé dans le bon fonctionnement de votre fournaise et l'amélioration de la qualité de l'air intérieur.\n\u003c\/p\u003e\n\n\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"FILTRE 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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003cp\u003e\u003c\/p\u003e\u003c\/span\u003e \nCe filtre à air pour fournaise joue un rôle clé dans le bon fonctionnement de votre fournaise et l'amélioration de la qualité de l'air intérieur.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"FILTRE À AIR EN CARTON 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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003cp\u003e\u003c\/p\u003e\u003c\/span\u003e \nCe filtre à air pour fournaise joue un rôle clé dans le bon fonctionnement de votre fournaise et l'amélioration de la qualité de l'air intérieur.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"FILTRE À AIR POUR SOUFFLEUR AXIAL ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003cp\u003e\u003c\/p\u003e\u003c\/span\u003e \nCe filtre à air pour fournaise joue un rôle clé dans le bon fonctionnement de votre fournaise et l'amélioration de la qualité de l'air intérieur.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"FILTRE À AIR EN CARTON 25 po x 14 po x 1 po ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003cp\u003e\u003c\/p\u003e\u003c\/span\u003e \nCe filtre à air pour fournaise joue un rôle clé dans le bon fonctionnement de votre fournaise et l'amélioration de la qualité de l'air intérieur.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"FILTRE À AIR EN ALUMINIUM LAVABLE 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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003cp\u003e\u003c\/p\u003e\u003c\/span\u003e \nConçu pour être nettoyé et réutilisé plusieurs fois, contrairement aux filtres jetables qui doivent être remplacés régulièrement. Fabriqué à partir de matériaux durables et résistants tels que la maille métallique ou le tissu synthétique, il capture les particules même après lavage sans perdre son efficacité.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"FILTRE À POUSSIÈRE DE CARBONE (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\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003cp\u003e\nLe filtre à air joue un rôle clé pour assurer le bon fonctionnement de votre appareil et améliorer la qualité de l'air intérieur.\n\u003c\/p\u003e\n\n\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"FILTRE DE TYPE TÉFLON (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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003cp\u003e\u003c\/p\u003e\u003c\/span\u003e \nLe filtre à air joue un rôle clé pour assurer le bon fonctionnement de votre appareil et améliorer la qualité de l'air intérieur.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"TIGE EN FIBRE DE VERRE 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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Fabriqué en fibre de verre flexible de 1,20 mètre de long pour un entretien facile.\n\n\n\n\u003c\/div\u003e \n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"ASPIRATEUR DE CENDRES","description":"\u003cp\u003e\u003cspan\u003eConforme à la norme UL 1017. Certifié CSA C22.2 n° 243-01. Prolongez la durée de vie de votre aspirateur en utilisant l'outil idéal pour aspirer les cendres complètement refroidies de votre appareil de chauffage au bois ou aux granules. Conçu presque exclusivement pour la collecte des cendres, cet aspirateur vous offrira plusieurs années de service avec un entretien approprié. Puissance : 1 000 W.\u003c\/span\u003e\u003c\/p\u003e\n\n\u003ch4\u003e \u003cstrong\u003eManuels et instructions\u003c\/strong\u003e\n\u003c\/h4\u003e\n\n\u003cdiv class=\"manual-description-text\"\u003e\n\n\u003cp\u003e Consultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc.\u003c\/p\u003e\n\n\u003cp\u003e 🔗 \u003ca href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/AC02586_2022-08-25.pdf?v=1761129552\"\u003eInstructions d'utilisation\u003c\/a\u003e\u003c\/p\u003e\n\n\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":"TUYAU D'ASPIRATEUR DE CENDRES (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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Pièce de rechange pour aspirateur AC02582.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"BUSE EN ALUMINIUM POUR ASPIRATEUR DE CENDRES (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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Pièce de rechange pour aspirateur AC02582.\n\n\n\n\u003c\/div\u003e \n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"NETTOYANT POUR CHEMINÉE ET GRIL (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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Aucune description disponible pour ce produit\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n 🌍 \u003cstrong\u003eFabriqué en :\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=\"Drapeau du Canada\"\u003e\n \u003cspan\u003eCanada\u003c\/span\u003e\n\u003c\/span\u003e\n\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"TAMPON DE NETTOYAGE À SEC ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Notre tampon de nettoyage à sec est spécialement conçu pour les vitres de poêles et de cheminées. Il élimine efficacement la suie et les taches tenaces sans rayer la surface. Profitez d'une vitre parfaitement propre pour admirer pleinement la beauté des flammes.\n\n\n\n\u003c\/div\u003e \n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"NETTOYANT POUR VITRES ET APPAREILS EN BOIS ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Notre tampon de nettoyage à sec est spécialement conçu pour les vitres de poêles et de cheminées. Il élimine efficacement la suie et les taches tenaces sans rayer la surface. Profitez d'une vitre parfaitement propre pour admirer pleinement la beauté des flammes. \n\n\n\n\u003c\/div\u003e\n\n\u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"NETTOYANT POUR VITRES D'APPAREILS EN GRANULÉS (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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Recommandé pour le nettoyage des vitres de tous les appareils à granulés.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e\n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e \n\u003cp\u003eAucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"NETTOYANT POUR VITRES D'APPAREILS À GAZ (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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Aucune description disponible pour ce produit\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"Brosse ronde de 6 pouces avec poils en polypropylène (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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Idéal pour prévenir l'accumulation de créosote à l'intérieur de la cheminée.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n       \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eAucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"Brosse ronde de 7 pouces avec poils en polypropylène (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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Idéal pour prévenir l'accumulation de créosote à l'intérieur de la cheminée.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"BROSSE RONDE DE 8\" AVEC POILS EN POLYPROPYLÈNE (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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Idéal pour prévenir l'accumulation de créosote à l'intérieur de la cheminée.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions\u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n       \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eAucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"BROSSE RONDE POUR POÊLE À GRANULÉS DE 4\" (FILETAGE 1\/4\"-20) ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Nettoyez régulièrement vos conduits d'évacuation pour assurer le bon fonctionnement de votre appareil à granulés. Cette brosse de 10 cm de diamètre, bien que dotée de poils flexibles, est tout aussi efficace. Elle est spécialement conçue pour simplifier le ramonage des conduits d'évacuation, notamment pour les installations comportant des coudes à 45° ou 90°.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"BROSSE POUR POÊLE À GRANULÉS RONDE DE 3\" (FILETAGE 1\/4\"-20) ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Nettoyez régulièrement vos conduits d'évacuation pour assurer le bon fonctionnement de votre appareil. Cette brosse de 7,6 cm de diamètre, bien que dotée de poils flexibles, sera tout aussi efficace. Elle est spécialement conçue pour simplifier le ramonage des conduits d'évacuation des poêles à granules, notamment pour les installations comportant des coudes à 45° ou 90°.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n       \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eAucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"BROSSE POUR POÊLE À GRANULÉS ROND DE 4\" (FILETAGE 1\/4\"-20) ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Nettoyez régulièrement vos conduits d'évacuation pour assurer le bon fonctionnement de votre appareil. Cette brosse de 10 cm de diamètre, bien que dotée de poils flexibles, sera tout aussi efficace. Elle est spécialement conçue pour simplifier le ramonage des conduits d'évacuation des poêles à granules, notamment pour les installations comportant des coudes à 45° ou 90°.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n       \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eAucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"TIGE FLEXIBLE POUR POÊLE À GRANULÉS DE 5 PIEDS (FILETAGE 1\/4\"-20) ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Utile pour nettoyer le conduit d'évacuation de votre poêle à granulés #AC04503 #AC04504, #AC04505 ou #AC04506. Remarque : les filetages 1\/4\"-20 et 1\/4\"NPT ne sont PAS compatibles.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"BOÎTE DE 12 TIGES FLEXIBLES POUR POÊLE À GRANULÉS DE 5 PIEDS (FILETAGE 1\/4\"-20) ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Utile pour nettoyer le conduit d'évacuation de votre poêle à granulés #AC04503 #AC04504, #AC04505 ou #AC04506. Remarque : les filetages ¼\"-20 et ¼\"NPT ne sont PAS compatibles.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n 🌍 \u003cstrong\u003eFabriqué en :\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=\"Drapeau des États-Unis\"\u003e\n \u003cspan\u003eÉtats-Unis\u003c\/span\u003e\n\u003c\/span\u003e\n\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n       \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eAucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"ADAPTATEUR (3\/8\" NPT VERS 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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Idéal pour raccorder un filetage mâle NPT 3\/8\" à un filetage femelle NPT 1\/4\".\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n 🌍 \u003cstrong\u003eFabriqué en :\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=\"Drapeau du Canada\"\u003e\n \u003cspan\u003eCanada\u003c\/span\u003e\n\u003c\/span\u003e\n\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n       \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eAucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"TIGE EN FIBRE DE VERRE DE 5 PIEDS (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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Facile à assembler. Tige en fibre de verre. Finition avec raccords mâle et femelle en métal robuste.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n       \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eAucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"ÉCHANGEUR DE CHALEUR GRATTOIR ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Ce grattoir élimine les dépôts de votre échangeur de chaleur afin de restaurer son efficacité thermique, de prolonger sa durée de vie et de prévenir les pannes.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n 🌍 \u003cstrong\u003eFabriqué en :\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=\"Drapeau du Canada\"\u003e\n \u003cspan\u003eCanada\u003c\/span\u003e\n\u003c\/span\u003e\n\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"PELLE À FEUILLES ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Conçu spécifiquement pour la collecte et la manipulation des cendres refroidies après utilisation de votre appareil de chauffage au bois.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n 🌍 \u003cstrong\u003eFabriqué en :\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=\"Drapeau du Canada\"\u003e\n \u003cspan\u003eCanada\u003c\/span\u003e\n\u003c\/span\u003e\n\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n       \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eAucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Conçu pour manipuler les bûches, les braises ou les cendres, cet outil est principalement utilisé pour ajuster la combustion des bûches ou des morceaux de bois, pour alimenter le feu ou pour répartir les braises afin de contrôler la température et l'efficacité de la combustion.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n 🌍 \u003cstrong\u003eFabriqué en :\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=\"Drapeau du Canada\"\u003e\n \u003cspan\u003eCanada\u003c\/span\u003e\n\u003c\/span\u003e\n\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n       \u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eAucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"RACLEUR D'ENTRETIEN ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Ce grattoir élimine les dépôts accumulés dans votre fournaise à granulés afin de restaurer son efficacité thermique, prolonger sa durée de vie et prévenir les pannes.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n 🌍 \u003cstrong\u003eFabriqué en :\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=\"Drapeau du Canada\"\u003e\n \u003cspan\u003eCanada\u003c\/span\u003e\n\u003c\/span\u003e\n\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques\u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"GRATTOIR ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Élimine les dépôts accumulés dans votre poêle à granulés, restaurant ainsi son efficacité thermique, prolongeant la durée de vie de votre appareil de chauffage et prévenant les pannes.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n 🌍 \u003cstrong\u003eFabriqué en :\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=\"Drapeau du Canada\"\u003e\n \u003cspan\u003eCanada\u003c\/span\u003e\n\u003c\/span\u003e\n\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e \n\u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"PINCEAU UNIVERSEL ","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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Cette petite brosse conique élimine efficacement les dépôts de votre appareil de chauffage au bois afin de restaurer son efficacité thermique, prolonger sa durée de vie et prévenir les pannes.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e \n\u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"BROSSE D'ENTRETIEN POUR ÉCHANGEUR DE CHALEUR Ø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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Ce grattoir élimine les dépôts de votre échangeur de chaleur afin de restaurer son efficacité thermique, prolonger sa durée de vie et prévenir les pannes.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e \n\u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"ANNEAU DE RETIRAGE (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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Aucune description disponible pour ce produit\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"Peinture pour cuisinière noire satinée - Aérosol 342 g (12 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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Aucune description disponible pour ce produit\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"Peinture noire mate pour cuisinière - Aérosol 342 g (12 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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Peinture haute température à séchage rapide, sans plomb. Excellente adhérence et tenue des couleurs.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Dédouanements \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n   \u003cdiv class=\"accordion-header\"\u003eManuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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":"PEINTURE CHARBON MÉTALLISÉE POUR POÊLE - AÉROSOL 342 g (12 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\n\u003cp id=\"desc-teaser\"\u003e\u003c\/p\u003e\n\n\u003cspan id=\"desc-more\" style=\"display:none;\"\u003e\n\u003c\/span\u003e\n Peinture haute température à séchage rapide, sans plomb. Excellente adhérence et tenue des couleurs.\n\n\n\n\u003c\/div\u003e\n\n \u003cspan id=\"seeMoreDesc\" class=\"see-link\" style=\"margin-bottom:20px; display:inline-block;\"\u003e\nDescription complète\n\u003c\/span\u003e \n\n\u003c!-- QUICK SPECIFICATIONS BOX --\u003e\n\u003cdiv id=\"quick-specs\"\u003e\n\n\u003cdiv\u003e\n\n\u003cp\u003e Aucune spécification n'est disponible pour ce produit.\u003c\/p\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003cdiv style=\"margin-top: 10px;\"\u003e\n\n \u003cspan id=\"seeFullSpecs\" class=\"see-link\"\u003eSpécifications complètes\u003c\/span\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- SPECIFICATIONS COLLAPSIBLE --\u003e\n\u003cdiv id=\"specs-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Caractéristiques \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\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;\"\u003e Performance des appareils \u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune donnée de performance disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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;\"\u003e Caractéristiques générales \u003c\/h3\u003e\n\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; margin-bottom: 30px;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune fonctionnalité générale n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\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\n Autorisations \n\n\u003c\/h3\u003e\n\n\u003ctable style=\"width: 100%; border-collapse: collapse; font-size: 14px; border-radius: 6px; overflow: hidden;\"\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucune dédouanement n'est disponible pour ce produit. \u003c\/p\u003e\n\n\n\u003c\/table\u003e\n\n\n\u003c!-- See Less link inside accordion --\u003e\n\u003cdiv style=\"text-align:center; margin-top: 15px;\"\u003e\n\n \u003cspan id=\"seeLessSpecs\" class=\"see-link\" style=\"display:none;\"\u003eVoir moins\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c!-- MANUALS COLLAPSIBLE --\u003e\n\u003cdiv id=\"manuals-accordion\" class=\"accordion\"\u003e\n\n\u003cdiv class=\"accordion-header\"\u003e Manuels et instructions \u003c\/div\u003e\n\n\u003cdiv class=\"accordion-content\"\u003e\n\n\u003cul\u003e\n\n\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003e Aucun manuel ni dépliant n'est disponible pour ce produit. \u003c\/p\u003e\n\n\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e \n\n\u003c\/div\u003e\n\n\n\u003c\/ul\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\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\/fr\/collections\/maintenance-products.oembed?page=2","provider":"The North Flame","version":"1.0","type":"link"}