{"id":7265,"date":"2026-06-20T19:50:39","date_gmt":"2026-06-20T23:50:39","guid":{"rendered":"https:\/\/epoxy.express\/?page_id=7265"},"modified":"2026-06-20T23:56:07","modified_gmt":"2026-06-21T03:56:07","slug":"carpet-services-installation-repair-cleaning","status":"publish","type":"page","link":"https:\/\/epoxy.express\/en\/carpet-services-installation-repair-cleaning\/","title":{"rendered":"Carpet Installation &#8211; Carpet Cleaning &#8211; in Montreal &#8211; Epoxy Express Inc Calculator."},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"7265\" class=\"elementor elementor-7265\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b5dd285 e-con e-atomic-element e-flexbox-base e-83ef2cb \" data-id=\"b5dd285\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"b5dd285\">\n    \t\t<div class=\"elementor-element elementor-element-7383194 elementor-widget elementor-widget-html\" data-id=\"7383194\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- Integration of Tailwind CSS with -5% font size configuration -->\r\n<script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\r\n<script>\r\n  tailwind.config = {\r\n    theme: {\r\n      extend: {\r\n        fontSize: {\r\n          'xs': ['0.7125rem', { lineHeight: '0.85rem' }],       \/\/ 0.75rem - 5%\r\n          'sm': ['0.83125rem', { lineHeight: '1rem' }],   \/\/ 0.875rem - 5%\r\n          'base': ['0.95rem', { lineHeight: '1.25rem' }],     \/\/ 1rem - 5%\r\n          'lg': ['1.06875rem', { lineHeight: '1.50rem' }],   \/\/ 1.125rem - 5%\r\n          'xl': ['1.1875rem', { lineHeight: '1.50rem' }],    \/\/ 1.25rem - 5%\r\n          '2xl': ['1.425rem', { lineHeight: '1.75rem' }],       \/\/ 1.5rem - 5%\r\n          '3xl': ['1.78125rem', { lineHeight: '2rem' }],  \/\/ 1.875rem - 5%\r\n          '4xl': ['2.1375rem', { lineHeight: '2.25rem' }],    \/\/ 2.25rem - 5%\r\n          '5xl': ['2.85rem', { lineHeight: '1' }],            \/\/ 3rem - 5%\r\n        }\r\n      }\r\n    }\r\n  }\r\n<\/script>\r\n\r\n<!-- Integration of Lucide icons -->\r\n<script src=\"https:\/\/unpkg.com\/lucide@latest\"><\/script>\r\n\r\n<style>\r\n    \/* Scoped CSS to avoid conflicts with page builders like Elementor *\/\r\n    #carpet-estimator-widget .hidden { display: none !important; }\r\n    #carpet-estimator-widget input[type=\"number\"]::-webkit-inner-spin-button, \r\n    #carpet-estimator-widget input[type=\"number\"]::-webkit-outer-spin-button { \r\n        -webkit-appearance: none; margin: 0; \r\n    }\r\n    \r\n    \/* Custom scrollbar for the widget only *\/\r\n    #carpet-estimator-widget ::-webkit-scrollbar { width: 8px; }\r\n    #carpet-estimator-widget ::-webkit-scrollbar-track { background: #f1f5f9; }\r\n    #carpet-estimator-widget ::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 4px; }\r\n    #carpet-estimator-widget ::-webkit-scrollbar-thumb:hover { background: #94a3b8; }\r\n\r\n    \/* Styles for Expertise\/Education sections *\/\r\n    #carpet-estimator-widget .tab-active { border-bottom-width: 4px; border-color: #2563eb; color: #1e40af; font-weight: 700; background-color: #eff6ff; }\r\n    #carpet-estimator-widget .tab-inactive { color: #64748b; font-weight: 500; }\r\n    #carpet-estimator-widget .tab-inactive:hover { background-color: #f8fafc; color: #0f172a; }\r\n    \r\n    #carpet-estimator-widget .exp-btn-active { border-color: #059669; background-color: #d1fae5; color: #064e3b; font-weight: bold; border-left-width: 4px; box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); }\r\n    #carpet-estimator-widget .exp-btn-inactive { border-color: #e2e8f0; background-color: #ffffff; color: #475569; border-left-width: 4px; border-left-color: transparent; }\r\n    #carpet-estimator-widget .exp-btn-inactive:hover { border-color: #a7f3d0; background-color: #ecfdf5; }\r\n\r\n    #carpet-estimator-widget .fade-in { animation: fadeIn 0.4s ease-out forwards; }\r\n    @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }\r\n    \r\n    #carpet-estimator-widget .pulse-border { animation: pulseBorder 2s infinite; }\r\n    @keyframes pulseBorder { 0% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.4); } 70% { box-shadow: 0 0 0 10px rgba(16, 185, 129, 0); } 100% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0); } }\r\n<\/style>\r\n\r\n<!-- Main Widget Container -->\r\n<div id=\"carpet-estimator-widget\" class=\"bg-slate-50 text-slate-800 font-sans pb-20 text-base\">\r\n\r\n    <!-- EXPERTISE AND EDUCATION SECTIONS (DASHBOARD) -->\r\n    <div class=\"max-w-7xl mx-auto px-4 md:px-8 mt-4 mb-16\">\r\n        \r\n        <!-- Dashboard Navigation -->\r\n        <nav class=\"flex flex-wrap rounded-t-xl overflow-hidden border border-slate-200 bg-white shadow-sm mb-8\">\r\n            <button onclick=\"switchTab('expertise')\" id=\"tab-expertise\" class=\"tab-active flex-1 min-w-[150px] py-4 px-2 text-center transition-all duration-200 focus:outline-none flex justify-center items-center gap-2\">\r\n                <span class=\"text-xl\">\ud83d\udee0\ufe0f<\/span> Expertise & Equipment\r\n            <\/button>\r\n            <button onclick=\"switchTab('education')\" id=\"tab-education\" class=\"tab-inactive flex-1 min-w-[150px] py-4 px-2 text-center transition-all duration-200 border-l border-slate-200 focus:outline-none flex justify-center items-center gap-2\">\r\n                <span class=\"text-xl\">\ud83c\udf93<\/span> Glossary, Health & Insurance\r\n            <\/button>\r\n        <\/nav>\r\n\r\n        <!-- EXPERTISE SECTION -->\r\n        <section id=\"section-expertise\" class=\"fade-in\">\r\n            <div class=\"bg-white rounded-xl shadow-md border border-slate-200 p-6 md:p-8\">\r\n                <div class=\"flex flex-col md:flex-row justify-between items-start md:items-center mb-6\">\r\n                    <div>\r\n                        <h2 class=\"text-2xl font-bold text-slate-800 mb-2 border-b-2 border-emerald-500 pb-2 inline-block\">Carpet Services & Equipment<\/h2>\r\n                        <p class=\"text-slate-600 mt-2\">Details of our operations, materials, and specialized tooling per service.<\/p>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"grid grid-cols-1 lg:grid-cols-5 gap-6\">\r\n                    <div class=\"lg:col-span-1 flex flex-col gap-2 border-r border-slate-100 pr-0 lg:pr-4\">\r\n                        <button onclick=\"loadExpertise('cleaning')\" id=\"exp-cleaning\" class=\"exp-btn exp-btn-active py-3 px-4 rounded-r-lg text-left transition-colors\">\r\n                            \ud83e\uddfc Deep Cleaning\r\n                        <\/button>\r\n                        <button onclick=\"loadExpertise('repair')\" id=\"exp-repair\" class=\"exp-btn exp-btn-inactive py-3 px-4 rounded-r-lg text-left transition-colors\">\r\n                            \ud83d\udd27 Repair & Stretch\r\n                        <\/button>\r\n                        <button onclick=\"loadExpertise('install')\" id=\"exp-install\" class=\"exp-btn exp-btn-inactive py-3 px-4 rounded-r-lg text-left transition-colors\">\r\n                            \ud83d\udccf New Installation\r\n                        <\/button>\r\n                        <button onclick=\"loadExpertise('commercial')\" id=\"exp-commercial\" class=\"exp-btn exp-btn-inactive py-3 px-4 rounded-r-lg text-left transition-colors\">\r\n                            \ud83c\udfe2 Commercial Tiles\r\n                        <\/button>\r\n                    <\/div>\r\n                    <div class=\"lg:col-span-4\" id=\"expertise-content-area\">\r\n                        <!-- Dynamic Content injected via JS -->\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n        <\/section>\r\n\r\n        <!-- EDUCATION SECTION -->\r\n        <section id=\"section-education\" class=\"hidden fade-in\">\r\n            <div class=\"bg-white rounded-xl shadow-md border border-slate-200 overflow-hidden\">\r\n                <div class=\"bg-gradient-to-r from-blue-900 to-indigo-800 p-8 text-white\">\r\n                    <h2 class=\"text-3xl md:text-4xl font-extrabold mb-3 flex items-center gap-3\">\r\n                        <span>\ud83c\udf93<\/span> Glossary, Laws & Insurance Benefits\r\n                    <\/h2>\r\n                    <p class=\"text-indigo-100 text-lg max-w-3xl\">\r\n                        Educate yourself on industry standards. A client who understands the process no longer just buys a \"price\", but rather a guarantee of indoor air quality and long-term durability.\r\n                    <\/p>\r\n                <\/div>\r\n\r\n                <div class=\"p-6 md:p-8 space-y-12\">\r\n                    <!-- 1. TECHNICAL GLOSSARY -->\r\n                    <div>\r\n                        <h3 class=\"text-2xl font-bold text-slate-800 mb-6 flex items-center gap-2 border-b border-slate-200 pb-2\">\r\n                            <span class=\"text-blue-600\">\ud83d\udcd6<\/span> The Flooring Glossary\r\n                        <\/h3>\r\n                        <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n                            <div class=\"p-4 bg-slate-50 rounded-lg border border-slate-200 hover:shadow-md transition-shadow\">\r\n                                <h4 class=\"font-bold text-slate-900 mb-1 text-lg\">Hot Water Extraction<\/h4>\r\n                                <p class=\"text-slate-600\">Often called \"steam cleaning.\" The only method recommended by major carpet manufacturers to maintain warranties. Injects hot water and immediately extracts it along with deep soils.<\/p>\r\n                            <\/div>\r\n                            <div class=\"p-4 bg-slate-50 rounded-lg border border-slate-200 hover:shadow-md transition-shadow\">\r\n                                <h4 class=\"font-bold text-slate-900 mb-1 text-lg\">Power Stretcher<\/h4>\r\n                                <p class=\"text-slate-600\">A heavy-duty tool required for proper installation and ripple removal. \"Knee kickers\" alone are not sufficient for a tight, warranty-compliant wall-to-wall installation.<\/p>\r\n                            <\/div>\r\n                            <div class=\"p-4 bg-slate-50 rounded-lg border border-slate-200 hover:shadow-md transition-shadow\">\r\n                                <h4 class=\"font-bold text-slate-900 mb-1 text-lg\">Underlayment \/ Pad<\/h4>\r\n                                <p class=\"text-slate-600\">The cushion beneath the carpet. Upgrading from standard foam to memory foam or rubber extends the life of the carpet by up to 40% by absorbing foot traffic impact.<\/p>\r\n                            <\/div>\r\n                            <div class=\"p-4 bg-slate-50 rounded-lg border border-slate-200 hover:shadow-md transition-shadow\">\r\n                                <h4 class=\"font-bold text-slate-900 mb-1 text-lg\">Delamination<\/h4>\r\n                                <p class=\"text-slate-600\">When the secondary backing of the carpet separates from the primary backing. Often caused by over-wetting during amateur DIY cleaning rentals.<\/p>\r\n                            <\/div>\r\n                            <div class=\"p-4 bg-slate-50 rounded-lg border border-slate-200 hover:shadow-md transition-shadow\">\r\n                                <h4 class=\"font-bold text-slate-900 mb-1 text-lg\">VOCs (Off-gassing)<\/h4>\r\n                                <p class=\"text-slate-600\"><em>Volatile Organic Compounds.<\/em> Gases emitted by new carpets and glues. We use CRI Green Label Plus certified materials to guarantee total respiratory safety.<\/p>\r\n                            <\/div>\r\n                            <div class=\"p-4 bg-slate-50 rounded-lg border border-slate-200 hover:shadow-md transition-shadow\">\r\n                                <h4 class=\"font-bold text-slate-900 mb-1 text-lg\">CRB Machine<\/h4>\r\n                                <p class=\"text-slate-600\"><em>Cylindrical Roller Brush.<\/em> Used to agitate carpet fibers prior to extraction, lifting matted down traffic lanes and pulling embedded pet hair to the surface.<\/p>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <!-- 2. LEGAL SHIELD -->\r\n                    <div>\r\n                        <h3 class=\"text-2xl font-bold text-slate-800 mb-6 flex items-center gap-2 border-b border-slate-200 pb-2\">\r\n                            <span class=\"text-red-600\">\u2696\ufe0f<\/span> Liability & Certification Shield\r\n                        <\/h3>\r\n                        <div class=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\r\n                            <div class=\"bg-red-50 p-6 rounded-xl border border-red-200\">\r\n                                <div class=\"w-12 h-12 bg-red-100 rounded-full flex items-center justify-center text-red-600 text-2xl mb-4\">\ud83c\udfe2<\/div>\r\n                                <h4 class=\"font-bold text-red-900 mb-2\">Corporate Licensing<\/h4>\r\n                                <p class=\"text-red-800 mb-3\">Our company is fully registered and bonded. Hiring unregistered cash-workers is a massive risk.<\/p>\r\n                                <p class=\"font-semibold text-red-900\">The client's risk:<\/p>\r\n                                <p class=\"text-xs text-red-700 mt-1\">If the contractor damages your subfloor or causes a flood, you have <strong>no legal recourse<\/strong> and no access to contractor bond funds.<\/p>\r\n                            <\/div>\r\n                            <div class=\"bg-orange-50 p-6 rounded-xl border border-orange-200\">\r\n                                <div class=\"w-12 h-12 bg-orange-100 rounded-full flex items-center justify-center text-orange-600 text-2xl mb-4\">\ud83d\udc77<\/div>\r\n                                <h4 class=\"font-bold text-orange-900 mb-2\">IICRC Certification<\/h4>\r\n                                <p class=\"text-orange-800 mb-3\">The Institute of Inspection, Cleaning and Restoration Certification sets the gold standard for our technicians.<\/p>\r\n                                <p class=\"font-semibold text-orange-900\">The client's risk:<\/p>\r\n                                <p class=\"text-xs text-orange-700 mt-1\">Uncertified cleaners often use high-pH soaps that void manufacturer warranties and leave a sticky residue, making the carpet get dirty twice as fast.<\/p>\r\n                            <\/div>\r\n                            <div class=\"bg-yellow-50 p-6 rounded-xl border border-yellow-200\">\r\n                                <div class=\"w-12 h-12 bg-yellow-100 rounded-full flex items-center justify-center text-yellow-600 text-2xl mb-4\">\ud83d\udea7<\/div>\r\n                                <h4 class=\"font-bold text-yellow-900 mb-2\">WSIB \/ CNESST<\/h4>\r\n                                <p class=\"text-yellow-800 mb-3\">Workplace safety. All our technicians are fully covered by workers' compensation boards.<\/p>\r\n                                <p class=\"font-semibold text-yellow-900\">The client's risk:<\/p>\r\n                                <p class=\"text-xs text-yellow-700 mt-1\">If an undeclared worker injures their back while moving your sofa or stretching carpet, <strong>you can be personally sued<\/strong> as the property owner.<\/p>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <!-- 3. INSURANCE BENEFIT -->\r\n                    <div class=\"bg-gradient-to-br from-emerald-800 to-teal-900 p-8 rounded-2xl shadow-lg relative overflow-hidden pulse-border\">\r\n                        <div class=\"absolute top-0 right-0 -mt-4 -mr-4 text-9xl opacity-10\">\ud83d\udee1\ufe0f<\/div>\r\n                        <div class=\"relative z-10\">\r\n                            <h3 class=\"text-2xl md:text-3xl font-bold text-white mb-4 flex items-center gap-3\">\r\n                                \ud83d\udee1\ufe0f The Closing Argument: Health & Liability\r\n                            <\/h3>\r\n                            <p class=\"text-emerald-100 text-lg mb-6\">\r\n                                Proper carpet maintenance is not just an aesthetic expense; it is active risk management for landlords, property managers, and homeowners.\r\n                            <\/p>\r\n                            \r\n                            <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n                                <div class=\"bg-white\/10 backdrop-blur-sm p-5 rounded-xl border border-emerald-500\/30\">\r\n                                    <h4 class=\"font-bold text-emerald-300 mb-2 flex items-center gap-2\"><span>\ud83c\udf2c\ufe0f<\/span> Indoor Air Quality (IAQ)<\/h4>\r\n                                    <p class=\"text-emerald-50 leading-relaxed\">\r\n                                        Carpets act as the biggest air filter in your building, trapping dust, pollen, and VOCs. Regular professional extraction empties this \"filter.\" Better IAQ means drastically reduced respiratory issues and sick days.\r\n                                    <\/p>\r\n                                <\/div>\r\n                                <div class=\"bg-white\/10 backdrop-blur-sm p-5 rounded-xl border border-emerald-500\/30\">\r\n                                    <h4 class=\"font-bold text-emerald-300 mb-2 flex items-center gap-2\"><span>\ud83d\udeb6<\/span> Eliminating Trip Hazards<\/h4>\r\n                                    <p class=\"text-emerald-50 leading-relaxed\">\r\n                                        Loose, rippled carpets are the leading cause of indoor trip-and-fall claims. Our power-stretching services eliminate these ripples, heavily mitigating your civil liability and keeping your premises safe.\r\n                                    <\/p>\r\n                                <\/div>\r\n                                <div class=\"bg-white\/10 backdrop-blur-sm p-5 rounded-xl border border-emerald-500\/30\">\r\n                                    <h4 class=\"font-bold text-emerald-300 mb-2 flex items-center gap-2\"><span>\ud83e\udda0<\/span> Mold & Mildew Prevention<\/h4>\r\n                                    <p class=\"text-emerald-50 leading-relaxed\">\r\n                                        Using commercial extraction ensures carpets dry in hours, not days. This rapid drying process prevents mold spore growth in the underlay pad, a common issue with DIY rental machines.\r\n                                    <\/p>\r\n                                <\/div>\r\n                                <div class=\"bg-white\/10 backdrop-blur-sm p-5 rounded-xl border border-emerald-500\/30\">\r\n                                    <h4 class=\"font-bold text-emerald-300 mb-2 flex items-center gap-2\"><span>\ud83d\udcdc<\/span> Manufacturer Warranty Preservation<\/h4>\r\n                                    <p class=\"text-emerald-50 leading-relaxed\">\r\n                                        Major mills (like Shaw or Mohawk) mandate hot water extraction every 12 to 18 months by certified professionals. Our official invoice acts as the necessary proof to keep your 15-year warranty valid.\r\n                                    <\/p>\r\n                                <\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                <\/div>\r\n            <\/div>\r\n        <\/section>\r\n    <\/div>\r\n\r\n    <!-- MAIN CALCULATOR AREA -->\r\n    <main class=\"max-w-7xl mx-auto mt-8 px-4 md:px-8 grid grid-cols-1 lg:grid-cols-3 gap-8\">\r\n        \r\n        <!-- LEFT COLUMN: CALCULATOR -->\r\n        <div class=\"lg:col-span-2 space-y-8\">\r\n            \r\n            <!-- SECTION 1: BASE AREAS -->\r\n            <section class=\"bg-white p-6 md:p-8 rounded-2xl shadow-sm border border-slate-200\">\r\n                <h2 class=\"text-2xl font-bold mb-6 flex items-center gap-2 text-slate-800\">\r\n                    <i data-lucide=\"layout-dashboard\" class=\"w-6 h-6 text-blue-600\"><\/i>\r\n                    1. Define Project Areas (Base Prep\/Cleaning)\r\n                <\/h2>\r\n                <p class=\"text-slate-500 mb-6 text-sm\">Select the spaces involved in your project. This base fee covers standard prep, mobilization, or standard deep steam cleaning for these specific areas.<\/p>\r\n                \r\n                <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n                    \r\n                    <!-- Standard Rooms -->\r\n                    <div class=\"p-4 border border-slate-100 rounded-xl bg-slate-50 transition hover:shadow-md hover:border-blue-200\">\r\n                        <label class=\"block font-semibold text-slate-700 mb-1\">Standard Rooms (Bed\/Office)<\/label>\r\n                        <p class=\"text-xs text-slate-500 mb-3 h-8\">Up to 200 sq.ft. Includes basic prep or steam clean.<\/p>\r\n                        <div class=\"flex items-center gap-3\">\r\n                            <input type=\"number\" min=\"0\" id=\"unit-room\" placeholder=\"0\" class=\"unit-input w-24 p-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 text-lg font-bold text-center\" data-price=\"60\" \/>\r\n                            <span class=\"font-medium text-slate-600\">rooms<\/span>\r\n                        <\/div>\r\n                        <div class=\"mt-2 text-right font-bold text-blue-600\">$60 \/ ea.<\/div>\r\n                    <\/div>\r\n\r\n                    <!-- Large Areas -->\r\n                    <div class=\"p-4 border border-slate-100 rounded-xl bg-slate-50 transition hover:shadow-md hover:border-blue-200\">\r\n                        <label class=\"block font-semibold text-slate-700 mb-1\">Large Living Areas (Basement\/Living)<\/label>\r\n                        <p class=\"text-xs text-slate-500 mb-3 h-8\">Up to 400 sq.ft. Includes basic prep or steam clean.<\/p>\r\n                        <div class=\"flex items-center gap-3\">\r\n                            <input type=\"number\" min=\"0\" id=\"unit-large\" placeholder=\"0\" class=\"unit-input w-24 p-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 text-lg font-bold text-center\" data-price=\"100\" \/>\r\n                            <span class=\"font-medium text-slate-600\">rooms<\/span>\r\n                        <\/div>\r\n                        <div class=\"mt-2 text-right font-bold text-blue-600\">$100 \/ ea.<\/div>\r\n                    <\/div>\r\n\r\n                    <!-- Stairs -->\r\n                    <div class=\"p-4 border border-slate-100 rounded-xl bg-slate-50 transition hover:shadow-md hover:border-blue-200\">\r\n                        <label class=\"block font-semibold text-slate-700 mb-1\">Flights of Stairs<\/label>\r\n                        <p class=\"text-xs text-slate-500 mb-3 h-8\">Standard 12-14 steps. Landing included.<\/p>\r\n                        <div class=\"flex items-center gap-3\">\r\n                            <input type=\"number\" min=\"0\" id=\"unit-stairs\" placeholder=\"0\" class=\"unit-input w-24 p-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 text-lg font-bold text-center\" data-price=\"75\" \/>\r\n                            <span class=\"font-medium text-slate-600\">flights<\/span>\r\n                        <\/div>\r\n                        <div class=\"mt-2 text-right font-bold text-blue-600\">$75 \/ ea.<\/div>\r\n                    <\/div>\r\n\r\n                    <!-- Hallways -->\r\n                    <div class=\"p-4 border border-slate-100 rounded-xl bg-slate-50 transition hover:shadow-md hover:border-blue-200\">\r\n                        <label class=\"block font-semibold text-slate-700 mb-1\">Hallways & Corridors<\/label>\r\n                        <p class=\"text-xs text-slate-500 mb-3 h-8\">Standard residential hallway.<\/p>\r\n                        <div class=\"flex items-center gap-3\">\r\n                            <input type=\"number\" min=\"0\" id=\"unit-hall\" placeholder=\"0\" class=\"unit-input w-24 p-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 text-lg font-bold text-center\" data-price=\"40\" \/>\r\n                            <span class=\"font-medium text-slate-600\">areas<\/span>\r\n                        <\/div>\r\n                        <div class=\"mt-2 text-right font-bold text-blue-600\">$40 \/ ea.<\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/section>\r\n\r\n            <!-- SECTION 2: PRO CARPET SOLUTIONS -->\r\n            <section class=\"bg-white p-6 md:p-8 rounded-2xl shadow-sm border border-slate-200\">\r\n                <div class=\"flex items-center justify-between mb-6\">\r\n                    <h2 class=\"text-2xl font-bold flex items-center gap-2 text-slate-800\">\r\n                        <i data-lucide=\"scissors\" class=\"w-6 h-6 text-indigo-600\"><\/i>\r\n                        2. Upgrades, Installs & Repairs\r\n                    <\/h2>\r\n                    <span class=\"bg-indigo-100 text-indigo-800 text-xs font-bold px-3 py-1 rounded-full uppercase tracking-wide\">Select Services<\/span>\r\n                <\/div>\r\n                \r\n                <p class=\"text-slate-500 mb-6\">Choose specialized services for the areas you defined above. Whether restoring an old floor or installing a brand new one, we have the expertise.<\/p>\r\n\r\n                <!-- Options per unit (Matrix) -->\r\n                <h3 class=\"font-bold text-slate-700 mb-3 text-lg border-b pb-2\">Services per Area<\/h3>\r\n                <div class=\"space-y-4 mb-8\">\r\n                    \r\n                    <!-- Install Matrix -->\r\n                    <div id=\"container-service-install\" class=\"border border-slate-200 rounded-xl overflow-hidden transition-all duration-300\">\r\n                        <label class=\"flex items-center p-4 cursor-pointer hover:bg-slate-50\">\r\n                            <input type=\"checkbox\" id=\"service-install\" data-target=\"matrix-service-install\" class=\"main-option-checkbox w-5 h-5 text-indigo-600 focus:ring-indigo-500 rounded\" disabled>\r\n                            <div class=\"ml-4 flex-1\">\r\n                                <span class=\"font-bold text-slate-800\">New Carpet Installation<\/span>\r\n                                <span class=\"block text-xs text-slate-500\">Expert labor and standard pad included. You pick the carpet. ($350 \/ area)<\/span>\r\n                            <\/div>\r\n                        <\/label>\r\n                        <div id=\"matrix-service-install\" class=\"matrix-container hidden bg-indigo-50\/50 p-4 border-t border-indigo-100\">\r\n                            <p class=\"text-xs font-bold text-indigo-800 mb-3 uppercase tracking-wider\">Select areas for new installation:<\/p>\r\n                            <div class=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Rooms (Max <span class=\"max-lbl-room text-indigo-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-indigo-200 rounded text-center font-bold\" data-price=\"350\" data-unit-type=\"room\"><\/div>\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Large (Max <span class=\"max-lbl-large text-indigo-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-indigo-200 rounded text-center font-bold\" data-price=\"350\" data-unit-type=\"large\"><\/div>\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Stairs (Max <span class=\"max-lbl-stairs text-indigo-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-indigo-200 rounded text-center font-bold\" data-price=\"350\" data-unit-type=\"stairs\"><\/div>\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Halls (Max <span class=\"max-lbl-hall text-indigo-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-indigo-200 rounded text-center font-bold\" data-price=\"350\" data-unit-type=\"hall\"><\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <!-- Stretch Matrix -->\r\n                    <div id=\"container-service-stretch\" class=\"border border-slate-200 rounded-xl overflow-hidden transition-all duration-300\">\r\n                        <label class=\"flex items-center p-4 cursor-pointer hover:bg-slate-50\">\r\n                            <input type=\"checkbox\" id=\"service-stretch\" data-target=\"matrix-service-stretch\" class=\"main-option-checkbox w-5 h-5 text-indigo-600 focus:ring-indigo-500 rounded\" disabled>\r\n                            <div class=\"ml-4 flex-1\">\r\n                                <span class=\"font-bold text-slate-800\">Power Stretching (Fix Ripples)<\/span>\r\n                                <span class=\"block text-xs text-slate-500\">Remove trip hazards and wrinkles using heavy-duty power stretchers. ($120 \/ area)<\/span>\r\n                            <\/div>\r\n                        <\/label>\r\n                        <div id=\"matrix-service-stretch\" class=\"matrix-container hidden bg-indigo-50\/50 p-4 border-t border-indigo-100\">\r\n                            <p class=\"text-xs font-bold text-indigo-800 mb-3 uppercase tracking-wider\">Select areas to stretch:<\/p>\r\n                            <div class=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Rooms (Max <span class=\"max-lbl-room text-indigo-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-indigo-200 rounded text-center font-bold\" data-price=\"120\" data-unit-type=\"room\"><\/div>\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Large (Max <span class=\"max-lbl-large text-indigo-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-indigo-200 rounded text-center font-bold\" data-price=\"120\" data-unit-type=\"large\"><\/div>\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Stairs (Max <span class=\"max-lbl-stairs text-indigo-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-indigo-200 rounded text-center font-bold\" data-price=\"120\" data-unit-type=\"stairs\"><\/div>\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Halls (Max <span class=\"max-lbl-hall text-indigo-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-indigo-200 rounded text-center font-bold\" data-price=\"120\" data-unit-type=\"hall\"><\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <!-- Pad Matrix -->\r\n                    <div id=\"container-service-pad\" class=\"border border-slate-200 rounded-xl overflow-hidden transition-all duration-300\">\r\n                        <label class=\"flex items-center p-4 cursor-pointer hover:bg-slate-50\">\r\n                            <input type=\"checkbox\" id=\"service-pad\" data-target=\"matrix-service-pad\" class=\"main-option-checkbox w-5 h-5 text-indigo-600 focus:ring-indigo-500 rounded\" disabled>\r\n                            <div class=\"ml-4 flex-1\">\r\n                                <span class=\"font-bold text-slate-800\">Premium Memory Foam Underlay<\/span>\r\n                                <span class=\"block text-xs text-slate-500\">Upgrade your new installation with an ultra-plush, waterproof pad. ($100 \/ area)<\/span>\r\n                            <\/div>\r\n                        <\/label>\r\n                        <div id=\"matrix-service-pad\" class=\"matrix-container hidden bg-indigo-50\/50 p-4 border-t border-indigo-100\">\r\n                            <div class=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Rooms (Max <span class=\"max-lbl-room text-indigo-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-indigo-200 rounded text-center font-bold\" data-price=\"100\" data-unit-type=\"room\"><\/div>\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Large (Max <span class=\"max-lbl-large text-indigo-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-indigo-200 rounded text-center font-bold\" data-price=\"100\" data-unit-type=\"large\"><\/div>\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Stairs (Max <span class=\"max-lbl-stairs text-indigo-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-indigo-200 rounded text-center font-bold\" data-price=\"100\" data-unit-type=\"stairs\"><\/div>\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Halls (Max <span class=\"max-lbl-hall text-indigo-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-indigo-200 rounded text-center font-bold\" data-price=\"100\" data-unit-type=\"hall\"><\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <!-- Odour Treatment Matrix -->\r\n                    <div id=\"container-service-odour\" class=\"border border-slate-200 rounded-xl overflow-hidden transition-all duration-300\">\r\n                        <label class=\"flex items-center p-4 cursor-pointer hover:bg-slate-50\">\r\n                            <input type=\"checkbox\" id=\"service-odour\" data-target=\"matrix-service-odour\" class=\"main-option-checkbox w-5 h-5 text-blue-600 focus:ring-blue-500 rounded\" disabled>\r\n                            <div class=\"ml-4 flex-1\">\r\n                                <span class=\"font-bold text-slate-800\">Pet Urine & Odour Enzyme Flush<\/span>\r\n                                <span class=\"block text-xs text-slate-500\">Subsurface extraction mapping to permanently neutralize deep odors. ($80 \/ area)<\/span>\r\n                            <\/div>\r\n                        <\/label>\r\n                        <div id=\"matrix-service-odour\" class=\"matrix-container hidden bg-blue-50\/50 p-4 border-t border-blue-100\">\r\n                            <div class=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Rooms (Max <span class=\"max-lbl-room text-blue-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-blue-200 rounded text-center font-bold\" data-price=\"80\" data-unit-type=\"room\"><\/div>\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Large (Max <span class=\"max-lbl-large text-blue-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-blue-200 rounded text-center font-bold\" data-price=\"80\" data-unit-type=\"large\"><\/div>\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Stairs (Max <span class=\"max-lbl-stairs text-blue-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-blue-200 rounded text-center font-bold\" data-price=\"80\" data-unit-type=\"stairs\"><\/div>\r\n                                <div><label class=\"block text-xs font-semibold text-slate-700 mb-1\">Halls (Max <span class=\"max-lbl-hall text-blue-600\">0<\/span>)<\/label><input type=\"number\" min=\"0\" class=\"sub-opt-input w-full p-2 border border-blue-200 rounded text-center font-bold\" data-price=\"80\" data-unit-type=\"hall\"><\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- Fixed Treatments \/ Add-ons -->\r\n                <h3 class=\"font-bold text-slate-700 mb-3 text-lg border-b pb-2\">Common Add-ons & Fixes (Fixed Prices)<\/h3>\r\n                <div class=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\r\n                    <label class=\"option-fixed-container flex items-center p-4 border border-slate-200 rounded-xl cursor-pointer hover:bg-slate-50 transition-all\">\r\n                        <input type=\"checkbox\" class=\"fixed-option-checkbox w-5 h-5 text-indigo-600 focus:ring-indigo-500 rounded\" data-price=\"150\" data-name=\"Carpet Patching (Burn\/Stain Repair)\">\r\n                        <div class=\"ml-3\">\r\n                            <span class=\"block font-bold text-slate-800\">Carpet Patching<\/span>\r\n                            <span class=\"block text-xs text-slate-500\">$150 (Donor piece replacement)<\/span>\r\n                        <\/div>\r\n                    <\/label>\r\n\r\n                    <label class=\"option-fixed-container flex items-center p-4 border border-slate-200 rounded-xl cursor-pointer hover:bg-slate-50 transition-all\">\r\n                        <input type=\"checkbox\" class=\"fixed-option-checkbox w-5 h-5 text-indigo-600 focus:ring-indigo-500 rounded\" data-price=\"300\" data-name=\"Subfloor Squeak Repair\">\r\n                        <div class=\"ml-3\">\r\n                            <span class=\"block font-bold text-slate-800\">Subfloor Squeak Repair<\/span>\r\n                            <span class=\"block text-xs text-slate-500\">$300 (Fasten subfloor before install)<\/span>\r\n                        <\/div>\r\n                    <\/label>\r\n\r\n                    <label class=\"option-fixed-container flex items-center p-4 border border-slate-200 rounded-xl cursor-pointer hover:bg-slate-50 transition-all\">\r\n                        <input type=\"checkbox\" class=\"fixed-option-checkbox w-5 h-5 text-indigo-600 focus:ring-indigo-500 rounded\" data-price=\"200\" data-name=\"Scotchgard Fabric Protection\">\r\n                        <div class=\"ml-3\">\r\n                            <span class=\"block font-bold text-slate-800\">Scotchgard\u2122 Protection<\/span>\r\n                            <span class=\"block text-xs text-slate-500\">$200 (Whole-home spray application)<\/span>\r\n                        <\/div>\r\n                    <\/label>\r\n\r\n                    <label class=\"option-fixed-container flex items-center p-4 border border-slate-200 rounded-xl cursor-pointer hover:bg-slate-50 transition-all\">\r\n                        <input type=\"checkbox\" class=\"fixed-option-checkbox w-5 h-5 text-indigo-600 focus:ring-indigo-500 rounded\" data-price=\"350\" data-name=\"Custom Stair Runner Binding\">\r\n                        <div class=\"ml-3\">\r\n                            <span class=\"block font-bold text-slate-800\">Custom Stair Runner Binding<\/span>\r\n                            <span class=\"block text-xs text-slate-500\">$350 (Tailored edges for exposed wood stairs)<\/span>\r\n                        <\/div>\r\n                    <\/label>\r\n\r\n                    <label class=\"option-fixed-container md:col-span-2 flex items-center p-4 border border-slate-200 rounded-xl cursor-pointer hover:bg-slate-50 transition-all\">\r\n                        <input type=\"checkbox\" class=\"fixed-option-checkbox w-5 h-5 text-teal-500 focus:ring-teal-500 rounded\" data-price=\"120\" data-name=\"Old Carpet Tear-out & Disposal\">\r\n                        <div class=\"ml-3\">\r\n                            <span class=\"block font-bold text-slate-800\">Old Carpet Tear-out & Disposal<\/span>\r\n                            <span class=\"block text-xs text-slate-500\">$120 Base Fee (We rip up and haul away the old stuff)<\/span>\r\n                        <\/div>\r\n                    <\/label>\r\n                <\/div>\r\n\r\n            <\/section>\r\n\r\n            <!-- SECTION 3: COMMUNITY -->\r\n            <section class=\"bg-white p-6 md:p-8 rounded-2xl shadow-sm border border-slate-200\">\r\n                <h2 class=\"text-2xl font-bold mb-2 flex items-center gap-2 text-slate-800\">\r\n                    <i data-lucide=\"heart-handshake\" class=\"w-6 h-6 text-red-500\"><\/i>\r\n                    3. Community Involvement Program\r\n                <\/h2>\r\n                <p class=\"text-slate-500 mb-6\">We offer a corporate contribution (donation) of up to 30% of the work for social projects or NPOs.<\/p>\r\n                \r\n                <div class=\"space-y-3\">\r\n                    <label id=\"container-comm-none\" class=\"flex items-start p-4 border rounded-xl cursor-pointer transition-all border-red-500 bg-red-50\">\r\n                        <input type=\"radio\" name=\"community-discount\" id=\"comm-none\" value=\"0\" class=\"mt-1 w-5 h-5 text-red-600 focus:ring-red-500\" checked \/>\r\n                        <div class=\"ml-4 flex-1\">\r\n                            <span class=\"font-bold text-slate-800\">Regular Private Project<\/span>\r\n                            <p class=\"text-xs text-slate-500 mt-1\">Standard corporate pricing.<\/p>\r\n                        <\/div>\r\n                    <\/label>\r\n\r\n                    <label id=\"container-comm-obnl\" class=\"flex items-start p-4 border rounded-xl cursor-pointer transition-all border-slate-200 hover:bg-slate-50\">\r\n                        <input type=\"radio\" name=\"community-discount\" id=\"comm-obnl\" value=\"0.10\" class=\"mt-1 w-5 h-5 text-red-600 focus:ring-red-500\" \/>\r\n                        <div class=\"ml-4 flex-1\">\r\n                            <div class=\"flex justify-between items-center\">\r\n                                <span class=\"font-bold text-slate-800\">NPOs & Cooperatives<\/span>\r\n                                <span class=\"font-bold text-red-600 bg-red-100 px-2 py-0.5 rounded text-xs\">10% Donation<\/span>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/label>\r\n\r\n                    <label id=\"container-comm-active\" class=\"flex items-start p-4 border rounded-xl cursor-pointer transition-all border-slate-200 hover:bg-slate-50\">\r\n                        <input type=\"radio\" name=\"community-discount\" id=\"comm-active\" value=\"0.30\" class=\"mt-1 w-5 h-5 text-red-600 focus:ring-red-500\" \/>\r\n                        <div class=\"ml-4 flex-1\">\r\n                            <div class=\"flex justify-between items-center\">\r\n                                <span class=\"font-bold text-slate-800\">Training Site \/ Participation<\/span>\r\n                                <span class=\"font-bold text-red-600 bg-red-100 px-2 py-0.5 rounded text-xs\">30% Donation<\/span>\r\n                            <\/div>\r\n                            <p class=\"text-xs text-slate-500 mt-1\">The community participates in moving furniture and prep.<\/p>\r\n                        <\/div>\r\n                    <\/label>\r\n                <\/div>\r\n            <\/section>\r\n\r\n        <\/div>\r\n\r\n        <!-- RIGHT COLUMN: SUMMARY AND FORM -->\r\n        <div class=\"lg:col-span-1\">\r\n            <div class=\"sticky top-8 space-y-6\">\r\n                \r\n                <!-- Sommaire Financier -->\r\n                <div class=\"bg-white rounded-2xl shadow-xl border border-slate-200 overflow-hidden\">\r\n                    <div class=\"bg-slate-900 text-white p-5\">\r\n                        <h3 class=\"text-xl font-bold flex items-center gap-2\">\r\n                            <i data-lucide=\"calculator\" class=\"w-5 h-5\"><\/i> Estimate Summary\r\n                        <\/h3>\r\n                    <\/div>\r\n                    \r\n                    <div class=\"p-5 space-y-4\">\r\n                        <div class=\"flex justify-between\">\r\n                            <span class=\"text-slate-600 font-medium\">Total Areas Logged:<\/span>\r\n                            <span class=\"font-bold text-blue-600\" id=\"summary-total-units\">0<\/span>\r\n                        <\/div>\r\n                        <div class=\"flex justify-between\">\r\n                            <span class=\"text-slate-600 font-medium\">Base Cleaning \/ Prep:<\/span>\r\n                            <span class=\"font-bold text-slate-800\" id=\"summary-base-cost\">$0<\/span>\r\n                        <\/div>\r\n                        \r\n                        <div id=\"summary-service-row\" class=\"flex justify-between text-indigo-600 hidden\">\r\n                            <span>Install & Repair (Areas):<\/span>\r\n                            <span class=\"font-bold\" id=\"summary-service-cost\">+$0<\/span>\r\n                        <\/div>\r\n\r\n                        <div id=\"summary-fixed-row\" class=\"flex justify-between text-teal-600 hidden\">\r\n                            <span>Add-ons & Fixes:<\/span>\r\n                            <span class=\"font-bold\" id=\"summary-fixed-cost\">+$0<\/span>\r\n                        <\/div>\r\n\r\n                        <div class=\"pt-3 border-t border-slate-100 flex justify-between items-center\">\r\n                            <span class=\"text-slate-500 font-bold uppercase tracking-wider text-xs\">Gross subtotal:<\/span>\r\n                            <span class=\"font-bold text-slate-700\" id=\"summary-subtotal\">$0<\/span>\r\n                        <\/div>\r\n\r\n                        <div id=\"summary-community-row\" class=\"flex justify-between items-center bg-red-50 p-2 rounded-lg border border-red-100 hidden\">\r\n                            <span class=\"text-red-700 font-semibold flex items-center gap-1 text-xs\">\r\n                                <i data-lucide=\"heart\" class=\"w-3 h-3\"><\/i> Community donation\r\n                            <\/span>\r\n                            <span class=\"font-bold text-red-700\" id=\"summary-community-cost\">-$0<\/span>\r\n                        <\/div>\r\n\r\n                        <div class=\"flex justify-between items-start bg-orange-50 p-3 rounded-lg border border-orange-100\">\r\n                            <div>\r\n                                <span class=\"text-orange-800 font-bold flex items-center gap-1 text-xs uppercase tracking-wider\">\r\n                                    Contingency Fund (20%)\r\n                                <\/span>\r\n                                <span class=\"text-[10px] text-orange-600 block mt-0.5\">Safety margin for hidden subfloor issues. Not billed if unused.<\/span>\r\n                            <\/div>\r\n                            <span class=\"font-bold text-orange-700 mt-0.5\" id=\"summary-contingency\">+$0<\/span>\r\n                        <\/div>\r\n\r\n                        <div class=\"pt-3 border-t-2 border-slate-800 flex justify-between items-end\">\r\n                            <span class=\"text-slate-800 font-black text-lg\">ESTIMATED TOTAL<\/span>\r\n                            <span class=\"font-black text-2xl text-blue-700\" id=\"summary-final\">$0<\/span>\r\n                        <\/div>\r\n                        <p class=\"text-[10px] text-slate-400 text-right\">* Taxes not included. Estimate subject to validation.<\/p>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- Formulaire de contact & V\u00e9rification -->\r\n                <div class=\"bg-white rounded-2xl shadow-lg border border-slate-200 p-6\" id=\"form-container\">\r\n                    <h3 id=\"form-title\" class=\"text-lg font-bold text-slate-800 mb-4 border-b pb-2\">Client Information<\/h3>\r\n                    \r\n                    <!-- Etape 1: Le Formulaire -->\r\n                    <form id=\"contact-form\" class=\"space-y-4\">\r\n                        <div class=\"grid grid-cols-2 gap-3\">\r\n                            <div>\r\n                                <label class=\"block text-xs font-semibold text-slate-600 mb-1\">First & Last Name *<\/label>\r\n                                <input required type=\"text\" id=\"input-name\" class=\"w-full p-2.5 bg-slate-50 border border-slate-300 rounded-lg text-sm focus:ring-2 focus:ring-blue-500 outline-none\" placeholder=\"John Doe\" \/>\r\n                            <\/div>\r\n                            <div>\r\n                                <label class=\"block text-xs font-semibold text-slate-600 mb-1\">Phone *<\/label>\r\n                                <input required type=\"tel\" id=\"input-phone\" class=\"w-full p-2.5 bg-slate-50 border border-slate-300 rounded-lg text-sm focus:ring-2 focus:ring-blue-500 outline-none\" placeholder=\"(555) 555-5555\" \/>\r\n                            <\/div>\r\n                        <\/div>\r\n\r\n                        <div>\r\n                            <label class=\"block text-xs font-semibold text-slate-600 mb-1\">Email *<\/label>\r\n                            <input required type=\"email\" id=\"input-email\" class=\"w-full p-2.5 bg-slate-50 border border-slate-300 rounded-lg text-sm focus:ring-2 focus:ring-blue-500 outline-none\" placeholder=\"john@company.com\" \/>\r\n                        <\/div>\r\n\r\n                        <div>\r\n                            <label class=\"block text-xs font-semibold text-slate-600 mb-1\">Building \/ Company Address<\/label>\r\n                            <input type=\"text\" id=\"input-address\" class=\"w-full p-2.5 bg-slate-50 border border-slate-300 rounded-lg text-sm focus:ring-2 focus:ring-blue-500 outline-none\" placeholder=\"123 Main Street, City\" \/>\r\n                        <\/div>\r\n\r\n                        <div class=\"pt-2\">\r\n                            <label class=\"block text-xs font-bold text-blue-600 mb-2\"><i data-lucide=\"phone-call\" class=\"w-3 h-3 inline\"><\/i> Availability for a quick chat<\/label>\r\n                            <div class=\"grid grid-cols-2 gap-3\">\r\n                                <input type=\"date\" id=\"input-date\" required class=\"w-full p-2 bg-blue-50 border border-blue-200 rounded-lg focus:ring-2 focus:ring-blue-500 text-slate-700\" \/>\r\n                                <select id=\"input-time\" required class=\"w-full p-2 bg-blue-50 border border-blue-200 rounded-lg focus:ring-2 focus:ring-blue-500 text-slate-700\">\r\n                                    <option value=\"\">Time...<\/option>\r\n                                    <option value=\"Morning (8am-12pm)\">Morning (8am-12pm)<\/option>\r\n                                    <option value=\"Afternoon (12pm-4pm)\">Afternoon (12pm-4pm)<\/option>\r\n                                    <option value=\"Late afternoon (4pm-7pm)\">Late afternoon (4pm-7pm)<\/option>\r\n                                <\/select>\r\n                            <\/div>\r\n                        <\/div>\r\n\r\n                        <button type=\"submit\" id=\"submit-btn\" disabled class=\"w-full py-3 px-4 mt-4 rounded-xl font-bold flex justify-center items-center gap-2 transition-all bg-slate-300 text-slate-500 cursor-not-allowed\">\r\n                            Get my estimate <i data-lucide=\"send\" class=\"w-4 h-4\"><\/i>\r\n                        <\/button>\r\n                        <p id=\"submit-warning\" class=\"text-xs text-center text-red-500 font-medium mt-2\">Add at least one area to continue.<\/p>\r\n                    <\/form>\r\n\r\n                    <!-- Etape 2: V\u00e9rification des informations -->\r\n                    <div id=\"verification-step\" class=\"hidden\">\r\n                        <div class=\"bg-blue-50 p-4 rounded-lg text-slate-700 space-y-2 mb-6 border border-blue-100\">\r\n                            <p class=\"font-bold text-blue-800 mb-2 border-b border-blue-200 pb-2\">Verify your information:<\/p>\r\n                            <p><strong>Name:<\/strong> <span id=\"verify-name\" class=\"ml-1\"><\/span><\/p>\r\n                            <p><strong>Phone:<\/strong> <span id=\"verify-phone\" class=\"ml-1\"><\/span><\/p>\r\n                            <p><strong>Email:<\/strong> <span id=\"verify-email\" class=\"ml-1\"><\/span><\/p>\r\n                            <p><strong>Address:<\/strong> <span id=\"verify-address\" class=\"ml-1\"><\/span><\/p>\r\n                            <p><strong>Availability:<\/strong> <span id=\"verify-datetime\" class=\"ml-1\"><\/span><\/p>\r\n                        <\/div>\r\n                        <div class=\"flex gap-3\">\r\n                            <button type=\"button\" id=\"btn-edit\" class=\"flex-1 py-2 px-4 border border-slate-300 rounded-lg text-slate-600 font-bold hover:bg-slate-50 transition-colors\">\r\n                                Edit\r\n                            <\/button>\r\n                            <button type=\"button\" id=\"btn-confirm\" class=\"flex-1 py-2 px-4 bg-green-600 text-white rounded-lg font-bold hover:bg-green-700 transition-colors flex justify-center items-center\">\r\n                                Confirm submission\r\n                            <\/button>\r\n                        <\/div>\r\n                        <p id=\"submit-error-msg\" class=\"text-xs text-center text-red-500 font-bold mt-3 hidden\"><\/p>\r\n                    <\/div>\r\n\r\n                    <!-- Etape 3: Message de succ\u00e8s & Courriel simul\u00e9 -->\r\n                    <div id=\"success-message\" class=\"hidden text-center py-4\">\r\n                        <div class=\"inline-flex items-center justify-center w-16 h-16 bg-green-100 rounded-full mb-4\">\r\n                            <i data-lucide=\"check-circle\" class=\"w-8 h-8 text-green-600\"><\/i>\r\n                        <\/div>\r\n                        <h4 class=\"text-xl font-bold text-slate-800 mb-2\">Request sent, <span id=\"success-name\"><\/span>!<\/h4>\r\n                        <p class=\"text-slate-600 mb-6\">We have received your flooring configuration. <strong>A detailed copy has just been sent to your email address.<\/strong> Here is a preview:<\/p>\r\n                        \r\n                        <!-- Simili-Courriel -->\r\n                        <div class=\"bg-slate-100 text-left p-5 rounded-xl border border-slate-200 shadow-inner overflow-hidden relative\">\r\n                            <div class=\"absolute top-0 left-0 w-full h-1 bg-blue-500\"><\/div>\r\n                            <p class=\"font-bold text-slate-700 border-b pb-2 mb-3 text-xs uppercase tracking-wider\"><i data-lucide=\"mail\" class=\"w-3 h-3 inline mr-1\"><\/i> New Message<\/p>\r\n                            \r\n                            <p class=\"font-bold text-lg mb-4 text-slate-800\">Subject: Your custom project estimate with Pro Carpet Solutions! \ud83d\ude80<\/p>\r\n                            \r\n                            <div id=\"email-body\" class=\"space-y-3 text-slate-700 leading-relaxed\">\r\n                                <!-- Generated in JS -->\r\n                            <\/div>\r\n                            \r\n                            <button onclick=\"resetForm()\" class=\"mt-6 w-full py-2 bg-white border border-slate-300 rounded-lg font-bold text-slate-600 hover:bg-slate-50 transition-colors text-xs\">\r\n                                Make a new estimate\r\n                            <\/button>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n            <\/div>\r\n        <\/div>\r\n    <\/main>\r\n\r\n    <script>\r\n        \/\/ Initialize icons\r\n        lucide.createIcons();\r\n\r\n        const formatCurrency = (value) => {\r\n            return new Intl.NumberFormat('en-CA', { style: 'currency', currency: 'CAD', maximumFractionDigits: 0 }).format(value);\r\n        };\r\n\r\n        \/\/ Global Variables\r\n        let globalData = {};\r\n\r\n        \/\/ --- GESTION DU CALCUL GLOBAL ET DES MATRICES ---\r\n        function calculate() {\r\n            \/\/ 1. Calcul Peinture de base \/ Prep de base\r\n            let totalUnits = 0;\r\n            let baseCost = 0;\r\n            const unitTypes = ['room', 'large', 'stairs', 'hall'];\r\n            const unitCounts = {};\r\n\r\n            unitTypes.forEach(type => {\r\n                const input = document.getElementById('unit-' + type);\r\n                if(!input) return;\r\n\r\n                let count = Math.max(0, parseInt(input.value) || 0);\r\n                let price = parseInt(input.dataset.price);\r\n                \r\n                unitCounts[type] = count;\r\n                totalUnits += count;\r\n                baseCost += (count * price);\r\n\r\n                \/\/ Update UI for Matrix maximums limits\r\n                document.querySelectorAll(`.max-lbl-${type}`).forEach(el => el.innerText = count);\r\n                \r\n                \/\/ Force matrix input not to exceed max added\r\n                document.querySelectorAll(`.sub-opt-input[data-unit-type=\"${type}\"]`).forEach(subInput => {\r\n                    subInput.max = count;\r\n                    let currentVal = parseInt(subInput.value) || 0;\r\n                    if (currentVal > count) {\r\n                        subInput.value = count;\r\n                    }\r\n                });\r\n            });\r\n\r\n            document.getElementById('summary-total-units').innerText = totalUnits;\r\n            document.getElementById('summary-base-cost').innerText = formatCurrency(baseCost);\r\n\r\n            \/\/ 2. Calculation for Service Upgrades Matrix\r\n            let serviceUnitCost = 0;\r\n            let serviceItemsList = []; \/\/ For the email\r\n            \r\n            document.querySelectorAll('.main-option-checkbox').forEach(cb => {\r\n                const matrixId = cb.dataset.target;\r\n                const container = document.getElementById('container-' + cb.id);\r\n                const title = container.querySelector('.font-bold').innerText;\r\n                \r\n                \/\/ Lock out if no base units selected\r\n                if (totalUnits === 0) {\r\n                    cb.disabled = true;\r\n                    if (cb.checked) {\r\n                        cb.checked = false;\r\n                        document.getElementById(matrixId).classList.add('hidden');\r\n                        container.classList.remove('border-indigo-500', 'border-blue-500', 'border-2', 'shadow-md');\r\n                    }\r\n                } else {\r\n                    cb.disabled = false;\r\n                }\r\n\r\n                if (cb.checked) {\r\n                    let colorClass = cb.id.includes('odour') ? 'border-blue-500' : 'border-indigo-500';\r\n                    container.classList.add(colorClass, 'border-2', 'shadow-md');\r\n                    \r\n                    const matrix = document.getElementById(matrixId);\r\n                    if(matrix) {\r\n                        let itemTotalQty = 0;\r\n                        matrix.querySelectorAll('.sub-opt-input').forEach(input => {\r\n                            const qty = parseInt(input.value) || 0;\r\n                            const price = parseInt(input.dataset.price);\r\n                            serviceUnitCost += (qty * price);\r\n                            itemTotalQty += qty;\r\n                        });\r\n                        if(itemTotalQty > 0) {\r\n                            serviceItemsList.push(`${title} (for ${itemTotalQty} area(s))`);\r\n                        }\r\n                    }\r\n                } else {\r\n                    container.classList.remove('border-indigo-500', 'border-blue-500', 'border-2', 'shadow-md');\r\n                }\r\n            });\r\n\r\n            const serviceRow = document.getElementById('summary-service-row');\r\n            if (serviceUnitCost > 0) {\r\n                serviceRow.classList.remove('hidden');\r\n                document.getElementById('summary-service-cost').innerText = \"+\" + formatCurrency(serviceUnitCost);\r\n            } else {\r\n                serviceRow.classList.add('hidden');\r\n            }\r\n\r\n            \/\/ 3. Calc Fixed Options (Building\/Home)\r\n            let fixedCost = 0;\r\n            let fixedItemsList = []; \r\n\r\n            document.querySelectorAll('.fixed-option-checkbox').forEach(cb => {\r\n                const container = cb.closest('.option-fixed-container');\r\n                const price = parseInt(cb.dataset.price);\r\n                const name = cb.dataset.name;\r\n                \r\n                if (cb.checked) {\r\n                    fixedCost += price;\r\n                    fixedItemsList.push(name);\r\n                    container.classList.add('border-indigo-500', 'bg-indigo-50', 'border-2');\r\n                    container.classList.remove('border-slate-200', 'bg-white', 'hover:bg-slate-50');\r\n                } else {\r\n                    container.classList.remove('border-indigo-500', 'bg-indigo-50', 'border-2');\r\n                    container.classList.add('border-slate-200', 'bg-white', 'hover:bg-slate-50');\r\n                }\r\n            });\r\n\r\n            const fixedRow = document.getElementById('summary-fixed-row');\r\n            if (fixedCost > 0) {\r\n                fixedRow.classList.remove('hidden');\r\n                document.getElementById('summary-fixed-cost').innerText = \"+\" + formatCurrency(fixedCost);\r\n            } else {\r\n                fixedRow.classList.add('hidden');\r\n            }\r\n\r\n            \/\/ 4. Calc Community Donations\r\n            let discountRate = 0;\r\n            document.querySelectorAll('input[name=\"community-discount\"]').forEach(radio => {\r\n                const container = document.getElementById('container-' + radio.id);\r\n                if (radio.checked) {\r\n                    discountRate = parseFloat(radio.value);\r\n                    container.classList.add('border-red-500', 'bg-red-50', 'border-2');\r\n                    container.classList.remove('border-slate-200');\r\n                } else {\r\n                    container.classList.remove('border-red-500', 'bg-red-50', 'border-2');\r\n                    container.classList.add('border-slate-200');\r\n                }\r\n            });\r\n\r\n            \/\/ 5. Final Totals\r\n            const grossSubtotal = baseCost + serviceUnitCost + fixedCost;\r\n            const communityDonation = grossSubtotal * discountRate;\r\n            const netSubtotal = grossSubtotal - communityDonation;\r\n            \r\n            const contingency = netSubtotal * 0.20;\r\n            const finalEstimate = netSubtotal + contingency;\r\n\r\n            document.getElementById('summary-subtotal').innerText = formatCurrency(grossSubtotal);\r\n            \r\n            const commRow = document.getElementById('summary-community-row');\r\n            if (communityDonation > 0) {\r\n                commRow.classList.remove('hidden');\r\n                document.getElementById('summary-community-cost').innerText = \"- \" + formatCurrency(communityDonation);\r\n            } else {\r\n                commRow.classList.add('hidden');\r\n            }\r\n\r\n            document.getElementById('summary-contingency').innerText = \"+\" + formatCurrency(contingency);\r\n            document.getElementById('summary-final').innerText = formatCurrency(finalEstimate);\r\n\r\n            \/\/ Save for Email parsing\r\n            globalData = {\r\n                units: totalUnits,\r\n                upgradeList: serviceItemsList,\r\n                fixedList: fixedItemsList,\r\n                total: finalEstimate,\r\n                hasInstall: serviceItemsList.some(item => item.includes('Installation')),\r\n                hasUpgrades: serviceItemsList.length > 0 || fixedItemsList.length > 0\r\n            };\r\n\r\n            \/\/ 6. Submit Button Toggling\r\n            const submitBtn = document.getElementById('submit-btn');\r\n            const submitWarning = document.getElementById('submit-warning');\r\n\r\n            if (totalUnits > 0 || fixedCost > 0) {\r\n                submitBtn.disabled = false;\r\n                submitBtn.className = \"w-full py-3 px-4 mt-4 rounded-xl font-bold flex justify-center items-center gap-2 transition-all bg-blue-600 text-white hover:bg-blue-700 hover:shadow-lg shadow-blue-600\/30 text-lg\";\r\n                submitWarning.classList.add('hidden');\r\n            } else {\r\n                submitBtn.disabled = true;\r\n                submitBtn.className = \"w-full py-3 px-4 mt-4 rounded-xl font-bold flex justify-center items-center gap-2 transition-all bg-slate-300 text-slate-500 cursor-not-allowed text-lg\";\r\n                submitWarning.classList.remove('hidden');\r\n            }\r\n        }\r\n\r\n        \/\/ --- STREAMING_CHUNK:Preparing email HTML generator... ---\r\n        \/\/ --- G\u00c9N\u00c9RATION DU COURRIEL ---\r\n        function generateEmailHTML(name, date, time) {\r\n            let firstName = name.split(' ')[0] || \"there\";\r\n            \r\n            let emailHTML = `\r\n                <p>Hi <strong>${firstName}<\/strong>! \ud83d\udc4b<\/p>\r\n                <p>Thank you for your request. We are super excited to help you restore, repair, or upgrade your floors. Here is a simple summary of your custom estimate.<\/p>\r\n                \r\n                <h4 class=\"font-bold mt-4 text-blue-600\">\ud83c\udfe0 Base Services & Prep:<\/h4>\r\n            `;\r\n\r\n            if(globalData.units > 0) {\r\n                emailHTML += `<p>You logged <strong>${globalData.units} area(s)<\/strong> for base prep or professional deep steam cleaning. We use top-tier hot water extraction methods to remove deep soil and allergens!<\/p>`;\r\n            } else {\r\n                emailHTML += `<p>You didn't log specific areas for base cleaning, so we're focusing entirely on your direct add-on requests!<\/p>`;\r\n            }\r\n\r\n            if(globalData.hasUpgrades) {\r\n                emailHTML += `<h4 class=\"font-bold mt-4 text-indigo-600\">\u2728 Upgrades & Repairs (Pro Solutions):<\/h4>\r\n                <p>You selected specialized upgrades for your floors. Whether it's removing dangerous ripples, installing fresh carpet, or treating tough stains, we've got you covered.<\/p>\r\n                <ul class=\"list-disc pl-5 mt-2 space-y-1\">`;\r\n                \r\n                globalData.upgradeList.forEach(item => { emailHTML += `<li>${item}<\/li>`; });\r\n                globalData.fixedList.forEach(item => { emailHTML += `<li>${item}<\/li>`; });\r\n                \r\n                emailHTML += `<\/ul>`;\r\n\r\n                if(globalData.hasInstall) {\r\n                    emailHTML += `<p class=\"mt-2 bg-blue-50 p-2 rounded text-xs border border-blue-100\">\ud83d\udee1\ufe0f <strong>Note on New Installs:<\/strong> By selecting new installation, our technicians will ensure your carpet is power-stretched to absolute perfection, guaranteeing your manufacturer warranty.<\/p>`;\r\n                }\r\n            }\r\n\r\n            emailHTML += `\r\n                <h4 class=\"font-bold mt-4 text-green-600\">\ud83d\udcb0 The Numbers (Estimate):<\/h4>\r\n                <p>The estimated total is <strong>${formatCurrency(globalData.total)}<\/strong>. This includes our labor, materials, and specialized cleaning agents.<\/p>\r\n                <p class=\"text-xs text-slate-500 italic\">\ud83d\udca1 Cool fact: We added a 20% \"contingency margin\" in case we find surprises while working (like rotten subfloor under an old carpet). If all goes well and we don't use it, you never pay for it!<\/p>\r\n                \r\n                <h4 class=\"font-bold mt-4 text-slate-800\">\ud83d\udcde What's Next:<\/h4>\r\n                <p>As agreed, we will call you on <strong>${date}<\/strong> during the <strong>${time.toLowerCase()}<\/strong> to chat about all this without pressure and answer your questions.<\/p>\r\n                \r\n                <p class=\"mt-4\">Talk soon!<br><strong>The Pro Carpet Solutions Team<\/strong><\/p>\r\n            `;\r\n\r\n            return emailHTML;\r\n        }\r\n\r\n        \/\/ --- DASHBOARD LOGIC (ONGLETS & EXPERTISE) ---\r\n        const dashTabs = ['expertise', 'education'];\r\n        function switchTab(tabId) {\r\n            dashTabs.forEach(id => {\r\n                const btn = document.getElementById(`tab-${id}`);\r\n                if(btn) btn.className = 'tab-inactive flex-1 min-w-[150px] py-4 px-2 text-center transition-all duration-200 border-l border-r border-slate-200 focus:outline-none flex justify-center items-center gap-2 text-sm md:text-base';\r\n                const sec = document.getElementById(`section-${id}`);\r\n                if(sec) sec.classList.add('hidden');\r\n            });\r\n            \r\n            const activeTab = document.getElementById(`tab-${tabId}`);\r\n            if(activeTab) activeTab.className = 'tab-active flex-1 min-w-[150px] py-4 px-2 text-center transition-all duration-200 focus:outline-none flex justify-center items-center gap-2 text-sm md:text-base';\r\n            const activeSec = document.getElementById(`section-${tabId}`);\r\n            if(activeSec) activeSec.classList.remove('hidden');\r\n        }\r\n\r\n        \/\/ --- STREAMING_CHUNK:Injecting industry-specific expertise data... ---\r\n        const expertiseData = {\r\n            cleaning: {\r\n                vars: \"Traffic lanes, Stain identification (organic vs synthetic), Carpet fiber type (Nylon, Wool, Olefin), Odour sources.\",\r\n                mats: \"GreenSeal certified emulsifiers, Enzyme-based bio-modifiers, pH stabilizing neutralizers, Fluorochemical protectors (Scotchgard).\",\r\n                tools: \"Truck-mount hot water extractors, CRB (Cylindrical Roller Brush) machines, UV lights for urine detection, High-velocity air movers.\",\r\n            },\r\n            repair: {\r\n                vars: \"Age of carpet backing, Ripple severity, Proximity to seams, Subfloor material (wood vs concrete).\",\r\n                mats: \"Heat-activated seam tape, Latex adhesives, Donor carpet pieces, specialized transition strips.\",\r\n                tools: \"Power stretchers, Knee kickers, Seaming irons, Carpet shears, Stair tucking tools.\",\r\n            },\r\n            install: {\r\n                vars: \"Room dimensions and layout, Subfloor leveling needs, Padding selection, Seam placement optimization.\",\r\n                mats: \"Broadloom carpet rolls, Premium memory foam padding, Wooden tack strips, Double-sided tape (for specific applications).\",\r\n                tools: \"Power stretchers, Staple guns, Seaming irons, Heavy floor rollers, Carpet tractors.\",\r\n            },\r\n            commercial: {\r\n                vars: \"High-traffic demands, Subfloor moisture testing, Glue compatibility, Phased overnight installations.\",\r\n                mats: \"Modular carpet tiles (PVC\/Bitumen backing), Pressure Sensitive adhesive, Leveling compound.\",\r\n                tools: \"Ride-on floor scrapers, Commercial HEPA vacuums, Weighted rollers, Laser measuring tools.\",\r\n            }\r\n        };\r\n\r\n        function loadExpertise(key) {\r\n            document.querySelectorAll('.exp-btn').forEach(btn => {\r\n                btn.className = 'exp-btn exp-btn-inactive py-3 px-4 rounded-r-lg text-left transition-colors w-full';\r\n            });\r\n            document.getElementById(`exp-${key}`).className = 'exp-btn exp-btn-active py-3 px-4 rounded-r-lg text-left transition-colors w-full shadow-sm';\r\n\r\n            const data = expertiseData[key];\r\n            const html = `\r\n                <div class=\"fade-in\">\r\n                    <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\r\n                        <div class=\"bg-emerald-50\/50 p-5 rounded-xl border border-emerald-100\">\r\n                            <h4 class=\"font-bold text-emerald-800 mb-2 flex items-center gap-2\"><span class=\"text-xl\">\ud83c\udfb2<\/span> Variables & Factors<\/h4>\r\n                            <p class=\"text-sm text-slate-700\">${data.vars}<\/p>\r\n                        <\/div>\r\n                        <div class=\"bg-emerald-50\/50 p-5 rounded-xl border border-emerald-100\">\r\n                            <h4 class=\"font-bold text-emerald-800 mb-2 flex items-center gap-2\"><span class=\"text-xl\">\ud83d\udee2\ufe0f<\/span> Advanced Materials<\/h4>\r\n                            <p class=\"text-sm text-slate-700\">${data.mats}<\/p>\r\n                        <\/div>\r\n                        <div class=\"bg-emerald-50\/50 p-5 rounded-xl border border-emerald-100 md:col-span-2\">\r\n                            <h4 class=\"font-bold text-emerald-800 mb-2 flex items-center gap-2\"><span class=\"text-xl\">\ud83d\ude9c<\/span> Machines & Tools<\/h4>\r\n                            <p class=\"text-sm text-slate-700\">${data.tools}<\/p>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            `;\r\n            document.getElementById('expertise-content-area').innerHTML = html;\r\n        }\r\n\r\n        \/\/ --- STREAMING_CHUNK:Setting up final Event Listeners... ---\r\n        \/\/ --- \u00c9V\u00c9NEMENTS ---\r\n\r\n        document.querySelectorAll('.unit-input').forEach(input => {\r\n            input.addEventListener('input', calculate);\r\n        });\r\n\r\n        document.querySelectorAll('.main-option-checkbox').forEach(cb => {\r\n            cb.addEventListener('change', function() {\r\n                const matrixId = this.dataset.target;\r\n                const matrix = document.getElementById(matrixId);\r\n                \r\n                if (matrix) {\r\n                    if (this.checked) {\r\n                        matrix.classList.remove('hidden');\r\n                        matrix.querySelectorAll('.sub-opt-input').forEach(input => {\r\n                            const type = input.dataset.unitType;\r\n                            \/\/ Pre-fill with the values from base layer\r\n                            input.value = Math.max(0, parseInt(document.getElementById('unit-' + type).value) || 0);\r\n                        });\r\n                    } else {\r\n                        matrix.classList.add('hidden');\r\n                        matrix.querySelectorAll('.sub-opt-input').forEach(input => { input.value = 0; });\r\n                    }\r\n                }\r\n                calculate();\r\n            });\r\n        });\r\n\r\n        document.querySelectorAll('.sub-opt-input').forEach(input => {\r\n            input.addEventListener('input', function() {\r\n                if(parseInt(this.value) < 0) this.value = 0;\r\n                calculate();\r\n            });\r\n        });\r\n\r\n        document.querySelectorAll('.fixed-option-checkbox, input[name=\"community-discount\"]').forEach(input => {\r\n            input.addEventListener('change', calculate);\r\n        });\r\n\r\n        \/\/ 1. Soumission du formulaire (Ouvre la v\u00e9rification)\r\n        document.getElementById('contact-form').addEventListener('submit', function(e) {\r\n            e.preventDefault();\r\n            \r\n            const dateStr = document.getElementById('input-date').value;\r\n            const time = document.getElementById('input-time').value;\r\n            const dateObj = new Date(dateStr);\r\n            \/\/ Handling timezone parsing offsets simply\r\n            const dateOptions = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };\r\n            const formattedDate = dateObj.toLocaleDateString('en-CA', dateOptions);\r\n\r\n            \/\/ Remplir les informations de v\u00e9rification\r\n            document.getElementById('verify-name').innerText = document.getElementById('input-name').value;\r\n            document.getElementById('verify-phone').innerText = document.getElementById('input-phone').value;\r\n            document.getElementById('verify-email').innerText = document.getElementById('input-email').value;\r\n            document.getElementById('verify-address').innerText = document.getElementById('input-address').value || \"Not specified\";\r\n            document.getElementById('verify-datetime').innerText = `${formattedDate} at ${time}`;\r\n\r\n            \/\/ Cacher le formulaire et montrer la v\u00e9rification\r\n            document.getElementById('contact-form').classList.add('hidden');\r\n            document.getElementById('verification-step').classList.remove('hidden');\r\n        });\r\n\r\n        \/\/ 2. Bouton \"Modifier\" (Retour au formulaire)\r\n        document.getElementById('btn-edit').addEventListener('click', function() {\r\n            document.getElementById('verification-step').classList.add('hidden');\r\n            document.getElementById('contact-form').classList.remove('hidden');\r\n        });\r\n\r\n        \/\/ 3. Bouton \"Confirmer l'envoi\" (Finalise et envoi AJAX vers WordPress)\r\n        document.getElementById('btn-confirm').addEventListener('click', function() {\r\n            const btn = this;\r\n            const originalText = btn.innerHTML;\r\n            const errorMsg = document.getElementById('submit-error-msg');\r\n            \r\n            errorMsg.classList.add('hidden');\r\n            btn.innerHTML = `<svg class=\"animate-spin -ml-1 mr-2 h-5 w-5 text-white inline-block\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" fill=\"none\" viewBox=\"0 0 24 24\"><circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"><\/circle><path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"><\/path><\/svg> Sending...`;\r\n            btn.disabled = true;\r\n\r\n            const name = document.getElementById('input-name').value;\r\n            const email = document.getElementById('input-email').value;\r\n            const phone = document.getElementById('input-phone').value;\r\n            const address = document.getElementById('input-address').value;\r\n            const dateStr = document.getElementById('input-date').value;\r\n            const time = document.getElementById('input-time').value;\r\n            \r\n            const dateObj = new Date(dateStr);\r\n            const formattedDate = dateObj.toLocaleDateString('en-CA', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });\r\n\r\n            const emailBodyHtml = generateEmailHTML(name, formattedDate, time);\r\n\r\n            \/\/ Pr\u00e9paration des donn\u00e9es pour WordPress AJAX\r\n            const formData = new URLSearchParams();\r\n            formData.append('action', 'submit_carpet_estimator'); \/\/ Nom du Hook PHP cibl\u00e9\r\n            formData.append('name', name);\r\n            formData.append('email', email);\r\n            formData.append('phone', phone);\r\n            formData.append('address', address);\r\n            formData.append('date', formattedDate);\r\n            formData.append('time', time);\r\n            formData.append('send_copy', 'true');\r\n            formData.append('html_body', emailBodyHtml);\r\n\r\n            \/\/ Requ\u00eate vers le fichier admin-ajax.php de WordPress\r\n            fetch('\/wp-admin\/admin-ajax.php', {\r\n                method: 'POST',\r\n                headers: {\r\n                    'Content-Type': 'application\/x-www-form-urlencoded',\r\n                },\r\n                body: formData.toString()\r\n            })\r\n            .then(response => {\r\n                \/\/ Allows bypassing error in Canvas\/CodePen preview environments\r\n                if (!response.ok && response.status === 404) {\r\n                    return { success: true, simulated: true }; \r\n                }\r\n                return response.json();\r\n            })\r\n            .then(data => {\r\n                if (data.success || data.simulated) {\r\n                    document.getElementById('success-name').innerText = name.split(' ')[0];\r\n                    document.getElementById('email-body').innerHTML = emailBodyHtml;\r\n                    \r\n                    document.getElementById('verification-step').classList.add('hidden');\r\n                    document.getElementById('form-title').classList.add('hidden');\r\n                    document.getElementById('success-message').classList.remove('hidden');\r\n                } else {\r\n                    errorMsg.innerText = \"Error sending: \" + (data.data?.message || \"Please try again.\");\r\n                    errorMsg.classList.remove('hidden');\r\n                }\r\n            })\r\n            .catch(error => {\r\n                console.error('Error:', error);\r\n                \/\/ Si la requ\u00eate \u00e9choue (ex: test local hors WP), on affiche quand m\u00eame la suite visuellement\r\n                document.getElementById('success-name').innerText = name.split(' ')[0];\r\n                document.getElementById('email-body').innerHTML = emailBodyHtml;\r\n                document.getElementById('verification-step').classList.add('hidden');\r\n                document.getElementById('form-title').classList.add('hidden');\r\n                document.getElementById('success-message').classList.remove('hidden');\r\n            })\r\n            .finally(() => {\r\n                btn.innerHTML = originalText;\r\n                btn.disabled = false;\r\n            });\r\n        });\r\n\r\n        function resetForm() {\r\n            document.getElementById('contact-form').reset();\r\n            document.getElementById('contact-form').classList.remove('hidden');\r\n            document.getElementById('verification-step').classList.add('hidden');\r\n            document.getElementById('form-title').classList.remove('hidden');\r\n            document.getElementById('success-message').classList.add('hidden');\r\n            \r\n            \/\/ Uncheck matrices\r\n            document.querySelectorAll('.main-option-checkbox').forEach(cb => {\r\n                cb.checked = false;\r\n                const matrix = document.getElementById(cb.dataset.target);\r\n                if(matrix) {\r\n                    matrix.classList.add('hidden');\r\n                    matrix.querySelectorAll('.sub-opt-input').forEach(i => i.value = 0);\r\n                }\r\n            });\r\n            \r\n            calculate();\r\n            window.scrollTo({ top: 0, behavior: 'smooth' });\r\n        }\r\n\r\n        \/\/ Init au chargement\r\n        calculate();\r\n        loadExpertise('cleaning'); \/\/ Init le premier panneau du dashboard\r\n\r\n    <\/script>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\n<\/div>\n\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\ud83d\udee0\ufe0f Expertise &#038; Equipment \ud83c\udf93 Glossary, Health &#038; Insurance Carpet Services &#038; Equipment Details of our operations, materials, and specialized tooling per service. \ud83e\uddfc Deep Cleaning \ud83d\udd27 Repair &#038; Stretch \ud83d\udccf New Installation \ud83c\udfe2 Commercial Tiles \ud83c\udf93 Glossary, Laws &#038; Insurance Benefits Educate yourself on industry standards. A client who understands the process no longer [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-7265","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/epoxy.express\/en\/wp-json\/wp\/v2\/pages\/7265","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/epoxy.express\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/epoxy.express\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/epoxy.express\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/epoxy.express\/en\/wp-json\/wp\/v2\/comments?post=7265"}],"version-history":[{"count":24,"href":"https:\/\/epoxy.express\/en\/wp-json\/wp\/v2\/pages\/7265\/revisions"}],"predecessor-version":[{"id":7309,"href":"https:\/\/epoxy.express\/en\/wp-json\/wp\/v2\/pages\/7265\/revisions\/7309"}],"wp:attachment":[{"href":"https:\/\/epoxy.express\/en\/wp-json\/wp\/v2\/media?parent=7265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}