{"title":"Évent à granules","description":"","products":[{"product_id":"3-x-6l-pellet-pipe","title":"TUYAU À GRANULÉS 3\" X 6\" L ","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 Conduit d'évacuation pour poêle à granulés.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n       \u003cli\u003eTechnologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 3,75\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 6\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43679494930483,"sku":"VOP0001","price":41.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0001_VOP0002_VOP0003_VOP0004_VOP0005_VOP0006_VOP0007_VOP0008_VOP0009_VOP0010_VOP0011_VOP0012.webp?v=1760354400"},{"product_id":"4-x-6l-pellet-pipe","title":"TUYAU À GRANULÉS 4\" X 6\" L ","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 Conduit d'évacuation pour poêle à granulés.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n       \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 4,75\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 6\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43679498764339,"sku":"VOP0002","price":44.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0001_VOP0002_VOP0003_VOP0004_VOP0005_VOP0006_VOP0007_VOP0008_VOP0009_VOP0010_VOP0011_VOP0012.webp?v=1760354400"},{"product_id":"3-x-12l-pellet-pipe","title":"TUYAU À GRANULÉS 3\" X 12\" L ","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 Conduit d'évacuation pour poêle à granulés.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n       \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 3,75\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 12\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43679502008371,"sku":"VOP0003","price":40.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0001_VOP0002_VOP0003_VOP0004_VOP0005_VOP0006_VOP0007_VOP0008_VOP0009_VOP0010_VOP0011_VOP0012.webp?v=1760354400"},{"product_id":"4-x-12l-pellet-pipe","title":"TUYAU À GRANULÉS 4\" X 12\" L ","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 Conduit d'évacuation pour poêle à granulés.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n       \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 4,75\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 12\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43679502041139,"sku":"VOP0004","price":47.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0001_VOP0002_VOP0003_VOP0004_VOP0005_VOP0006_VOP0007_VOP0008_VOP0009_VOP0010_VOP0011_VOP0012.webp?v=1760354400"},{"product_id":"3-x-18l-pellet-pipe","title":"TUYAU À GRANULÉS 3\" X 18\" L ","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 Conduit d'évacuation pour poêle à granulés.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n       \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 3,75\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 18\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43679502139443,"sku":"VOP0005","price":47.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0001_VOP0002_VOP0003_VOP0004_VOP0005_VOP0006_VOP0007_VOP0008_VOP0009_VOP0010_VOP0011_VOP0012.webp?v=1760354400"},{"product_id":"4-x-18l-pellet-pipe","title":"TUYAU À GRANULÉS 4\" X 18\" L ","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 Conduit d'évacuation pour poêle à granulés.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n       \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 4,75\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 18\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43679503712307,"sku":"VOP0006","price":60.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0001_VOP0002_VOP0003_VOP0004_VOP0005_VOP0006_VOP0007_VOP0008_VOP0009_VOP0010_VOP0011_VOP0012.webp?v=1760354400"},{"product_id":"3-x-24l-pellet-pipe","title":"TUYAU À GRANULÉS 3\" X 24\" L ","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 Conduit d'évacuation pour poêle à granulés.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n       \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 3,75\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 24\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43679503810611,"sku":"VOP0007","price":55.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0001_VOP0002_VOP0003_VOP0004_VOP0005_VOP0006_VOP0007_VOP0008_VOP0009_VOP0010_VOP0011_VOP0012.webp?v=1760354400"},{"product_id":"4-x-24l-pellet-pipe","title":"TUYAU À GRANULÉS 4\" X 24\" L ","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 Conduit d'évacuation pour poêle à granulés.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n       \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 4,75\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 24\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43679504171059,"sku":"VOP0008","price":67.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0001_VOP0002_VOP0003_VOP0004_VOP0005_VOP0006_VOP0007_VOP0008_VOP0009_VOP0010_VOP0011_VOP0012.webp?v=1760354400"},{"product_id":"3-x-36l-pellet-pipe","title":"TUYAU À GRANULÉS 3\" X 36\" L ","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 Conduit d'évacuation pour poêle à granulés.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n       \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 3,75\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 36\"\u003c\/p\u003e\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43679513870387,"sku":"VOP0009","price":59.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0001_VOP0002_VOP0003_VOP0004_VOP0005_VOP0006_VOP0007_VOP0008_VOP0009_VOP0010_VOP0011_VOP0012.webp?v=1760354400"},{"product_id":"4-x-36l-pellet-pipe","title":"TUYAU À GRANULÉS 4\" X 36\" L ","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 Conduit d'évacuation pour poêle à granulés.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n       \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 4,75\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 36\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43679527796787,"sku":"VOP0010","price":75.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0001_VOP0002_VOP0003_VOP0004_VOP0005_VOP0006_VOP0007_VOP0008_VOP0009_VOP0010_VOP0011_VOP0012.webp?v=1760354400"},{"product_id":"3-x-48l-pellet-pipe","title":"TUYAU À GRANULÉS 3\" X 48\" L ","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 Conduit d'évacuation pour poêle à granulés.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n       \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 3,75\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 48\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43679528157235,"sku":"VOP0011","price":75.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0001_VOP0002_VOP0003_VOP0004_VOP0005_VOP0006_VOP0007_VOP0008_VOP0009_VOP0010_VOP0011_VOP0012.webp?v=1760354400"},{"product_id":"4-x-48l-pellet-pipe","title":"TUYAU À GRANULÉS 4\" X 48\" L ","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 Conduit d'évacuation pour poêle à granulés.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n       \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 4,75\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 48\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43679528222771,"sku":"VOP0012","price":89.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0001_VOP0002_VOP0003_VOP0004_VOP0005_VOP0006_VOP0007_VOP0008_VOP0009_VOP0010_VOP0011_VOP0012.webp?v=1760354400"},{"product_id":"3-x-9l-pellet-pipe-slip-section","title":"SECTION DE BLOCAGE DE TUYAU À GRANULÉS DE 3\" X 9\" L ","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 Se glisse sur les tuyaux de longueur standard pour un réglage facile. Diamètre : 3 pouces, longueur : 9 pouces.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n       \u003cli\u003eTechnologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 2,9\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 3,8\"\u003c\/p\u003e\n\n\u003cp\u003e C : 7\"\u003c\/p\u003e\n\n\u003cp\u003e AAAA : 9\"\u003c\/p\u003e\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;\"\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\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43679528255539,"sku":"VOP0075","price":60.0,"currency_code":"CAD","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0076_VOP0076.webp?v=1760356431"},{"product_id":"4-x-9l-pellet-pipe-slip-section","title":"SECTION DE BLOCAGE DE TUYAU À GRANULÉS DE 4\" X 9\" L ","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 Se glisse sur les tuyaux de longueur standard pour un réglage facile. Diamètre : 4 pouces, longueur : 9 pouces.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n       \u003cli\u003eTechnologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3,9\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 4,8\"\u003c\/p\u003e\n\n\u003cp\u003e C : 7\"\u003c\/p\u003e\n\n\u003cp\u003e AAAA : 9\"\u003c\/p\u003e\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;\"\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\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43679541428275,"sku":"VOP0076","price":65.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0076_VOP0076.webp?v=1760356431"},{"product_id":"3-x-12l-simpson-duravent-section-ac-3012","title":"COUPE SIMPSON DURAVENT 3\" X 12\"L (AC-3012) ","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 du système de ventilation : section d'un pied (1') de long de tuyau de ventilation à granules de 3\".\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\u003c\/span\u003e\u003c\/span\u003e \n\u003cspan\u003eÉtats-Unis\u003c\/span\u003e\n\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\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":43679569281075,"sku":"49778","price":27.0,"currency_code":"CAD","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/49778.webp?v=1760361569"},{"product_id":"3-x-12l-adjustable-pipe-simpson-duravent-ac-3012a","title":"TUYAU RÉGLABLE 3\" X 12\"L SIMPSON DURAVENT (AC-3012A) ","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 tuyau de 30,5 cm (12 pouces) de long est ajustable de 7,6 cm (3 pouces) à 25,4 cm (10 pouces) et est conçu pour s'adapter à l'installation de votre poêle à granulés. Il est compatible avec les autres tuyaux Duravent. Veuillez noter que cette longueur ne peut être utilisée qu'en configuration verticale.\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\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":43679570755635,"sku":"49779","price":47.0,"currency_code":"CAD","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/49779.webp?v=1760362222"},{"product_id":"simpson-duravent-wall-strap-for-3-pellet-ac-3069","title":"SANGLE MURALE SIMPSON DURAVENT POUR GRANULÉS DE 3\" (AC-3069) ","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 Collier mural pour poêles à granulés de 3 pouces.\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\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\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":43679581798451,"sku":"49784","price":20.0,"currency_code":"CAD","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/49784.webp?v=1760362791"},{"product_id":"3-x-45-pellet-elbow-unpainted","title":"COUDE À GRANULÉS 3\" X 45° (NON PEINT) ","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 Utilisé lorsqu'un décalage est nécessaire.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n       \u003cli\u003eConforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3,75\"\u003c\/p\u003e\n\n\u003cp\u003e B : 7,5\"\u003c\/p\u003e\n\n\u003cp\u003e C : 5,7\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681227178035,"sku":"VOP0090","price":65.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0090_VOP0092.webp?v=1760453695"},{"product_id":"3-x-90-pellet-elbow-unpainted","title":"COUDE À GRANULÉS 3\" X 90° (NON PEINT) ","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 Utilisé lorsqu'un décalage est nécessaire.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n       \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3,75\"\u003c\/p\u003e\n\n\u003cp\u003e B : 7\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681227767859,"sku":"VOP0091","price":75.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0091_VOP0093.webp?v=1760453984"},{"product_id":"4-x-45-pellet-elbow-unpainted","title":"COUDE À GRANULÉS 4\" X 45° (NON PEINT) ","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 Utilisé lorsqu'un décalage est nécessaire.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n       \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4,75\"\u003c\/p\u003e\n\n\u003cp\u003e B : 8,2\"\u003c\/p\u003e\n\n\u003cp\u003e C : 6,7\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681233666099,"sku":"VOP0092","price":60.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0090_VOP0092_4557ef60-e899-4719-ab34-3cb92694e9e1.webp?v=1760454947"},{"product_id":"4-x-90-pellet-elbow-unpainted","title":"COUDE À GRANULÉS 4\" X 90° (NON PEINT) ","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 Utilisé lorsqu'un décalage est nécessaire.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n       \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4,75\"\u003c\/p\u003e\n\n\u003cp\u003e B : 8\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681234059315,"sku":"VOP0093","price":80.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0091_VOP0093_e4e6ee1b-1763-4478-ab58-7380256538b3.webp?v=1760455080"},{"product_id":"3-pellet-tee-with-cap-unpainted","title":"T-shirt à granules de 3 pouces avec bouchon (non peint) ","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 Utilisé lorsqu'un décalage est nécessaire, ce té facilite l'inspection, la maintenance et le nettoyage. Le capuchon du té comprend un tournevis à douille.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n       \u003cli\u003eSystème de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4,75\"\u003c\/p\u003e\n\n\u003cp\u003e B : 3,75\"\u003c\/p\u003e\n\n\u003cp\u003e C : 6,68\"\u003c\/p\u003e\n\n\u003cp\u003e D : 9,51\"\u003c\/p\u003e\n\n\u003cp\u003e E : 8,99\"\u003c\/p\u003e\n\n\u003cp\u003e F : 3,75\u003c\/p\u003e\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;\"\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 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\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\n\u003c!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681235075123,"sku":"VOP0110","price":100.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0110_VOP0111.webp?v=1760455251"},{"product_id":"4-pellet-tee-with-cap-unpainted","title":"T-shirt à granules de 4 pouces avec bouchon (non peint) ","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 Utilisé lorsqu'un décalage est nécessaire, ce té facilite l'inspection, la maintenance et le nettoyage. Le capuchon du té comprend un tournevis à douille.\n\n\u003cul\u003e\n\n       \u003cli\u003eVentilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4\"\u003c\/p\u003e\n\n\u003cp\u003e B : 4,75\"\u003c\/p\u003e\n\n\u003cp\u003e C : 7,69\"\u003c\/p\u003e\n\n\u003cp\u003e D : 10,86\"\u003c\/p\u003e\n\n\u003cp\u003e E : 10,18\"\u003c\/p\u003e\n\n\u003cp\u003e F : 4,75\u003c\/p\u003e\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;\"\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 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\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\n\u003c!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681235894323,"sku":"VOP0111","price":115.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0110_VOP0111_5587c48c-3d1b-489f-bf70-00c5660005e8.webp?v=1760455391"},{"product_id":"3-pellet-stove-adapter-tee-with-cap-unpainted","title":"ADAPTATEUR EN T POUR POÊLE À GRANULÉS 3\" AVEC BOUCHON (NON PEINT) ","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 \nSe connecte directement à l'appareil, ce qui élimine le besoin d'un adaptateur pour cuisinière.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3,08\"\u003c\/p\u003e\n\n\u003cp\u003e B : 3,75\"\u003c\/p\u003e\n\n\u003cp\u003e C : 7,35\"\u003c\/p\u003e\n\n\u003cp\u003e D : 5,85\"\u003c\/p\u003e\n\n\u003cp\u003e E : 9,5\"\u003c\/p\u003e\n\n\u003cp\u003e F : 9\u003c\/p\u003e\n\n\u003cp\u003e G : 3,75\"\u003c\/p\u003e\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;\"\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 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\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\n\u003c!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681236222003,"sku":"VOP0112","price":95.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0112_VOP0113.webp?v=1760455540"},{"product_id":"4-pellet-stove-adapter-tee-with-cap-unpainted","title":"ADAPTATEUR EN T POUR POÊLE À GRANULÉS 4\" AVEC BOUCHON (NON PEINT) ","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\nSe connecte directement à l'appareil, ce qui élimine le besoin d'un adaptateur pour cuisinière.\n\u003c\/p\u003e\n\n \u003cul\u003e\n\n\u003cli\u003eVentilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n \u003cli\u003eSystème de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n \u003cli\u003eTechnologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n \u003cli\u003eConforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n \u003cp\u003e\u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n \u003cp\u003eAØ : 4,09\"\u003c\/p\u003e\n\n \u003cp\u003eB : 4,75\"\u003c\/p\u003e\n\n \u003cp\u003eC : 8,37\"\u003c\/p\u003e\n\n \u003cp\u003eD : 6,84\"\u003c\/p\u003e\n\n \u003cp\u003eE : 10,70\"\u003c\/p\u003e\n\n \u003cp\u003eF : 10,18\"\u003c\/p\u003e\n\n \u003cp\u003eG : 4,75\"\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 🌍 \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\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 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\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\n\u003c!-- Installation \u0026 User's Manual --\u003e\n\u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e \n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e \n\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681236942899,"sku":"VOP0113","price":109.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0112_VOP0113_d3dbdbb4-a1a8-4e09-969d-26b4b3b2290a.webp?v=1760455690"},{"product_id":"4-to-3-pellet-stove-tee-and-cap-adapter-unpainted","title":"ADAPTATEUR EN T ET BOUCHON POUR POÊLE À GRANULÉS 4\" À 3\" (NON PEINT) ","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 Corps de 4 pouces et prise de 3 pouces se connectant directement au poêle.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3,08\"\u003c\/p\u003e\n\n\u003cp\u003e B : 3,75\"\u003c\/p\u003e\n\n\u003cp\u003e C : 8,35\"\u003c\/p\u003e\n\n\u003cp\u003e D : 6,86\"\u003c\/p\u003e\n\n\u003cp\u003e E : 10,70\"\u003c\/p\u003e\n\n\u003cp\u003e F : 10,18\"\u003c\/p\u003e\n\n\u003cp\u003e G : 4,75\"\u003c\/p\u003e\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;\"\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 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\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\n\u003c!-- Installation \u0026 User's Manual --\u003e \n\u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681238745139,"sku":"VOP0114","price":115.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0114.webp?v=1760455826"},{"product_id":"simpson-dura-vent-3-clean-out-tee-ac-3067","title":"Té de nettoyage SIMPSON DURA-VENT 3\" (AC-3067) ","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 Raccord en T de nettoyage pour tuyau d'évacuation de granulés de 3 pouces.\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 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\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":43681243070515,"sku":"49783","price":78.0,"currency_code":"CAD","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/49783.webp?v=1760456035"},{"product_id":"simpson-dura-vent-3-x-90-pellet-elbow-ac-3090","title":"COUDE À GRANULÉS SIMPSON DURA-VENT 3\" X 90° (AC-3090) ","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 Coude à 90 degrés pour tuyau d'évacuation de granulés de 3 pouces.\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\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":43681244414003,"sku":"49787","price":56.0,"currency_code":"CAD","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/49787.webp?v=1760456130"},{"product_id":"3-pellet-stove-black-adapter","title":"ADAPTATEUR NOIR POUR POÊLE À GRANULÉS 3\"","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 Compatible avec la plupart des buses de poêles à granulés de 3 pouces, le connecteur se fixe facilement à la buse du poêle et au tuyau à granulés.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 3,75\"\u003c\/p\u003e\n\n\u003cp\u003e C : 3,6\"\u003c\/p\u003e\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\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 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\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\n\u003c!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681245724723,"sku":"VOP0150","price":40.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0150_VOP0151.webp?v=1760456299"},{"product_id":"4-pellet-stove-black-adapter","title":"ADAPTATEUR NOIR POUR POÊLE À GRANULÉS 4\" ","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\nCompatible avec la plupart des buses de poêle à granulés de 4 pouces, le connecteur se fixe facilement à la buse du poêle et au tuyau à granulés.\n\u003c\/p\u003e\n\n \u003cul\u003e\n\n\u003cli\u003eVentilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n \u003cli\u003eSystème de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n \u003cli\u003eTechnologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n \u003cli\u003eConforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n \u003cp\u003e\u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n \u003cp\u003eAØ : 4\"\u003c\/p\u003e\n\n \u003cp\u003eBØ : 4,75\"\u003c\/p\u003e\n\n \u003cp\u003eC : 3,6\"\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 🌍 \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;\"\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 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\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\n\u003c!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681246674995,"sku":"VOP0151","price":47.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0150_VOP0151.webp?v=1760456299"},{"product_id":"3-to-4-black-increaser-for-pellet-stove","title":"REHAUSSEUR NOIR DE 3 À 4 POUCES POUR POÊLE À GRANULÉS ","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\nPermet l'assemblage d'un tuyau à granulés de 3\" à 4\".\n\u003c\/p\u003e\n\n \u003cul\u003e\n\n\u003cli\u003eVentilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n \u003cli\u003eSystème de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n \u003cli\u003eTechnologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n \u003cli\u003eConforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n \u003cp\u003e\u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n \u003cp\u003eAØ : 3,09\"\u003c\/p\u003e\n\n \u003cp\u003eBØ : 4,75\"\u003c\/p\u003e\n\n \u003cp\u003eC : 4,57\"\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 🌍 \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 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 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\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\n\u003c!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681246904371,"sku":"VOP5152","price":47.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP5152.webp?v=1760456537"},{"product_id":"4-pellet-adapter-to-6o-masonry-chimney","title":"ADAPTATEUR À GRANULÉS DE 4\" POUR CHEMINÉE EN MAÇONNERIE DE 6\" DE Ø ","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\nL'adaptateur s'encastre dans le mur en maçonnerie ; la plaque de finition noire sert à masquer l'orifice. L'extrémité de l'adaptateur côté appareil se raccorde directement au tuyau à granulés de 10 cm (4 po), et l'extrémité côté cheminée se raccorde directement à la sortie du tubage de 15 cm (6 po). Un connecteur de 10 cm (4 po) est inclus dans l'adaptateur pour maçonnerie.\n\u003c\/p\u003e\n\n \u003cul\u003e\n\n\u003cli\u003eVentilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n \u003cli\u003eSystème de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n \u003cli\u003eTechnologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n \u003cli\u003eExtrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n \u003cli\u003eConforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n \u003cp\u003e\u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n \u003cp\u003eA : 4,75\"\u003c\/p\u003e\n\n \u003cp\u003eBØ : 4\"\u003c\/p\u003e\n\n \u003cp\u003eC : 5,9\"\u003c\/p\u003e\n\n \u003cp\u003eD : 9\"\u003c\/p\u003e\n\n \u003cp\u003eE : 8\"\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 🌍 \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\n\u003c\/span\u003e\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 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\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\n\u003c!-- Installation \u0026 User's Manual --\u003e \n\u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681247166515,"sku":"VOP5153","price":99.0,"currency_code":"CAD","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP5153_MFP_001-Large.webp?v=1760456663"},{"product_id":"4-pellet-adapter-to-6o-class-a-chimney","title":"ADAPTATEUR À GRANULÉS DE 4\" POUR CHEMINÉE DE CLASSE A DE 6\" DE Ø ","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 Utilisé lorsqu'un appareil existant raccordé à une cheminée isolée 2100 est remplacé par un poêle à granulés. L'extrémité la plus petite se raccorde directement au conduit à granulés de 10 cm (4 pouces), l'autre extrémité se raccorde à l'adaptateur universel pour cheminée 2100 de 15 cm (6 pouces).\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n       \u003cli\u003eTechnologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4\"\u003c\/p\u003e\n\n\u003cp\u003e B : 4,75\"\u003c\/p\u003e\n\n\u003cp\u003e C : 6\"\u003c\/p\u003e\n\n\u003cp\u003e DØ : 3,5\"\u003c\/p\u003e\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681249132595,"sku":"VOP5154","price":80.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP5154_MFP_001-Large.webp?v=1760456818"},{"product_id":"simpson-dura-vent-3-to-6-chimney-adapter-ac-3074","title":"ADAPTATEUR DE CHEMINÉE SIMPSON DURA-VENT 3\" À 6\" (AC-3074) ","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 Utilisé lors du remplacement d'un appareil existant raccordé à une cheminée isolée 2100 par un poêle à granulés. L'extrémité la plus petite se raccorde directement au conduit à granulés de 7,6 cm (3 pouces), l'autre extrémité se raccorde à l'adaptateur universel pour cheminée 2100 de 15,2 cm (6 pouces).\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\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":43681250770995,"sku":"49785","price":65.0,"currency_code":"CAD","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/49785.webp?v=1760457328"},{"product_id":"simpson-dura-vent-3-appliance-adapter-pu-3079","title":"ADAPTATEUR POUR APPAREIL SIMPSON DURA-VENT 3\" (PU-3079) ","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 Compatible avec la plupart des buses de poêles à granulés de 3 pouces, le connecteur se fixe facilement à la buse du poêle et au tuyau à 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\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\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\u003c\/span\u003e","brand":"The North Flame","offers":[{"title":"Default Title","offer_id":43681251000371,"sku":"49798","price":14.5,"currency_code":"CAD","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/49798.webp?v=1760457419"},{"product_id":"vortex-3-square-pellet-ceiling-support","title":"SUPPORT DE PLAFOND CARRÉ VORTEX 3\" ","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 Utilisable sur plafonds plats, cathédrale ou inclinés. Le boîtier supporte jusqu'à 12 mètres de conduit de ventilation. Collier de finition et collier de serrage inclus. Peinture noire.\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3,8\"\u003c\/p\u003e\n\n\u003cp\u003e B : 5,8\"\u003c\/p\u003e\n\n\u003cp\u003e C : 9,9\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 11\"\u003c\/p\u003e\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 🌍 \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;\"\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681251229747,"sku":"VOP0180","price":135.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0180_VOP0181-schema.webp?v=1760457804"},{"product_id":"vortex-4-square-pellet-ceiling-support","title":"SUPPORT DE PLAFOND CARRÉ VORTEX 4\" ","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 \nUtilisable sur plafonds plats, cathédrale ou inclinés. Le boîtier supporte jusqu'à 12 mètres de conduit de ventilation. Collier de finition et collier de serrage inclus. Peinture noire.\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4,8\"\u003c\/p\u003e\n\n\u003cp\u003e B : 6,8\"\u003c\/p\u003e\n\n\u003cp\u003e C : 10,9\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 11\"\u003c\/p\u003e\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;\"\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681252835379,"sku":"VOP0181","price":150.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0180_VOP0181-schema.webp?v=1760457804"},{"product_id":"vortex-3-telescoping-pellet-roof-brace","title":"Équerre de renfort de toit télescopique VORTEX 3\" ","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 support permet de fixer le tuyau d'alimentation en granulés lorsqu'il dépasse de plus de 1,5 m au-dessus du toit. Il est réglable de 1,5 m à 2,7 m. Les supports de fixation s'adaptent facilement à toutes les pentes de toit.\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3\"\u003c\/p\u003e\n\n\u003cp\u003e B : 3\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 5' - 9'\u003c\/p\u003e\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;\"\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681253294131,"sku":"VOP0380","price":154.05,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0380_VOP0381.webp?v=1760457957"},{"product_id":"vortex-4-telescoping-pellet-roof-brace","title":"Équerre de renfort de toit télescopique VORTEX 4\" ","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 support permet de fixer le tuyau d'alimentation en granulés lorsqu'il dépasse 1,5 m au-dessus du toit. Il est réglable de 1,5 m à 2,7 m. Les supports de fixation s'adaptent facilement à toutes les pentes de toit.\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4\"\u003c\/p\u003e\n\n\u003cp\u003e B : 3\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 5' - 9'\u003c\/p\u003e\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 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":"Vortex","offers":[{"title":"Default Title","offer_id":43681253425203,"sku":"VOP0381","price":154.05,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0380_VOP0381.webp?v=1760457957"},{"product_id":"vortex-3-pellet-roof-support","title":"SUPPORT DE TOITURE À GRANULÉS VORTEX 3\" ","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 soutenir le conduit de granulés au niveau de la toiture, il s'adapte facilement à toutes les pentes de toit.\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3,75\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 3\"\u003c\/p\u003e\n\n\u003cp\u003e C : 3\"\u003c\/p\u003e\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\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681260634163,"sku":"VOP0382","price":59.25,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0382_VOP0383-schema.webp?v=1760458156"},{"product_id":"vortex-4-pellet-roof-support","title":"SUPPORT DE TOITURE À GRANULÉS VORTEX 4\" ","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 soutenir le conduit de granulés au niveau de la toiture, il s'adapte facilement à toutes les pentes de toit.\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4,75\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 3\"\u003c\/p\u003e\n\n\u003cp\u003e C : 3\"\u003c\/p\u003e\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\n\u003c\/span\u003e\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681272299571,"sku":"VOP0383","price":65.18,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0382_VOP0383-schema.webp?v=1760458156"},{"product_id":"vortex-3-pellet-wallet-support","title":"SUPPORT DE PORTEFEUILLE À GRANULÉS VORTEX 3\" ","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 Réglage de la distance entre le conduit et le mur : de 2,5 cm à 10 cm. Un support mural est nécessaire tous les 2,4 m de conduit de cheminée.\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3,75\"\u003c\/p\u003e\n\n\u003cp\u003e B : 2\"\u003c\/p\u003e\n\n\u003cp\u003e C : 4\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 1\"- 4\"\u003c\/p\u003e\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 🌍 \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;\"\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681278328883,"sku":"VOP0384","price":47.4,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0384_VOP0385.webp?v=1760458332"},{"product_id":"vortex-4-pellet-wall-support","title":"SUPPORT MURAL À GRANULÉS VORTEX 4\" ","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 \nRéglage de la distance entre le conduit et le mur : de 2,5 cm à 10 cm. Un support mural est nécessaire tous les 2,4 m de conduit de cheminée.\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4,75\"\u003c\/p\u003e\n\n\u003cp\u003e B : 2\"\u003c\/p\u003e\n\n\u003cp\u003e C : 4\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 1\"- 4\"\u003c\/p\u003e\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;\"\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\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681288159283,"sku":"VOP0385","price":55.7,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0384_VOP0385.webp?v=1760458332"},{"product_id":"3-pellet-firestop-radiation-shield","title":"BLOC ANTI-RAYONNEMENT À GRANULÉS DE 3\" ","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 Utilisé au niveau du passage d'un conduit à granulés à travers un plancher ou un plafond, afin d'empêcher tout contact entre des matériaux combustibles et le conduit. Fabriqué en acier galvanisé, il est doté de brides supérieures assurant une fixation optimale.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 3,8\"\u003c\/p\u003e\n\n\u003cp\u003e B : 8,5\"\u003c\/p\u003e\n\n\u003cp\u003e C : 7\"\u003c\/p\u003e\n\n\u003cp\u003e D : 10.20\u003c\/p\u003e\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\n\u003c\/span\u003e\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 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\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\n\u003c!-- Installation \u0026 User's Manual --\u003e \n\u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681308573747,"sku":"VOP0230","price":85.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0230_VOP0231.webp?v=1760458837"},{"product_id":"4-pellet-firestop-radiation-shield","title":"BARRIÈRE DE PROTECTION CONTRE LES RADIATIONS À GRANULÉS DE 4\" ","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 Utilisé au niveau du passage d'un conduit à granulés à travers un plancher ou un plafond, afin d'empêcher tout contact entre des matériaux combustibles et le conduit. Fabriqué en acier galvanisé, il est doté de brides supérieures assurant une fixation optimale.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n       \u003cli\u003eTechnologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 4,8\"\u003c\/p\u003e\n\n\u003cp\u003e B : 9,5\"\u003c\/p\u003e\n\n\u003cp\u003e C : 8\"\u003c\/p\u003e\n\n\u003cp\u003e D : 10-20\u003c\/p\u003e\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;\"\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\u003cp style=\"font-size: 14px; margin: 0 0 15px;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681350516787,"sku":"VOP0231","price":98.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0230_VOP0231.webp?v=1760458837"},{"product_id":"3-pellet-black-wall-pass-thru","title":"Passe-câble mural noir pour granulés de 3 pouces ","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 traverser horizontalement un mur combustible, ce passe-mur est réglable pour différentes épaisseurs de mur comprises entre 4 et 9 pouces. Une plaque de recouvrement extérieure en acier galvanisé est incluse.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n       \u003cli\u003eSystème de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 5,75\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 3,9\"\u003c\/p\u003e\n\n\u003cp\u003e C : 9\"\u003c\/p\u003e\n\n\u003cp\u003e D : 10,5\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 4\"-9\"\u003c\/p\u003e\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;\"\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 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\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\n\u003c!-- Installation Instructions --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45738AF_01-05-2014.pdf?v=1760459393\" target=\"_blank\"\u003e\n📄 Instructions d'installation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681381417011,"sku":"VOP0260","price":68.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0261.webp?v=1760459286"},{"product_id":"4-pellet-black-wall-pass-thru","title":"Passe-câble mural noir pour granulés de 4 pouces ","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 traverser horizontalement un mur combustible, ce passe-mur est réglable pour différentes épaisseurs de mur comprises entre 4 et 9 pouces. Une plaque de recouvrement extérieure en acier galvanisé est incluse.\n\n\u003cul\u003e\n\n       \u003cli\u003eVentilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 6,75\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 4,9\"\u003c\/p\u003e\n\n\u003cp\u003e C : 9\"\u003c\/p\u003e\n\n\u003cp\u003e D : 11,5\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 4\"-9\"\u003c\/p\u003e\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;\"\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 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 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\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\n\u003c!-- Installation Instructions --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45738AF_01-05-2014.pdf?v=1760459393\" target=\"_blank\"\u003e\n📄 Instructions d'installation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681420673075,"sku":"VOP0261","price":77.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0261.webp?v=1760459286"},{"product_id":"3-pellet-black-wall-pass-thru-with-fresh-air-intake","title":"Ventilateur à granulés de 7,6 cm (3 po) à paroi noire avec entrée d'air frais ","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 \nPermet l'arrivée d'air frais pour la combustion à travers le mur sans avoir à percer un second trou. Utilisé pour un passage horizontal à travers un mur combustible, ce passe-mur est réglable de 10 à 23 cm pour s'adapter à différentes épaisseurs de mur. Plaque de recouvrement extérieure en acier galvanisé incluse ; tuyau d'arrivée d'air frais non inclus.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 5,7\"\u003c\/p\u003e\n\n\u003cp\u003e BØ : 2,9\"\u003c\/p\u003e\n\n\u003cp\u003e C : 4\"\u003c\/p\u003e\n\n\u003cp\u003e D : 10\"\u003c\/p\u003e\n\n\u003cp\u003e E : 9\"\u003c\/p\u003e\n\n\u003cp\u003e F : 11\"\u003c\/p\u003e\n\n\u003cp\u003e G : 8\"\u003c\/p\u003e\n\n\u003cp\u003e YY : 4\"-9\"\u003c\/p\u003e\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🌍 \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;\"\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 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\u003c!-- PDF Links Styled as Buttons --\u003e\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n\n\u003c!-- Installation \u0026 User's Manual --\u003e \n\u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681421688883,"sku":"VOP0262","price":210.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0262-schema.webp?v=1760459693"},{"product_id":"3-pellet-attic-insulation-shield","title":"Isolation en granulés pour combles de 3 pouces ","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 Obligatoire lors du passage à travers un plafond ou un plancher, cette protection comprend un collier anti-tempête.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n\u003cli\u003e Technologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n       \u003cli\u003eConforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 5,75\"\u003c\/p\u003e\n\n\u003cp\u003e B : 8,25\"\u003c\/p\u003e\n\n\u003cp\u003e C : 6,75\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681422442547,"sku":"VOP0300","price":90.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0300_VOP0301.webp?v=1760460028"},{"product_id":"4-pellet-attic-insulation-shield","title":"Isolation en granulés pour combles de 4 pouces ","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 Obligatoire lors du passage à travers un plafond ou un plancher, cette protection comprend un collier anti-tempête.\n\n\u003cul\u003e\n\n\u003cli\u003e Ventilation robuste et durable grâce à sa paroi extérieure en acier galvanisé et sa paroi intérieure en acier inoxydable\u003c\/li\u003e\n\n\u003cli\u003e Système de joint révolutionnaire qui empêche les fuites et ne nécessite pas l'utilisation de silicone\u003c\/li\u003e\n\n       \u003cli\u003eTechnologie de soudure lisse pour des coutures pratiquement invisibles\u003c\/li\u003e\n\n\u003cli\u003e Extrémités formées avec précision pour une meilleure finition\u003c\/li\u003e\n\n\u003cli\u003e Conforme aux normes NFPA 211, CSA B365, UL 641, CAN\/ULC S609 et ULC\/ORD C441\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e \u003cstrong\u003eDimensions\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cp\u003e AØ : 6,75\"\u003c\/p\u003e\n\n\u003cp\u003e B : 9,25\"\u003c\/p\u003e\n\n\u003cp\u003e C : 7,75\"\u003c\/p\u003e\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;\"\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;\"\u003eConsultez les manuels et brochures disponibles pour plus d'informations sur les performances, l'installation, les exigences d'utilisation, etc. \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!-- Installation \u0026 User's Manual --\u003e\n \u003ca style=\"flex: 1; min-width: 250px; text-decoration: none; background: #f7f7f7; padding: 12px 15px; border-radius: 6px; display: flex; align-items: center; font-size: 14px; color: #000; border: 1px solid #e0e0e0;\" href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/45651A_26-11-2014_009.pdf?v=1760354598\" target=\"_blank\"\u003e\n📄 Manuel d'installation et d'utilisation \u003cspan style=\"margin-left: auto;\"\u003e🔗\u003c\/span\u003e\n\u003c\/a\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":"Vortex","offers":[{"title":"Default Title","offer_id":43681423818803,"sku":"VOP0301","price":90.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/6871\/6339\/files\/VOP0300_VOP0301.webp?v=1760460028"}],"url":"https:\/\/thenorthflame.com\/fr\/collections\/pellet-vent.oembed","provider":"The North Flame","version":"1.0","type":"link"}