

{"id":1094,"date":"2025-01-11T11:25:28","date_gmt":"2025-01-11T10:25:28","guid":{"rendered":"https:\/\/alaska-france.fr\/boutique\/?page_id=1094"},"modified":"2025-12-18T17:28:02","modified_gmt":"2025-12-18T16:28:02","slug":"demande-devis","status":"publish","type":"page","link":"https:\/\/alaska-france.fr\/boutique\/demande-devis\/","title":{"rendered":"demande-devis"},"content":{"rendered":"    <style>\n        :root {\n            --wcdevis-primary-color: #0d74ba;\n            --wcdevis-primary-dark-color: #0A58CA;\n            --wcdevis-success-color: #198754;\n            --wcdevis-danger-color: #dc3545;\n            --wcdevis-warning-color: #fff3cd;\n            --wcdevis-light-bg-color: #f8f9fa;\n            --wcdevis-soft-bg-color: #f4f7fb;\n            --wcdevis-border-color: #dee2e6;\n            --wcdevis-border-strong: rgba(26, 42, 58, 0.14);\n            --wcdevis-text-color: #212529;\n            --wcdevis-text-light-color: #6c757d;\n            --wcdevis-font-family: &#039;Roboto&#039;, sans-serif;\n            --wcdevis-border-radius: 12px;\n            --wcdevis-border-radius-lg: 18px;\n            --wcdevis-shadow: 0 18px 45px rgba(14, 24, 39, 0.08);\n            --wcdevis-shadow-soft: 0 10px 26px rgba(14, 24, 39, 0.06);\n        }\n        \n        \/* Base Container *\/\n        .wcdevis-main-container {\n            font-family: var(--wcdevis-font-family);\n            font-size: 1em;\n            max-width: 980px;\n            width: 100%;\n            margin: 34px auto;\n            background:\n                radial-gradient(circle at top right, rgba(13,110,253,.06), transparent 260px),\n                linear-gradient(180deg, #ffffff 0%, #fbfcfe 100%);\n            border: 1px solid rgba(26,42,58,.08);\n            border-radius: 28px;\n            box-shadow: var(--wcdevis-shadow);\n            padding: 2.2em;\n            box-sizing: border-box;\n            position: relative;\n            overflow: hidden;\n        }\n        .wcdevis-main-container * {\n            box-sizing: border-box;\n        }\n        .wcdevis-main-container::before {\n            content: '';\n            position: absolute;\n            inset: 0 auto auto 0;\n            width: 100%;\n            height: 6px;\n            background: linear-gradient(90deg, var(--wcdevis-primary-color), #65a8ff);\n        }\n\n        \/* Hero Section *\/\n        .wcdevis-form-hero {\n            display: grid;\n            grid-template-columns: minmax(0, 1.45fr) minmax(260px, .95fr);\n            gap: 18px;\n            align-items: stretch;\n            margin: 0 0 24px;\n        }\n        .wcdevis-hero-card,\n        .wcdevis-hero-side {\n            background: #fff;\n            border: 1px solid var(--wcdevis-border-color);\n            border-radius: 22px;\n            box-shadow: var(--wcdevis-shadow-soft);\n        }\n        .wcdevis-hero-card {\n            padding: 22px 22px 18px;\n            position: relative;\n            overflow: hidden;\n        }\n        .wcdevis-hero-card::after {\n            content: '';\n            position: absolute;\n            top: -40px;\n            right: -40px;\n            width: 160px;\n            height: 160px;\n            border-radius: 50%;\n            background: radial-gradient(circle, rgba(13,110,253,.12) 0%, rgba(13,110,253,0) 70%);\n            pointer-events: none;\n        }\n        .wcdevis-eyebrow {\n            display: inline-flex;\n            align-items: center;\n            gap: 8px;\n            padding: 7px 12px;\n            border-radius: 999px;\n            background: rgba(13,110,253,.08);\n            color: var(--wcdevis-primary-color);\n            font-size: .88em;\n            font-weight: 700;\n            margin-bottom: 12px;\n        }\n        .wcdevis-hero-card h1 {\n            margin: 0 0 12px;\n            font-size: 1.45em;\n            font-weight: 700;\n            line-height: 1.25;\n            color: var(--wcdevis-text-color);\n        }\n        .wcdevis-hero-card p {\n            margin: 0 0 10px;\n            color: var(--wcdevis-text-color);\n            line-height: 1.6;\n            font-size: 1em;\n        }\n        .wcdevis-hero-card p:last-child {\n            margin-bottom: 0;\n        }\n        .wcdevis-hero-side {\n            padding: 18px;\n            display: flex;\n            flex-direction: column;\n            gap: 14px;\n            justify-content: center;\n        }\n        .wcdevis-side-title {\n            font-size: .9em;\n            font-weight: 700;\n            letter-spacing: .02em;\n            text-transform: uppercase;\n            color: var(--wcdevis-text-light-color);\n        }\n        .wcdevis-progress-bar {\n            width: 100%;\n            height: 10px;\n            border-radius: 999px;\n            background: #edf2f7;\n            overflow: hidden;\n        }\n        .wcdevis-progress-bar span {\n            display: block;\n            width: 0;\n            height: 100%;\n            border-radius: inherit;\n            background: linear-gradient(90deg, var(--wcdevis-primary-color), #76b4ff);\n            transition: width .25s ease;\n        }\n        .wcdevis-progress-label {\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n            gap: 10px;\n            font-size: .95em;\n            color: var(--wcdevis-text-light-color);\n        }\n        .wcdevis-progress-label strong {\n            color: var(--wcdevis-text-color);\n        }\n\n        \/* Step Chips *\/\n        .wcdevis-step-chips {\n            display: grid;\n            grid-template-columns: repeat(4, minmax(0, 1fr));\n            gap: 10px;\n            margin: 0 0 24px;\n        }\n        .wcdevis-step-chip {\n            display: flex;\n            align-items: center;\n            gap: 10px;\n            padding: 12px 14px;\n            border: 1px solid var(--wcdevis-border-color);\n            border-radius: 16px;\n            background: #fff;\n            color: var(--wcdevis-text-light-color);\n            font-size: .92em;\n            transition: .2s ease;\n            box-shadow: 0 6px 18px rgba(18, 35, 52, 0.04);\n        }\n        .wcdevis-step-chip strong {\n            color: var(--wcdevis-text-color);\n            display: block;\n            font-size: .98em;\n        }\n        .wcdevis-step-chip i {\n            width: 36px;\n            height: 36px;\n            border-radius: 50%;\n            display: inline-flex;\n            align-items: center;\n            justify-content: center;\n            background: var(--wcdevis-soft-bg-color);\n            color: var(--wcdevis-primary-color);\n            flex: 0 0 auto;\n        }\n        .wcdevis-step-chip.is-active {\n            border-color: rgba(13,110,253,.4);\n            background: linear-gradient(180deg, rgba(13,110,253,.08), rgba(13,110,253,.02));\n            transform: translateY(-1px);\n        }\n        .wcdevis-step-chip.is-complete {\n            border-color: rgba(25,135,84,.22);\n            background: rgba(25,135,84,.06);\n        }\n        .wcdevis-step-chip.is-complete i {\n            background: rgba(25,135,84,.12);\n            color: var(--wcdevis-success-color);\n        }\n\n        \/* General UI Elements *\/\n        .wcdevis-items-preview,\n        .wcdevis-request-type-selector label,\n        .wcdevis-modern-form section {\n            background: rgba(255,255,255,.94);\n            border: 1px solid var(--wcdevis-border-color);\n            box-shadow: 0 10px 28px rgba(16, 31, 46, .04);\n            border-radius: 22px;\n        }\n        .wcdevis-items-preview {\n            margin-bottom: 1.6em;\n            padding: 1.2em;\n            border-radius: 18px;\n        }\n        .wcdevis-items-preview h3 {\n            margin: 0 0 .65em;\n            font-size: 1.04em;\n        }\n        .devis-table { width:100%; border-collapse:collapse; }\n        .devis-table th, .devis-table td { text-align:left; padding:.8em .7em; border-bottom:1px solid var(--wcdevis-border-color); }\n        .devis-table button.remove-from-devis { background:0 0; border:none; color:var(--wcdevis-danger-color); cursor:pointer; font-size:1.2em; }\n        \n        .wcdevis-request-type-selector {\n            display:flex;\n            gap:1em;\n            margin-bottom:1.35em;\n        }\n        .wcdevis-request-type-selector label {\n            flex:1;\n            padding:1.15em;\n            border-radius:18px;\n            cursor:pointer;\n            text-align:center;\n            transition: all .22s ease;\n            position: relative;\n            overflow: hidden;\n        }\n        .wcdevis-request-type-selector label::before {\n            content: '';\n            position: absolute;\n            inset: 0 0 auto 0;\n            height: 4px;\n            background: transparent;\n            transition: background .2s ease;\n        }\n        .wcdevis-request-type-selector label:hover { transform:translateY(-2px); }\n        .wcdevis-request-type-selector label.active {\n            border-color:var(--wcdevis-primary-color);\n            background-color:#fff;\n            box-shadow: inset 0 0 0 1px rgba(13, 110, 253, .15), 0 16px 32px rgba(13,110,253,.08);\n        }\n        .wcdevis-request-type-selector label.active::before {\n            background: linear-gradient(90deg, var(--wcdevis-primary-color), #7ab6ff);\n        }\n        .wcdevis-request-type-selector input[type=radio] { display:none; }\n\n        .wcdevis-inline-note {\n            display: flex;\n            align-items: flex-start;\n            gap: 10px;\n            margin: 0 0 16px;\n            padding: 12px 14px;\n            border-radius: 14px;\n            border: 1px solid rgba(13,110,253,.14);\n            background: linear-gradient(180deg, rgba(13,110,253,.08), rgba(13,110,253,.03));\n            color: var(--wcdevis-text-color);\n            font-size: .95em;\n            line-height: 1.45;\n        }\n        .wcdevis-inline-note i { margin-top: 2px; color: var(--wcdevis-primary-color); }\n        .wcdevis-inline-note strong { color: var(--wcdevis-primary-color); }\n        .wcdevis-inline-note.is-warning {\n            border-color: rgba(255,193,7,.35);\n            background: linear-gradient(180deg, rgba(255,243,205,.85), rgba(255,248,231,.9));\n        }\n        .wcdevis-inline-note.is-warning i,\n        .wcdevis-inline-note.is-warning strong { color: #8a6d1d; }\n\n        \/* Form Sections *\/\n        .wcdevis-modern-form section {\n            margin-bottom: 1.15em;\n            padding: 1.2em 1.2em 1.1em;\n        }\n        .wcdevis-modern-form section:last-of-type { border-bottom:none; }\n        .wcdevis-modern-form h2 {\n            font-size: 1.25em;\n            margin-bottom: .95em;\n            display:flex;\n            align-items:center;\n            color:var(--wcdevis-text-color);\n            gap: .15em;\n        }\n        .wcdevis-modern-form h2 i { margin-right:.55em; color:var(--wcdevis-primary-color); width:22px; text-align:center; }\n        \n        .wcdevis-accordion-header {\n            cursor:pointer;\n            padding: .35em 40px .35em .15em;\n            position:relative;\n        }\n        .wcdevis-accordion-header::after { content:'\\f107'; font-family:'Font Awesome 5 Free'; font-weight:900; position:absolute; right:10px; top:50%; transform:translateY(-50%); }\n        .wcdevis-accordion-header.active::after { content:'\\f106'; }\n        .wcdevis-accordion-header.section-complete,\n        h2.section-complete { color: var(--wcdevis-text-color); }\n        \n        .wcdevis-accordion-content { display:none; padding-top:1em; margin-top:-0.25em; padding-bottom:.2em; }\n        .wcdevis-prefill-hint { display:inline-block; margin-left:10px; color:#5b6470; font-size:.72em; font-weight:500; }\n        @media (max-width: 600px) { .wcdevis-prefill-hint { display:block; margin:4px 24px 0 0; font-size:.68em; } }\n        .wcdevis-section-status { display:none; margin-left:10px; color:var(--wcdevis-success-color); }\n        h2.section-complete .wcdevis-section-status { display:inline-block; }\n\n        .wcdevis-modern-form .wcdevis-form-grid { display:grid; grid-template-columns:1fr 1fr; gap:1em; }\n        .wcdevis-modern-form .form-group-full-width { grid-column:1 \/ -1; }\n        \n        .wcdevis-modern-form label:not(.checkbox-label) {\n            display: inline-block;\n            margin: 0 0 8px;\n            font-size: .94em;\n            font-weight: 600;\n            color: #364152;\n        }\n        \n        .wcdevis-modern-form input,\n        .wcdevis-modern-form select,\n        .wcdevis-modern-form textarea {\n            width:100%;\n            padding:.95em 1em;\n            border:1px solid var(--wcdevis-border-color);\n            border-radius:14px;\n            background-color:#fff;\n            font-size:1em;\n            font-family:inherit;\n            box-sizing:border-box;\n            transition: border-color .18s ease, box-shadow .18s ease, background-color .18s ease;\n        }\n        .wcdevis-modern-form input:hover,\n        .wcdevis-modern-form select:hover,\n        .wcdevis-modern-form textarea:hover { border-color: rgba(13,110,253,.28); }\n        .wcdevis-modern-form input:focus,\n        .wcdevis-modern-form select:focus,\n        .wcdevis-modern-form textarea:focus {\n            border-color:var(--wcdevis-primary-color);\n            outline:0;\n            background: #fff;\n            box-shadow: 0 0 0 4px rgba(13, 110, 253, .10);\n        }\n        .wcdevis-modern-form select:disabled { background: #f2f4f7; color: #8a94a6; cursor: not-allowed; }\n        \n        \/* Validation *\/\n        .is-invalid {\n            border-color:var(--wcdevis-danger-color)!important;\n            box-shadow: 0 0 0 4px rgba(220,53,69,.12);\n            background: rgba(220,53,69,.03);\n            animation: wcdevisInvalidPulse .9s ease-in-out 2;\n        }\n        .wcdevis-highlight-missing { animation: wcdevisInvalidPulse .9s ease-in-out 2; }\n        .wcdevis-field-error { display:block; flex-basis:100%; margin:.45em 0 0; color:#b42318; font-size:.9em; font-weight:600; }\n        .wcdevis-modern-form input,\n        .wcdevis-modern-form select,\n        .wcdevis-modern-form textarea { scroll-margin-top:100px; }\n        .wcdevis-selections-note {\n            display:flex;\n            align-items:flex-start;\n            gap:.65em;\n            padding:10px 13px;\n            margin:0 0 1em;\n            border:1px solid rgba(13,110,253,.16);\n            border-radius:12px;\n            background:#f7f9fc;\n            color:#364152;\n            font-size:.92em;\n            line-height:1.45;\n        }\n        .wcdevis-selections-note i { margin-top:.18em; color:var(--wcdevis-primary-color); flex:0 0 auto; }\n        @keyframes wcdevisInvalidPulse {\n            0% { box-shadow: 0 0 0 0 rgba(220,53,69,.00); transform: translateX(0); }\n            20% { box-shadow: 0 0 0 5px rgba(220,53,69,.18); transform: translateX(-2px); }\n            40% { box-shadow: 0 0 0 8px rgba(220,53,69,.10); transform: translateX(2px); }\n            60% { box-shadow: 0 0 0 5px rgba(220,53,69,.16); transform: translateX(-2px); }\n            100% { box-shadow: 0 0 0 0 rgba(220,53,69,.00); transform: translateX(0); }\n        }\n\n        \/* Checkboxes & Radios *\/\n        .wcdevis-checkbox-group { display:grid; grid-template-columns:1fr 1fr; gap:.85em; }\n        .wcdevis-checkbox-group .checkbox-label {\n            display:flex;\n            align-items:center;\n            padding:.95em 1em;\n            border:1px solid var(--wcdevis-border-color);\n            border-radius:14px;\n            cursor:pointer;\n            background: #fff;\n            transition: .18s ease;\n            min-height: 58px;\n        }\n        .wcdevis-checkbox-group .checkbox-label:hover { border-color: rgba(13,110,253,.25); transform: translateY(-1px); }\n        .wcdevis-checkbox-group .checkbox-label input { width:auto; margin-right:10px; flex-shrink: 0; }\n        \n        .wcdevis-existing-customer {\n            display:flex;\n            align-items:center;\n            gap:1em;\n            margin-top:1.2em;\n            padding:1em 1.05em;\n            background:linear-gradient(180deg, #fbfcfe, #f7f9fc);\n            border: 1px solid rgba(26,42,58,.08);\n            border-radius:16px;\n            flex-wrap:wrap;\n        }\n        .wcdevis-existing-customer span { font-weight:600; margin-right:auto; }\n        .wcdevis-existing-customer label {\n            display:flex;\n            align-items:center;\n            gap:0.5em;\n            cursor:pointer;\n            padding: 8px 12px;\n            border-radius: 999px;\n            background: #fff;\n            border: 1px solid rgba(26,42,58,.08);\n        }\n\n        \/* Specific Components *\/\n        .wcdevis-vehicule-item {\n            padding: 12px;\n            border: 1px solid rgba(26,42,58,.08);\n            border-radius: 18px;\n            background: linear-gradient(180deg, #fff, #fafcff);\n            margin-bottom: 12px;\n        }\n        \n        .wcdevis-submit-button {\n            width:100%;\n            margin-top:1.15em;\n            padding:1.1em 1.2em;\n            font-size:1.08em;\n            font-weight:700;\n            background: linear-gradient(90deg, var(--wcdevis-primary-color), #0d6efd);\n            color:#fff;\n            border:none;\n            border-radius:18px;\n            cursor:pointer;\n            display:flex;\n            justify-content:center;\n            align-items:center;\n            box-shadow: 0 18px 34px rgba(13,110,253,.22);\n            transition: transform .18s ease, box-shadow .18s ease, opacity .18s ease;\n        }\n        .wcdevis-submit-button:hover { transform: translateY(-1px); box-shadow: 0 20px 36px rgba(13,110,253,.26); }\n        .wcdevis-submit-button:disabled { opacity: .8; cursor: wait; }\n        .wcdevis-submit-button i { margin-right: 8px; }\n        \n        #wcdevis-ajouter-vehicule {\n            background: linear-gradient(180deg, #ffffff, #f7faff);\n            border:1px dashed rgba(13,110,253,.35);\n            color:var(--wcdevis-primary-color);\n            padding:.95em 1em;\n            width:100%;\n            border-radius:16px;\n            cursor:pointer;\n            margin-top:1em;\n            font-weight: 700;\n        }\n        \n        .wcdevis-retirer-vehicule {\n            border:none;\n            background:none;\n            color: var(--wcdevis-danger-color);\n            cursor: pointer;\n            width: 42px;\n            height: 42px;\n            border-radius: 50%;\n        }\n        .wcdevis-retirer-vehicule:hover { background: rgba(220,53,69,.08); }\n        \n        .wcdevis-expand-prompt {\n            border: 1px dashed rgba(13,110,253,.35);\n            border-radius: 16px;\n            padding: 14px 16px;\n            background: linear-gradient(180deg, rgba(13,110,253,.06), rgba(13,110,253,.02));\n            cursor: pointer;\n            margin-bottom: 18px;\n        }\n        .wcdevis-expand-prompt p { margin: 0; }\n        .wcdevis-expand-prompt span { font-weight: 700; color: var(--wcdevis-primary-color); }\n        .wcdevis-optional-details {\n            border: 1px solid var(--wcdevis-border-color);\n            border-radius: 14px;\n            margin: 0 0 1.25em;\n            background: #fff;\n        }\n        .wcdevis-optional-details > summary {\n            cursor: pointer;\n            padding: 1em 1.1em;\n            color: var(--wcdevis-primary-color);\n            font-weight: 700;\n        }\n        .wcdevis-optional-details > summary::marker { color: var(--wcdevis-primary-color); }\n        .wcdevis-optional-details-content { padding: 0 1em 1em; }\n        \n        .section-subtitle { margin: 0 0 12px; color: var(--wcdevis-text-light-color); line-height: 1.5; }\n        \n        #devis-messages { padding:1em 1.15em; margin:1.5em 0 0; border-radius:16px; display:none; text-align:left; font-weight:600; }\n        #devis-messages ul { margin:.65em 0 0; padding-left:1.25em; text-align:left; }\n        #devis-messages li + li { margin-top:.25em; }\n        #devis-messages.success { background-color:#d1e7dd; color:#0f5132; }\n        #devis-messages.error { background-color:#f8d7da; color:#842029; }\n        \n        .required { color:var(--wcdevis-danger-color); margin-left: 2px; }\n        .wcdevis-sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border: 0 !important; }\n\n        \/* =====================================================================\n           RESPONSIVE CLEANUP (Mobiles & Tablettes)\n           ===================================================================== *\/\n        \n        \/* Tablettes (<= 980px) *\/\n        @media (max-width: 980px) {\n            .wcdevis-form-hero { grid-template-columns: 1fr; }\n            .wcdevis-step-chips { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n            .wcdevis-hero-side { width: 100%; }\n        }\n\n        \/* Mobiles (<= 768px) *\/\n        @media (max-width: 768px) {\n            .wcdevis-main-container {\n                padding: 18px !important;\n                margin: 15px auto !important;\n                border-radius: 16px !important;\n            }\n            .wcdevis-hero-card,\n            .wcdevis-modern-form section,\n            .wcdevis-request-type-selector label,\n            .wcdevis-items-preview {\n                border-radius: 14px;\n            }\n            .wcdevis-hero-side { display: none !important; }\n            .wcdevis-step-chips { display: none !important; }\n            \n            .wcdevis-request-type-selector {\n                flex-direction: column;\n                gap: 12px;\n            }\n            \n            \/* Grids -> 1 Colonne *\/\n            .wcdevis-modern-form .wcdevis-form-grid,\n            .wcdevis-checkbox-group {\n                grid-template-columns: 1fr !important;\n            }\n            .wcdevis-modern-form .form-group-full-width {\n                grid-column: auto !important;\n            }\n\n            \/* Responsive tables *\/\n            .devis-table,\n            .devis-table tbody,\n            .devis-table tr,\n            .devis-table td {\n                display: block;\n                width: 100%;\n            }\n            .devis-table tr {\n                padding-bottom: 10px;\n                margin-bottom: 10px;\n                border-bottom: 1px solid var(--wcdevis-border-color);\n            }\n            .devis-table td {\n                padding: 6px 0;\n                border: 0;\n                text-align: left !important;\n            }\n\n            \/* Ajustement des inputs pour \u00e9viter le zoom iOS et d\u00e9border *\/\n            .wcdevis-modern-form input,\n            .wcdevis-modern-form select,\n            .wcdevis-modern-form textarea {\n                font-size: 16px !important; \/* Emp\u00eache le zoom auto sur iPhone *\/\n                padding: 12px 14px;\n            }\n\n            .wcdevis-existing-customer {\n                flex-direction: column;\n                align-items: stretch;\n                gap: 10px;\n            }\n            .wcdevis-existing-customer span {\n                width: 100%;\n                display: block;\n                margin-bottom: 4px;\n            }\n            .wcdevis-existing-customer label {\n                justify-content: flex-start;\n                padding: 12px;\n            }\n            .wcdevis-submit-button { min-height:56px; padding:14px 16px; font-size:1em; touch-action:manipulation; }\n            \n            .wcdevis-vehicule-item {\n                padding: 0;\n                border: none;\n                background: transparent;\n            }\n        }\n    <\/style>\n\n    <div class=\"wcdevis-main-container\">\n        <div id=\"devis-items-container\" hidden aria-hidden=\"true\"><\/div>    \n    <form method=\"post\" id=\"formulaire-client-inner\" class=\"wcdevis-modern-form\" novalidate>\n        <div class=\"wcdevis-form-hero\">\n            <div class=\"wcdevis-hero-card\">\n                <span class=\"wcdevis-eyebrow\"><i class=\"fas fa-hammer\"><\/i>Nous pr\u00e9parons votre v\u00e9hicule<\/span>\n                <h1>Votre devis am\u00e9nagement<\/h1>\n                <p>Gagnez du temps : dites-nous ce qu'il vous faut pour votre utilitaire. On vous pr\u00e9pare un chiffrage pr\u00e9cis, taill\u00e9 pour votre m\u00e9tier.<\/p>\n                <p>Allez directement \u00e0 l'essentiel, sans blabla.<\/p>\n            <\/div>\n            <div class=\"wcdevis-hero-side\">\n                <div class=\"wcdevis-side-title\">Avancement<\/div>\n                <div class=\"wcdevis-progress-bar\"><span id=\"wcdevis-progress-fill\"><\/span><\/div>\n                <div class=\"wcdevis-progress-label\">\n                    <span>\u00c9tapes compl\u00e9t\u00e9es<\/span>\n                    <strong id=\"wcdevis-progress-count\">0 \/ 4<\/strong>\n                <\/div>\n                <div class=\"wcdevis-inline-note\" style=\"margin:0;\">\n                    <i class=\"fas fa-info-circle\"><\/i>\n                    <div><strong>Astuce :<\/strong> s'il manque une info obligatoire, on vous la mettra en rouge direct.<\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"wcdevis-step-chips\" aria-hidden=\"true\">\n            <div class=\"wcdevis-step-chip\" data-step-target=\"section-vehicule\"><i class=\"fas fa-truck\"><\/i><div><strong>\u00c9tape 1<\/strong><span>Fourgon<\/span><\/div><\/div>\n            <div class=\"wcdevis-step-chip\" data-step-target=\"section-projet\"><i class=\"fas fa-tools\"><\/i><div><strong>\u00c9tape 2<\/strong><span>Besoins<\/span><\/div><\/div>\n            <div class=\"wcdevis-step-chip\" data-step-target=\"section-coordonnees\"><i class=\"fas fa-user-alt\"><\/i><div><strong>\u00c9tape 3<\/strong><span>Contact<\/span><\/div><\/div>\n            <div class=\"wcdevis-step-chip\" data-step-target=\"section-finalisation\"><i class=\"fas fa-comment-dots\"><\/i><div><strong>\u00c9tape 4<\/strong><span>D\u00e9tails<\/span><\/div><\/div>\n        <\/div>\n\n        <div class=\"wcdevis-request-type-selector\">\n            <label style=\"text-align: center;\">\n                <input type=\"radio\" name=\"request_type\" value=\"full_quote\" checked> \n                <span style=\"font-size: 1.15em; font-weight: 700; color: var(--wcdevis-primary-color); display: block; margin-bottom: 6px;\">\n                    <i class=\"fas fa-file-signature\"><\/i> Demander mon devis gratuit\n                <\/span>\n                <small style=\"display: block; color: #198754; font-weight: bold; margin-bottom: 4px; font-size: 0.95em; background: #d1e7dd; padding: 2px 8px; border-radius: 12px; width: fit-content; margin-left: auto; margin-right: auto;\">\n                    <i class=\"fas fa-stopwatch\"><\/i> R\u00e9ponse rapidement\n                <\/small>\n                <small style=\"color: #6c757d;\">Le chiffrage complet par mail.<\/small>\n            <\/label>\n            \n            <label style=\"text-align: center;\">\n                <input type=\"radio\" name=\"request_type\" value=\"callback\"> \n                <span style=\"font-size: 1.15em; font-weight: 700; color: var(--wcdevis-primary-color); display: block; margin-bottom: 6px;\">\n                    <i class=\"fas fa-headset\"><\/i> \u00catre rappel\u00e9\n                <\/span>\n                <small style=\"display: block; margin-top: 8px; color: #6c757d;\">On en discute de vive voix.<\/small>\n            <\/label>\n        <\/div>\n\n        <div class=\"wcdevis-selections-note\" role=\"status\">\n            <i class=\"fas fa-check-circle\" aria-hidden=\"true\"><\/i>\n            <span>Vos choix sont conserv\u00e9s automatiquement : v\u00e9hicule, m\u00e9tier, am\u00e9nagement pr\u00e9vu dans l\u2019utilitaire et \u00e9quipements s\u00e9lectionn\u00e9s.<\/span>\n        <\/div>\n\n        <input type=\"hidden\" name=\"action\" value=\"wcdevis_envoyer_devis\">\n        <input type=\"hidden\" name=\"nonce\" value=\"304200fda9\">\n        <input type=\"hidden\" name=\"client_viewport_width\" id=\"client_viewport_width\" value=\"\">\n        <input type=\"hidden\" name=\"visitor_status\" id=\"visitor_status\" value=\"\">\n        <input type=\"text\" name=\"honeypot_field\" style=\"display:none !important;\" tabindex=\"-1\" autocomplete=\"off\">\n        \n                <section id=\"section-vehicule\" class=\"wcdevis-accordion-section\">\n            <h2 class=\"wcdevis-accordion-header active\"><i class=\"fas fa-truck\"><\/i> 1. Votre (ou vos) v\u00e9hicule(s)<span class=\"wcdevis-section-status\"><i class=\"fas fa-check-circle\"><\/i><\/span><\/h2>\n            <div class=\"wcdevis-accordion-content\" style=\"display: block;\">\n                <div class=\"wcdevis-inline-note\"><i class=\"fas fa-highlighter\"><\/i><div><strong>Astuce :<\/strong> choisissez d'abord la marque pour d\u00e9bloquer les mod\u00e8les correspondants.<\/div><\/div>\n                <div id=\"wcdevis-vehicules-container\">\n                    <div class=\"wcdevis-vehicule-item\">\n                        <div class=\"wcdevis-form-grid\">\n                            <div class=\"form-group\">\n                                <label for=\"vehicules_0_marque\">Marque <span class=\"required\">*<\/span><\/label>\n                                <select name=\"vehicules[0][marque]\" id=\"vehicules_0_marque\" class=\"wcdevis-marque-select\" data-required-for-quote=\"true\">\n                                    <option value=\"\" disabled selected>-- S\u00e9lectionnez une marque --<\/option>\n                                    <option value=\"CITROEN\" >CITROEN<\/option><option value=\"DACIA\" >DACIA<\/option><option value=\"FIAT\" >FIAT<\/option><option value=\"FORD\" >FORD<\/option><option value=\"HYUNDAI\" >HYUNDAI<\/option><option value=\"IVECO\" >IVECO<\/option><option value=\"KIA\" >KIA<\/option><option value=\"MAN\" >MAN<\/option><option value=\"MAXUS\" >MAXUS<\/option><option value=\"MERCEDES\" >MERCEDES<\/option><option value=\"NISSAN\" >NISSAN<\/option><option value=\"OPEL\" >OPEL<\/option><option value=\"PEUGEOT\" >PEUGEOT<\/option><option value=\"RENAULT\" >RENAULT<\/option><option value=\"TOYOTA\" >TOYOTA<\/option><option value=\"VOLKSWAGEN\" >VOLKSWAGEN<\/option>                                <\/select>\n                            <\/div>\n                            <div class=\"form-group\">\n                                <label for=\"vehicules_0_modele\">Mod\u00e8le <span class=\"required\">*<\/span><\/label>\n                                <select name=\"vehicules[0][modele]\" id=\"vehicules_0_modele\" class=\"wcdevis-modele-select\" data-required-for-quote=\"true\" disabled>\n                                    <option value=\"\" disabled selected>-- S\u00e9lectionnez un mod\u00e8le --<\/option>\n                                                                    <\/select>\n                            <\/div>\n                            <div class=\"form-group\">\n                                <label for=\"vehicules_0_dimension\">Dimension <span class=\"required\">*<\/span><\/label>\n                                <select name=\"vehicules[0][dimension]\" id=\"vehicules_0_dimension\" class=\"wcdevis-dimension-select\" data-required-for-quote=\"true\" disabled>\n                                    <option value=\"\" disabled selected>-- S\u00e9lectionnez une dimension --<\/option>\n                                                                    <\/select>\n                            <\/div>\n                            <div style=\"align-self: end;\"><button type=\"button\" class=\"wcdevis-retirer-vehicule\" title=\"Retirer ce v\u00e9hicule\" style=\"display: none;\"><i class=\"fas fa-trash-alt\"><\/i><\/button><\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n                <button type=\"button\" id=\"wcdevis-ajouter-vehicule\"><i class=\"fas fa-plus\"><\/i> Ajouter un autre v\u00e9hicule<\/button>\n            <\/div>\n        <\/section>\n        \n                \n               <section id=\"section-coordonnees\" class=\"wcdevis-accordion-section\">\n            <h2 class=\"wcdevis-accordion-header active\"><i class=\"fas fa-user-alt\"><\/i> 3. Vos Coordonn\u00e9es<span class=\"wcdevis-section-status\"><i class=\"fas fa-check-circle\"><\/i><\/span><\/h2>\n            <div class=\"wcdevis-accordion-content\" style=\"display: block;\">\n                <div class=\"wcdevis-inline-note\"><i class=\"fas fa-id-card\"><\/i><div><strong>Presque fini !<\/strong> Laissez-nous de quoi vous recontacter facilement.<\/div><\/div>\n                <div class=\"wcdevis-form-part\" data-request-type=\"full_quote\">\n                    <div class=\"form-group form-group-full-width\" style=\"margin-bottom: 1.5em;\">\n                        <label for=\"metier\" class=\"wcdevis-sr-only\">Votre m\u00e9tier<\/label>\n                        <select name=\"metier\" id=\"metier\" data-required-for-quote=\"true\">\n                            <option value=\"\" disabled selected>Votre m\u00e9tier *<\/option>\n                            <option value=\"Artisan\">Artisan<\/option><option value=\"Livreur\">Livreur<\/option><option value=\"Plombier\">Plombier<\/option><option value=\"\u00c9lectricien\">\u00c9lectricien<\/option><option value=\"Menuisier\">Menuisier<\/option><option value=\"Chauffagiste\">Chauffagiste<\/option><option value=\"Carreleur\">Carreleur<\/option><option value=\"Serrurier\">Serrurier<\/option><option value=\"Peintre\">Peintre<\/option><option value=\"Poseur fen\u00eatres\">Poseur fen\u00eatres<\/option><option value=\"Autres\">Autres<\/option>                        <\/select>\n                    <\/div>\n                <\/div>\n                <div class=\"wcdevis-form-grid\">\n                    <div class=\"form-group \"><input placeholder=\"Nom *\" type=\"text\" id=\"nom\" name=\"nom\" value=\"\" autocomplete=\"family-name\" required><\/div><div class=\"form-group \"><input placeholder=\"Pr\u00e9nom (facultatif)\" type=\"text\" id=\"prenom\" name=\"prenom\" value=\"\" autocomplete=\"given-name\" ><\/div><div class=\"form-group \"><input placeholder=\"Email *\" type=\"email\" id=\"email\" name=\"email\" value=\"\" inputmode=\"email\" autocomplete=\"email\" required><\/div><div class=\"form-group \"><input placeholder=\"T\u00e9l\u00e9phone *\" type=\"tel\" id=\"telephone\" name=\"telephone\" value=\"\" inputmode=\"tel\" autocomplete=\"tel\" required><\/div><div class=\"form-group \"><input placeholder=\"Soci\u00e9t\u00e9\" type=\"text\" id=\"entreprise\" name=\"entreprise\" value=\"\"  ><\/div>                <\/div>\n                <div class=\"wcdevis-form-part\" data-request-type=\"full_quote\">\n                    <p class=\"section-subtitle\" style=\"margin-top: 1.5em; margin-bottom: 0.5em;\">Adresse de facturation \/ pose<\/p>\n                    <div class=\"wcdevis-form-grid\">\n                        <div class=\"form-group form-group-full-width\">\n                            <label for=\"adresse\" class=\"wcdevis-sr-only\">Adresse<\/label>\n                            <input placeholder=\"Adresse (facultatif)\" type=\"text\" id=\"adresse\" name=\"adresse\" autocomplete=\"street-address\" value=\"\">\n                        <\/div>\n                        <div class=\"form-group\">\n                             <label for=\"code_postal\" class=\"wcdevis-sr-only\">Code postal<\/label>\n                            <input placeholder=\"Code postal (facultatif)\" type=\"text\" id=\"code_postal\" name=\"code_postal\" inputmode=\"numeric\" autocomplete=\"postal-code\" maxlength=\"5\" value=\"\" pattern=\"\\d{5}\">\n                        <\/div>\n                        <div class=\"form-group\">\n                             <label for=\"ville\" class=\"wcdevis-sr-only\">Ville<\/label>\n                            <input placeholder=\"Ville (facultatif)\" type=\"text\" id=\"ville\" name=\"ville\" autocomplete=\"address-level2\" value=\"\">\n                        <\/div>\n                    <\/div>\n                <\/div>\n                <div class=\"wcdevis-existing-customer\">\n                    <span>D\u00e9j\u00e0 client chez nous ? <small>(facultatif)<\/small><\/span>\n                    <label><input type=\"radio\" name=\"existing_customer\" value=\"yes\"> Oui<\/label>\n                    <label><input type=\"radio\" name=\"existing_customer\" value=\"no\"> Non<\/label>\n                <\/div>\n            <\/div>\n        <\/section>\n        \n            <section id=\"section-finalisation\" class=\"wcdevis-accordion-section\">\n        <h2 class=\"wcdevis-accordion-header active\"><i class=\"fas fa-comment-dots\"><\/i> 4. Pr\u00e9cisions du client <span class=\"required\">*<\/span><span class=\"wcdevis-section-status\"><i class=\"fas fa-check-circle\"><\/i><\/span><\/h2>\n        <div class=\"wcdevis-accordion-content\" style=\"display: block;\">\n                <div class=\"wcdevis-inline-note\"><i class=\"fas fa-bullseye\"><\/i><div><strong>Quelques mots suffisent.<\/strong> Vous pourrez pr\u00e9ciser votre besoin simplement.<\/div><\/div>\n                <div class=\"wcdevis-form-part\" data-request-type=\"full_quote\">\n                    <details class=\"wcdevis-optional-details\">\n                        <summary>D\u00e9tails compl\u00e9mentaires (facultatif)<\/summary>\n                        <div class=\"wcdevis-optional-details-content\">\n                                <p class=\"section-subtitle\">D\u00e9crivez-nous vos besoins.<\/p>\n    <label>Types de solutions recherch\u00e9es<\/label>\n    <div class=\"wcdevis-checkbox-group\" style=\"margin-top: 0.5em;\">\n        <label class=\"checkbox-label\"><input type=\"checkbox\" name=\"catalogue_options[]\" value=\"amenagements_bois\"> Am\u00e9nagements int\u00e9rieurs en bois<\/label><label class=\"checkbox-label\"><input type=\"checkbox\" name=\"catalogue_options[]\" value=\"amenagements_metalliques\"> Am\u00e9nagements int\u00e9rieurs m\u00e9talliques<\/label><label class=\"checkbox-label\"><input type=\"checkbox\" name=\"catalogue_options[]\" value=\"portage_exterieur\"> Portage ext\u00e9rieur (galeries, etc.)<\/label><label class=\"checkbox-label\"><input type=\"checkbox\" name=\"catalogue_options[]\" value=\"attelages_protections\"> Attelages et protections<\/label><label class=\"checkbox-label\"><input type=\"checkbox\" name=\"catalogue_options[]\" value=\"portage_specifique\"> Solutions de portage sp\u00e9cifiques<\/label><label class=\"checkbox-label\"><input type=\"checkbox\" name=\"catalogue_options[]\" value=\"securisation\"> S\u00e9curisation (serrures, alarmes)<\/label><label class=\"checkbox-label\"><input type=\"checkbox\" name=\"catalogue_options[]\" value=\"signalisation_balisage\"> Signalisation et balisage<\/label><label class=\"checkbox-label\"><input type=\"checkbox\" name=\"catalogue_options[]\" value=\"autres_equipements\"> Autres \u00e9quipements (\u00e9lectricit\u00e9, etc.)<\/label>    <\/div>\n                                <div class=\"wcdevis-existing-customer\" style=\"padding: 1em; margin-bottom: 1em; margin-top: 0;\">\n                                <span>Le plancher est-il d\u00e9j\u00e0 pos\u00e9 ? <small>(facultatif)<\/small><\/span>\n                                <label><input type=\"radio\" name=\"equipe_plancher\" value=\"oui\"> Oui<\/label>\n                                <label><input type=\"radio\" name=\"equipe_plancher\" value=\"non\"> Non<\/label>\n                            <\/div>\n\n                            <div class=\"wcdevis-existing-customer\" style=\"padding: 1em; margin-bottom: 1em; margin-top: 0;\">\n                                <span>Les parois\/portes sont-elles d\u00e9j\u00e0 prot\u00e9g\u00e9es ? <small>(facultatif)<\/small><\/span>\n                                <label><input type=\"radio\" name=\"equipe_protections\" value=\"oui\"> Oui<\/label>\n                                <label><input type=\"radio\" name=\"equipe_protections\" value=\"non\"> Non<\/label>\n                            <\/div>\n\n                            <div class=\"wcdevis-existing-customer\" style=\"padding: 1em; margin-bottom: 1em; margin-top: 0;\">\n                                <span>Avez-vous d\u00e9j\u00e0 le fourgon entre les mains ? <small>(facultatif)<\/small><\/span>\n                                <label><input type=\"radio\" name=\"vehicule_possede\" value=\"oui\"> Oui<\/label>\n                                <label><input type=\"radio\" name=\"vehicule_possede\" value=\"non\"> Non<\/label>\n                            <\/div>\n\n                            <div id=\"en_commande_wrapper\" style=\"display: none;\">\n                                <div class=\"wcdevis-existing-customer\" style=\"padding: 1em; margin-bottom: 1em; margin-top: 0;\">\n                                    <span>Est-il en cours de commande \/ livraison ? <small>(facultatif)<\/small><\/span>\n                                    <label><input type=\"radio\" name=\"vehicule_en_commande\" value=\"oui\"> Oui<\/label>\n                                    <label><input type=\"radio\" name=\"vehicule_en_commande\" value=\"non\"> Non<\/label>\n                                <\/div>\n                                <div id=\"delai_commande_wrapper\" style=\"display: none; margin-bottom: 1.5em;\">\n                                    <label for=\"delai_commande\" class=\"wcdevis-sr-only\">D\u00e9lai estim\u00e9<\/label>\n                                    <input type=\"text\" id=\"delai_commande\" name=\"delai_commande\" placeholder=\"Si oui, dans combien de temps ? (ex: 2 mois)\">\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/details>\n                    <label for=\"commentaires\" style=\"margin-top: 1.5em; display: block;\">Que transportez-vous et de quels \u00e9quipements avez-vous besoin ? <span class=\"required\">*<\/span><\/label>\n                    <textarea name=\"commentaires\" id=\"commentaires\" rows=\"4\" placeholder=\"Ex. : Je transporte des tuyaux de 3 m et j\u2019ai besoin de grands tiroirs.\" data-required-for-quote=\"true\"><\/textarea>\n                <\/div>\n                <div class=\"wcdevis-form-part\" data-request-type=\"callback\" style=\"display:none;\">\n                    <label>Quand on vous rappelle ?<span class=\"required\">*<\/span><\/label>\n                    <div class=\"wcdevis-form-grid\">\n                        <div class=\"form-group\"><input type=\"date\" id=\"callback_date\" name=\"callback_date\" data-required-for-callback=\"true\"><\/div>\n                        <div class=\"form-group\">\n                            <select id=\"callback_period\" name=\"callback_period\" data-required-for-callback=\"true\">\n                                <option value=\"\" disabled selected>Cr\u00e9neau horaire *<\/option>\n                                <option value=\"Matin\">Matin (8h-12h)<\/option>\n                                <option value=\"Apr\u00e8s-midi\">Apr\u00e8s-midi (13h-18h)<\/option>\n                            <\/select>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/section>\n        \n        <button type=\"submit\" id=\"envoyer-devis-ajax\" class=\"wcdevis-submit-button\">\n            <i class=\"fas fa-paper-plane\"><\/i> <span>Recevoir mon devis gratuit<\/span>\n        <\/button>\n    <\/form>\n            <div id=\"devis-messages\" role=\"alert\" aria-live=\"assertive\" tabindex=\"-1\" style=\"display:none;\"><\/div>\n    <\/div>\n    \n    <script>\n    document.addEventListener('DOMContentLoaded', function() {\n        const formContainer = document.querySelector('.wcdevis-main-container');\n        if (!formContainer) return;\n\n        const form = formContainer.querySelector('#formulaire-client-inner');\n        if (!form) return;\n        \n        const sections = form.querySelectorAll('.wcdevis-accordion-section');\n        const submitButton = form.querySelector('#envoyer-devis-ajax');\n        const messagesDiv = formContainer.querySelector('#devis-messages');\n        const vehiculesContainer = form.querySelector('#wcdevis-vehicules-container');\n        const addVehiculeBtn = form.querySelector('#wcdevis-ajouter-vehicule');\n        const solutionsGroup = form.querySelector('.wcdevis-checkbox-group');\n        const progressFill = form.querySelector('#wcdevis-progress-fill');\n        const progressCount = form.querySelector('#wcdevis-progress-count');\n        const stepChips = form.querySelectorAll('.wcdevis-step-chip');\n\n        const WCDEVIS_AJAX = {\n            ajax_url: \"https:\/\/alaska-france.fr\/boutique\/wp-admin\/admin-ajax.php\",\n            nonce: \"304200fda9\"\n        };\n\n        \/\/ ---- CHARGEMENT DYNAMIQUE DES PRODUITS (ANTI-CACHE) ----\n        const devisItemsContainer = document.getElementById('devis-items-container');\n        if (devisItemsContainer) {\n            fetch(WCDEVIS_AJAX.ajax_url + '?action=wcdevis_get_devis_items')\n                .then(res => res.json())\n                .then(data => {\n                    if (data.success && data.data.items.length > 0) {\n                        data.data.items.forEach(item => {\n                            \/\/ Les produits restent inclus dans la demande, sans afficher le r\u00e9capitulatif.\n                            const hiddenInput = document.createElement('input');\n                            hiddenInput.type = 'hidden';\n                            hiddenInput.name = `devis_products[${item.id}]`;\n                            hiddenInput.value = item.qty;\n                            form.appendChild(hiddenInput);\n                        });\n                    }\n                });\n        }\n        \/\/ ---------------------------------------------------------\n\n        const visitorStatusInput = form.querySelector('#visitor_status');\n        if (visitorStatusInput) {\n            try {\n                let status = localStorage.getItem('alaska_visitor_status');\n                if (status === 'returning') {\n                    visitorStatusInput.value = 'Visiteur connu';\n                } else {\n                    visitorStatusInput.value = 'Premi\u00e8re visite';\n                    localStorage.setItem('alaska_visitor_status', 'returning');\n                }\n            } catch (e) {\n                visitorStatusInput.value = 'Ind\u00e9termin\u00e9';\n            }\n        }\n        \n        const waitForSelectOptions = (selectElement) => {\n            return new Promise((resolve, reject) => {\n                const timeout = setTimeout(() => {\n                    observer.disconnect();\n                    reject(new Error(`Timeout`));\n                }, 5000);\n\n                if (selectElement.options.length > 1 && !selectElement.disabled) {\n                    clearTimeout(timeout);\n                    resolve();\n                    return;\n                }\n                \n                const observer = new MutationObserver(() => {\n                    if (selectElement.options.length > 1 && !selectElement.disabled) {\n                        clearTimeout(timeout);\n                        observer.disconnect();\n                        resolve();\n                    }\n                });\n                observer.observe(selectElement, { childList: true, attributes: true, attributeFilter: ['disabled'] });\n            });\n        };\n        \n        const removeVehicleDimensionsFromContactNames = () => {\n            const dimensions = Array.from(form.querySelectorAll('.wcdevis-dimension-select'))\n                .map(select => (select.value || '').trim()).filter(Boolean);\n            const escapeRegExp = value => value.replace(\/[.*+?^${}()|[\\]\\\\]\/g, '\\\\$&');\n            ['nom', 'prenom'].forEach(id => {\n                const field = form.querySelector('#' + id);\n                if (!field || !field.value) return;\n                let value = field.value;\n                dimensions.forEach(dimension => {\n                    const core = dimension.replace(\/^[\\s()]+|[\\s()]+$\/g, '');\n                    if (!core) return;\n                    const tokens = core.split(\/[^\\p{L}\\p{N}]+\/u).filter(Boolean);\n                    if (!tokens.length) return;\n                    const flexibleDimension = tokens.map(escapeRegExp).join('[\\\\s\\\\p{P}\\\\p{S}_]*');\n                    const pattern = new RegExp('(^|[^\\\\p{L}\\\\p{N}])(?:\\\\s*\\\\(\\\\s*)?' + flexibleDimension + '(?:\\\\s*\\\\))?(?=$|[^\\\\p{L}\\\\p{N}])', 'giu');\n                    value = value.replace(pattern, '$1 ').replace(\/\\(\\s*\\)\/g, ' ').replace(\/\\s+\/g, ' ').trim();\n                });\n                if (value !== field.value) {\n                    field.value = value;\n                    field.dispatchEvent(new Event('input', { bubbles: true }));\n                }\n            });\n        };\n\n        const updateVehicleSelection = async (vehicle) => {\n            if (!vehicle || !vehicle.marque) return;\n\n            const marqueSelect = form.querySelector('#vehicules_0_marque');\n            const modeleSelect = form.querySelector('#vehicules_0_modele');\n            const dimensionSelect = form.querySelector('#vehicules_0_dimension');\n            \n            if (!marqueSelect || !modeleSelect || !dimensionSelect) return;\n\n            try {\n                marqueSelect.value = vehicle.marque;\n                marqueSelect.dispatchEvent(new Event('change', { bubbles: true }));\n\n                if (vehicle.modele) {\n                    await waitForSelectOptions(modeleSelect);\n                    modeleSelect.value = vehicle.modele;\n                    modeleSelect.dispatchEvent(new Event('change', { bubbles: true }));\n                }\n\n                if (vehicle.dimension) {\n                    await waitForSelectOptions(dimensionSelect);\n                    dimensionSelect.value = vehicle.dimension;\n                    dimensionSelect.dispatchEvent(new Event('change', { bubbles: true }));\n                    removeVehicleDimensionsFromContactNames();\n                }\n\n                collapsePrefilledSection(document.getElementById('section-vehicule'), 'V\u00e9hicule d\u00e9j\u00e0 s\u00e9lectionn\u00e9 \u00b7 modifier');\n            } catch (error) { console.error(error); }\n        };\n\n        \/\/ Les choix pr\u00e9remplis restent dans le formulaire et seront envoy\u00e9s avec le devis.\n        \/\/ On replie seulement leur contenu pour all\u00e9ger la page ; le titre permet toujours de les modifier.\n        const collapsePrefilledSection = (section, hintText) => {\n            if (!section) return;\n            const header = section.querySelector('.wcdevis-accordion-header');\n            const content = section.querySelector('.wcdevis-accordion-content');\n            if (!header || !content) return;\n            header.classList.remove('active');\n            header.setAttribute('aria-expanded', 'false');\n            content.style.display = 'none';\n            section.classList.add('wcdevis-prefilled-collapsed');\n            let hint = header.querySelector('.wcdevis-prefill-hint');\n            if (!hint) {\n                hint = document.createElement('span');\n                hint.className = 'wcdevis-prefill-hint';\n                header.appendChild(hint);\n            }\n            hint.textContent = hintText;\n        };\n        \n        document.addEventListener('dws-vehicle-updated', e => { updateVehicleSelection(e.detail); });\n        \n        const loadDataFromMemory = async () => {\n            const urlParams = new URLSearchParams(window.location.search);\n            try {\n                if (!urlParams.has('marque')) {\n                    const savedVehicle = {\n                        marque: localStorage.getItem('wcdevis_marque'),\n                        modele: localStorage.getItem('wcdevis_modele'),\n                        dimension: localStorage.getItem('wcdevis_dimension')\n                    };\n                    if (savedVehicle.marque) await updateVehicleSelection(savedVehicle);\n                }\n\n                const savedMetier = localStorage.getItem('wcdevis_metier');\n                const metierSelect = form.querySelector('#metier');\n                if (savedMetier && metierSelect && Array.from(metierSelect.options).some(option => option.value === savedMetier)) {\n                    metierSelect.value = savedMetier;\n                }\n\n                const savedOptions = JSON.parse(localStorage.getItem('wcdevis_catalogue_options') || '[]');\n                if (Array.isArray(savedOptions)) {\n                    form.querySelectorAll('input[name=\"catalogue_options[]\"]').forEach(input => {\n                        input.checked = savedOptions.includes(input.value);\n                    });\n                    if (savedOptions.length > 0) {\n                        collapsePrefilledSection(document.getElementById('section-projet'), 'Besoins d\u00e9j\u00e0 s\u00e9lectionn\u00e9s \u00b7 modifier');\n                    }\n                }\n            } catch(e) {}\n\n            const vehicleSection = document.getElementById('section-vehicule');\n            const vehicleSelects = vehicleSection ? Array.from(vehicleSection.querySelectorAll('.wcdevis-vehicule-item select')) : [];\n            const vehicleIsKnown = vehicleSelects.length >= 3 && vehicleSelects.every(select => select.value !== '');\n            if (vehicleIsKnown) collapsePrefilledSection(vehicleSection, 'V\u00e9hicule d\u00e9j\u00e0 s\u00e9lectionn\u00e9 \u00b7 modifier');\n        };\n        \n        const saveDataToMemory = () => {\n            try {\n                const marque = form.querySelector('#vehicules_0_marque').value;\n                const modele = form.querySelector('#vehicules_0_modele').value;\n                const dimension = form.querySelector('#vehicules_0_dimension').value;\n                if (marque) localStorage.setItem('wcdevis_marque', marque);\n                if (modele) localStorage.setItem('wcdevis_modele', modele);\n                if (dimension) localStorage.setItem('wcdevis_dimension', dimension);\n            } catch (e) {}\n        };\n        const saveQuoteSelectionsToMemory = () => {\n            try {\n                const metier = form.querySelector('#metier')?.value || '';\n                if (metier) localStorage.setItem('wcdevis_metier', metier);\n                else localStorage.removeItem('wcdevis_metier');\n                const selectedOptions = Array.from(form.querySelectorAll('input[name=\"catalogue_options[]\"]:checked')).map(input => input.value);\n                localStorage.setItem('wcdevis_catalogue_options', JSON.stringify(selectedOptions));\n            } catch (e) {}\n        };\n\n        form.querySelector('#vehicules_0_marque')?.addEventListener('change', saveDataToMemory);\n        form.querySelector('#vehicules_0_modele')?.addEventListener('change', saveDataToMemory);\n        form.querySelector('#vehicules_0_dimension')?.addEventListener('change', saveDataToMemory);\n        form.addEventListener('change', event => {\n            if (event.target.matches('.wcdevis-dimension-select')) removeVehicleDimensionsFromContactNames();\n            if (event.target.matches('#metier, input[name=\"catalogue_options[]\"]')) saveQuoteSelectionsToMemory();\n        });\n\n        loadDataFromMemory();\n\n        form.addEventListener('click', function(e) {\n            const prompt = e.target.closest('.wcdevis-expand-prompt');\n            if (prompt) {\n                e.preventDefault();\n                const targetWrapperId = prompt.dataset.targetWrapper;\n                const wrapper = document.getElementById(targetWrapperId);\n                if(wrapper) {\n                    prompt.style.display = 'none';\n                    wrapper.style.display = 'block';\n                }\n            }\n            \n            const header = e.target.closest('.wcdevis-accordion-header');\n            if (header) {\n                e.preventDefault();\n                const content = header.parentElement.querySelector('.wcdevis-accordion-content');\n                const wasActive = header.classList.contains('active');\n                \n                form.querySelectorAll('.wcdevis-accordion-header.active').forEach(h => h.classList.remove('active'));\n                form.querySelectorAll('.wcdevis-accordion-content').forEach(c => { if(c !== content) c.style.display = 'none'; });\n                \n                if (!wasActive) {\n                    header.classList.add('active');\n                    content.style.display = 'block';\n                } else {\n                    content.style.display = 'none';\n                }\n                header.setAttribute('aria-expanded', String(!wasActive));\n                updateProgressUI();\n            }\n        });\n        \n        const validateSection = (section) => {\n            const header = section.querySelector('.wcdevis-accordion-header');\n            if (!header) return;\n            const requiredFields = section.querySelectorAll('[required]');\n            let isComplete = true;\n            \n            if (requiredFields.length === 0) {\n                header.classList.remove('section-complete');\n                return;\n            }\n            \n            requiredFields.forEach(field => {\n                const conditionalParent = field.closest('.wcdevis-form-part, #en_commande_wrapper');\n                if (conditionalParent && conditionalParent.style.display === 'none') return;\n                \n                if ((field.type === 'radio' || field.type === 'checkbox') && !form.querySelector(`input[name=\"${field.name}\"]:checked`)) {\n                    isComplete = false;\n                } else if (field.value.trim() === '') {\n                    isComplete = false;\n                }\n            });\n            header.classList.toggle('section-complete', isComplete);\n            updateProgressUI();\n        };\n\n        const updateProgressUI = () => {\n            const visibleSections = Array.from(sections).filter(section => {\n                const wrapper = section.closest('.wcdevis-form-part[data-request-type]');\n                return !wrapper || wrapper.style.display !== 'none';\n            });\n\n            const completed = visibleSections.filter(section => {\n                const header = section.querySelector('.wcdevis-accordion-header');\n                return header && header.classList.contains('section-complete');\n            }).length;\n\n            const total = visibleSections.length || 1;\n            const percent = Math.round((completed \/ total) * 100);\n\n            if (progressFill) progressFill.style.width = percent + '%';\n            if (progressCount) progressCount.textContent = completed + ' \/ ' + total;\n\n            stepChips.forEach(chip => {\n                const target = chip.dataset.stepTarget;\n                const section = target ? form.querySelector('#' + target) : null;\n                const header = section ? section.querySelector('.wcdevis-accordion-header') : null;\n                const wrapper = section ? section.closest('.wcdevis-form-part[data-request-type]') : null;\n                const isVisible = !wrapper || wrapper.style.display !== 'none';\n                chip.style.display = isVisible ? '' : 'none';\n                chip.classList.toggle('is-active', !!(header && header.classList.contains('active') && isVisible));\n                chip.classList.toggle('is-complete', !!(header && header.classList.contains('section-complete') && isVisible));\n            });\n        };\n\n        form.addEventListener('input', e => {\n            const section = e.target.closest('.wcdevis-accordion-section');\n            if (section) validateSection(section);\n            if (e.target.matches('input, select, textarea')) clearInlineFieldError(e.target);\n        });\n        form.addEventListener('change', e => {\n            if (e.target.matches('input, select, textarea')) clearInlineFieldError(e.target);\n            const section = e.target.closest('.wcdevis-accordion-section');\n            if (section) validateSection(section);\n        });\n\n        if (solutionsGroup) {\n            solutionsGroup.addEventListener('change', () => { solutionsGroup.classList.remove('is-invalid'); });\n        }\n        \n        const requestTypeRadios = form.querySelectorAll('input[name=\"request_type\"]');\n        const requestTypeLabels = form.querySelectorAll('.wcdevis-request-type-selector label');\n        \n        function toggleFormParts() {\n            const selectedType = form.querySelector('input[name=\"request_type\"]:checked').value;\n            \n            form.querySelectorAll('[data-request-type]').forEach(part => {\n                part.style.display = part.dataset.requestType === selectedType ? '' : 'none';\n            });\n            \n            form.querySelectorAll('[data-required-for-quote], [data-required-for-callback]').forEach(field => {\n                field.required = false;\n            });\n            \n            if (selectedType === 'full_quote') {\n                form.querySelectorAll('[data-required-for-quote]').forEach(field => { field.required = true; });\n                submitButton.innerHTML = '<i class=\"fas fa-paper-plane\"><\/i> Recevoir mon devis gratuit';\n            } else {\n                form.querySelectorAll('[data-required-for-callback]').forEach(field => { field.required = true; });\n                submitButton.innerHTML = '<i class=\"fas fa-phone-alt\"><\/i> Demander \u00e0 \u00eatre rappel\u00e9';\n            }\n            \n            requestTypeLabels.forEach(label => {\n                label.classList.toggle('active', label.contains(form.querySelector(`input[value=\"${selectedType}\"]`)));\n            });\n            \n            setTimeout(() => { sections.forEach(validateSection); updateProgressUI(); }, 100);\n        }\n\n        requestTypeRadios.forEach(radio => radio.addEventListener('change', toggleFormParts));\n        toggleFormParts(); \n        \n        function updateSelectOptions(selectElement, options, placeholder) {\n            selectElement.innerHTML = `<option value=\"\" disabled selected>${placeholder}<\/option>`;\n            options.forEach(opt => selectElement.insertAdjacentHTML('beforeend', `<option value=\"${opt}\">${opt}<\/option>`));\n            selectElement.disabled = false;\n        }\n        \n        if (vehiculesContainer) {\n            vehiculesContainer.addEventListener('change', function(e) {\n                const target = e.target;\n\n                if (target.classList.contains('wcdevis-marque-select')) {\n                    const vehicleItem = target.closest('.wcdevis-vehicule-item');\n                    const modeleSelect = vehicleItem.querySelector('.wcdevis-modele-select');\n                    const dimensionSelect = vehicleItem.querySelector('.wcdevis-dimension-select');\n                    const marque = target.value;\n\n                    modeleSelect.innerHTML = '<option value=\"\">Chargement...<\/option>';\n                    modeleSelect.value = \"\";\n                    modeleSelect.disabled = true;\n\n                    dimensionSelect.innerHTML = '<option value=\"\" disabled selected>-- S\u00e9lectionnez une dimension --<\/option>';\n                    dimensionSelect.value = \"\";\n                    dimensionSelect.disabled = true;\n\n                    if (!marque) return;\n\n                    const formData = new FormData();\n                    formData.append('action', 'wcdevis_get_modeles');\n                    formData.append('nonce', WCDEVIS_AJAX.nonce);\n                    formData.append('marque', marque);\n\n                    fetch(WCDEVIS_AJAX.ajax_url, { method: 'POST', body: formData })\n                        .then(response => response.json())\n                        .then(data => {\n                            if (data.success) {\n                                updateSelectOptions(modeleSelect, data.data.modeles, '-- S\u00e9lectionnez un mod\u00e8le --');\n                            } else {\n                                updateSelectOptions(modeleSelect, [], '-- Erreur, r\u00e9essayez --');\n                            }\n                            modeleSelect.disabled = false; \n                        })\n                        .catch(err => {\n                            updateSelectOptions(modeleSelect, [], '-- Erreur de connexion --');\n                            modeleSelect.disabled = false;\n                        });\n                } \n                else if (target.classList.contains('wcdevis-modele-select')) {\n                    const vehicleItem = target.closest('.wcdevis-vehicule-item');\n                    const marqueSelect = vehicleItem.querySelector('.wcdevis-marque-select');\n                    const dimensionSelect = vehicleItem.querySelector('.wcdevis-dimension-select');\n                    \n                    const marque = marqueSelect.value;\n                    const modele = target.value;\n\n                    dimensionSelect.innerHTML = '<option value=\"\">Chargement...<\/option>';\n                    dimensionSelect.value = \"\";\n                    dimensionSelect.disabled = true;\n\n                    if (!marque || !modele) return;\n\n                    const formData = new FormData();\n                    formData.append('action', 'wcdevis_get_dimensions');\n                    formData.append('nonce', WCDEVIS_AJAX.nonce);\n                    formData.append('marque', marque);\n                    formData.append('modele', modele);\n\n                    fetch(WCDEVIS_AJAX.ajax_url, { method: 'POST', body: formData })\n                        .then(response => response.json())\n                        .then(data => {\n                            if (data.success) {\n                                updateSelectOptions(dimensionSelect, data.data.dimensions, '-- S\u00e9lectionnez une dimension --');\n                            } else {\n                                updateSelectOptions(dimensionSelect, [], '-- Erreur, r\u00e9essayez --');\n                            }\n                            dimensionSelect.disabled = false; \n                        })\n                        .catch(err => {\n                            updateSelectOptions(dimensionSelect, [], '-- Erreur de connexion --');\n                            dimensionSelect.disabled = false;\n                        });\n                }\n            });\n        }\n       \n        let vehiculeIndex = 1;\n        if (addVehiculeBtn) {\n            addVehiculeBtn.addEventListener('click', () => {\n                const firstVehicule = vehiculesContainer.querySelector('.wcdevis-vehicule-item');\n                const newVehicule = firstVehicule.cloneNode(true);\n                \n                newVehicule.querySelectorAll('select, input').forEach(field => {\n                    const name = field.getAttribute('name').replace(\/\\[\\d+\\]\/, `[${vehiculeIndex}]`);\n                    field.setAttribute('name', name);\n                    const id = field.getAttribute('id').replace(\/_\\d+\/, `_${vehiculeIndex}`);\n                    field.setAttribute('id', id);\n                    field.value = '';\n                    if (field.closest('.form-group').querySelector('label')) {\n                       field.closest('.form-group').querySelector('label').setAttribute('for', id);\n                    }\n                });\n                newVehicule.querySelector('.wcdevis-retirer-vehicule').style.display = 'block';\n                vehiculesContainer.appendChild(newVehicule);\n                vehiculeIndex++;\n            });\n        }\n\n        if (vehiculesContainer) {\n            vehiculesContainer.addEventListener('click', e => {\n                const removeBtn = e.target.closest('.wcdevis-retirer-vehicule');\n                if(removeBtn && vehiculesContainer.querySelectorAll('.wcdevis-vehicule-item').length > 1) {\n                    removeBtn.closest('.wcdevis-vehicule-item').remove();\n                }\n            });\n        }\n        \n        const enCommandeRadios = form.querySelectorAll('input[name=\"vehicule_en_commande\"]');\n        const delaiWrapper = form.querySelector('#delai_commande_wrapper');\n        const vehiculePossedeRadios = form.querySelectorAll('input[name=\"vehicule_possede\"]');\n        const enCommandeWrapper = form.querySelector('#en_commande_wrapper');\n\n        if (enCommandeRadios.length > 0 && delaiWrapper) {\n            enCommandeRadios.forEach(radio => {\n                radio.addEventListener('change', function() {\n                    delaiWrapper.style.display = (this.value === 'oui') ? 'block' : 'none';\n                });\n            });\n        }\n        \n        if(vehiculePossedeRadios.length > 0 && enCommandeWrapper) {\n             vehiculePossedeRadios.forEach(radio => {\n                radio.addEventListener('change', function() {\n                    enCommandeWrapper.style.display = (this.value === 'non') ? 'block' : 'none';\n                });\n            });\n        }\n        \n        const fieldLabels = {\n            'vehicules[0][marque]': 'Marque du v\u00e9hicule',\n            'vehicules[0][modele]': 'Mod\u00e8le du v\u00e9hicule',\n            'vehicules[0][dimension]': 'Dimension du v\u00e9hicule',\n            nom: 'Nom', prenom: 'Pr\u00e9nom', email: 'Adresse e-mail', telephone: 'T\u00e9l\u00e9phone',\n            adresse: 'Adresse', code_postal: 'Code postal', ville: 'Ville', metier: 'M\u00e9tier',\n            existing_customer: 'Indiquez si vous \u00eates d\u00e9j\u00e0 client', commentaires: 'Votre projet',\n            equipe_plancher: '\u00c9tat du plancher', equipe_protections: '\u00c9tat des protections',\n            vehicule_possede: 'Disponibilit\u00e9 du v\u00e9hicule', vehicule_en_commande: '\u00c9tat de la commande du v\u00e9hicule',\n            callback_date: 'Date de rappel', callback_period: 'Cr\u00e9neau de rappel'\n        };\n        const getFieldLabel = field => fieldLabels[field.name] || field.labels?.[0]?.textContent?.replace('*', '').trim() || field.placeholder?.replace('*', '').trim() || field.name;\n        const clearInlineFieldError = field => {\n            if (!field) return;\n            const errorId = field.dataset.wcdevisErrorId;\n            if (errorId) form.querySelector('#' + errorId)?.remove();\n            const group = (field.type === 'radio' || field.type === 'checkbox')\n                ? Array.from(form.querySelectorAll('input')).filter(input => input.name === field.name)\n                : [field];\n            group.forEach(item => {\n                item.classList.remove('is-invalid');\n                item.removeAttribute('aria-invalid');\n                item.removeAttribute('aria-describedby');\n                delete item.dataset.wcdevisErrorId;\n            });\n        };\n        const setInlineFieldError = (field, message) => {\n            const groupField = field.type === 'radio' || field.type === 'checkbox';\n            const safeName = (groupField ? field.name : (field.name || field.id || 'field')).replace(\/[^a-zA-Z0-9_-]\/g, '-');\n            const errorId = 'wcdevis-field-error-' + safeName;\n            const group = groupField\n                ? Array.from(form.querySelectorAll('input')).filter(input => input.name === field.name)\n                : [field];\n            let error = form.querySelector('#' + errorId);\n            if (!error) {\n                error = document.createElement('span');\n                error.id = errorId;\n                error.className = 'wcdevis-field-error';\n                error.setAttribute('role', 'alert');\n                error.setAttribute('aria-live', 'polite');\n                const wrapper = groupField\n                    ? (field.closest('.wcdevis-existing-customer, .wcdevis-checkbox-group') || field.parentElement)\n                    : (field.closest('.form-group') || field.parentElement);\n                wrapper?.appendChild(error);\n            }\n            error.textContent = message;\n            group.forEach(item => {\n                item.classList.add('is-invalid');\n                item.setAttribute('aria-invalid', 'true');\n                item.setAttribute('aria-describedby', errorId);\n                item.dataset.wcdevisErrorId = errorId;\n            });\n        };\n        const clearAllInlineFieldErrors = () => {\n            form.querySelectorAll('.wcdevis-field-error').forEach(error => error.remove());\n            form.querySelectorAll('[data-wcdevis-error-id]').forEach(field => {\n                field.classList.remove('is-invalid');\n                field.removeAttribute('aria-invalid');\n                field.removeAttribute('aria-describedby');\n                delete field.dataset.wcdevisErrorId;\n            });\n        };\n        const showValidationErrors = errors => {\n            messagesDiv.replaceChildren();\n            const title = document.createElement('strong');\n            title.textContent = errors.length === 1 ? 'V\u00e9rifiez cette information :' : 'V\u00e9rifiez ces informations :';\n            messagesDiv.appendChild(title);\n            if (errors.length > 1) {\n                const list = document.createElement('ul');\n                errors.forEach(message => { const item = document.createElement('li'); item.textContent = message; list.appendChild(item); });\n                messagesDiv.appendChild(list);\n            } else {\n                messagesDiv.append(' ' + errors[0]);\n            }\n            messagesDiv.className = 'error';\n            messagesDiv.style.display = 'block';\n        };\n\n        form.addEventListener('submit', async e => {\n            e.preventDefault();\n            \n            const viewportField = form.querySelector('#client_viewport_width');\n            if(viewportField) viewportField.value = window.innerWidth;\n\n            submitButton.disabled = true;\n            submitButton.innerHTML = '<i class=\"fas fa-spinner fa-spin\"><\/i> Validation...';\n            \n            clearAllInlineFieldErrors();\n            messagesDiv.style.display = 'none';\n\n            let isFormValid = true;\n            let firstInvalidField = null;\n            const validationMessages = [];\n            const fieldErrors = [];\n            const checkedGroups = new Set();\n\n            form.querySelectorAll('[required], [name=\"code_postal\"]').forEach(field => {\n                const fieldWrapper = field.closest('.wcdevis-form-part, .wcdevis-accordion-section, #en_commande_wrapper');\n                if ((fieldWrapper && fieldWrapper.style.display === 'none') || field.disabled) return;\n                if (!field.required && field.value.trim() === '') return;\n\n                let message = '';\n                if (field.type === 'radio' || field.type === 'checkbox') {\n                    if (checkedGroups.has(field.name)) return;\n                    checkedGroups.add(field.name);\n                    if (!form.querySelector(`input[name=\"${field.name}\"]:checked`)) message = getFieldLabel(field);\n                } else if (field.value.trim() === '') {\n                    message = getFieldLabel(field);\n                } else if (field.type === 'email' && !field.validity.valid) {\n                    message = 'Saisissez une adresse e-mail valide.';\n                } else if (field.name === 'code_postal' && !\/^\\d{5}$\/.test(field.value.trim())) {\n                    message = 'Le code postal doit contenir 5 chiffres.';\n                } else if (field.name === 'telephone' && (field.value.replace(\/\\D\/g, '').length < 8 || field.value.replace(\/\\D\/g, '').length > 15)) {\n                    message = 'Saisissez un num\u00e9ro de t\u00e9l\u00e9phone valide (au moins 8 chiffres, indicatif accept\u00e9).';\n                } else if (field.validity && field.validity.patternMismatch) {\n                    message = getFieldLabel(field) + ' : le format saisi n\u2019est pas valide.';\n                }\n\n                if (message) {\n                    isFormValid = false;\n                    field.classList.add('is-invalid');\n                    field.setAttribute('aria-invalid', 'true');\n                    if (!firstInvalidField) firstInvalidField = field;\n                    validationMessages.push(message);\n                    const inlineMessage = (field.type === 'radio' || field.type === 'checkbox')\n                        ? 'Choisissez une r\u00e9ponse.'\n                        : (message === getFieldLabel(field) ? 'Veuillez compl\u00e9ter ce champ.' : message);\n                    fieldErrors.push({ field, message: inlineMessage });\n                }\n            });\n\n            if (!isFormValid) {\n                fieldErrors.forEach(({ field, message }) => setInlineFieldError(field, message));\n                showValidationErrors([...new Set(validationMessages)]);\n                toggleFormParts();\n                \n                if (firstInvalidField) {\n                    const invalidSection = firstInvalidField.closest('.wcdevis-accordion-section');\n                    if (invalidSection) {\n                        const header = invalidSection.querySelector('.wcdevis-accordion-header');\n                        invalidSection.classList.add('wcdevis-highlight-missing');\n                        if (header) header.classList.add('wcdevis-highlight-missing');\n                        if (header && !header.classList.contains('active')) header.click();\n                        setTimeout(() => {\n                            invalidSection.classList.remove('wcdevis-highlight-missing');\n                            if (header) header.classList.remove('wcdevis-highlight-missing');\n                        }, 2200);\n                    }\n                    firstInvalidField.classList.add('wcdevis-highlight-missing');\n                    setTimeout(() => {\n                        firstInvalidField.classList.remove('wcdevis-highlight-missing');\n                    }, 2200);\n                    firstInvalidField.scrollIntoView({ behavior: 'smooth', block: 'center' });\n                    setTimeout(() => firstInvalidField.focus({ preventScroll: true }), 250);\n                }\n                submitButton.disabled = false;\n                return;\n            }\n\n            submitButton.innerHTML = '<i class=\"fas fa-spinner fa-spin\"><\/i> Envoi en cours...';\n            const selectedType = form.querySelector('input[name=\"request_type\"]:checked').value;\n            const formData = new FormData(form);\n            \n            try {\n                const chatSessionId = localStorage.getItem('alaska_chat_session_id');\n                if (chatSessionId) {\n                    formData.append('alaska_chat_session_id', chatSessionId);\n                }\n            } catch (err) {}\n            \n            const action = (selectedType === 'full_quote') ? 'wcdevis_envoyer_devis' : 'wcdevis_envoyer_demande_rappel';\n            formData.set('action', action);\n            \n            try {\n                const response = await fetch(WCDEVIS_AJAX.ajax_url, { method: 'POST', body: formData });\n                let data;\n                try { data = await response.json(); } catch (parseError) { throw new Error('L\u2019envoi n\u2019a pas abouti. V\u00e9rifiez votre connexion puis r\u00e9essayez.'); }\n                \n                if (data.success) {\n                    try {\n                        localStorage.removeItem('wcdevis_marque');\n                        localStorage.removeItem('wcdevis_modele');\n                        localStorage.removeItem('wcdevis_dimension');\n                        localStorage.removeItem('wcdevis_metier');\n                        localStorage.removeItem('wcdevis_catalogue_options');\n                    } catch(e) {}\n                    messagesDiv.textContent = data.data.message;\n                    messagesDiv.className = 'success';\n                    messagesDiv.style.display = 'block';\n                    window.location.href = data.data.redirect;\n                } else {\n                    throw new Error(data.data.message || 'Une erreur est survenue.');\n                }\n            } catch (error) {\n                messagesDiv.textContent = error.message + ' Vos r\u00e9ponses restent dans le formulaire : vous pouvez corriger ou r\u00e9essayer.';\n                messagesDiv.className = 'error';\n                messagesDiv.style.display = 'block';\n                toggleFormParts();\n                messagesDiv.setAttribute('tabindex', '-1');\n                messagesDiv.focus();\n                submitButton.disabled = false;\n            }\n        });\n        \n        setTimeout(() => { sections.forEach(validateSection); updateProgressUI(); }, 100);\n    });\n    <\/script>\n    \n","protected":false},"excerpt":{"rendered":"<p>\u00a0<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-parts\/template-page-builders.php","meta":{"footnotes":""},"class_list":["post-1094","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>demande-devis - Alaska France, Am\u00e9nagement Utilitaire<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/alaska-france.fr\/boutique\/demande-devis\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"demande-devis - Alaska France, Am\u00e9nagement Utilitaire\" \/>\n<meta property=\"og:description\" content=\"\u00a0\" \/>\n<meta property=\"og:url\" content=\"https:\/\/alaska-france.fr\/boutique\/demande-devis\/\" \/>\n<meta property=\"og:site_name\" content=\"Alaska France, Am\u00e9nagement Utilitaire\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-18T16:28:02+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/demande-devis\\\/\",\"url\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/demande-devis\\\/\",\"name\":\"demande-devis - Alaska France, Am\u00e9nagement Utilitaire\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/#website\"},\"datePublished\":\"2025-01-11T10:25:28+00:00\",\"dateModified\":\"2025-12-18T16:28:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/demande-devis\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/demande-devis\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/demande-devis\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"demande-devis\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/#website\",\"url\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/\",\"name\":\"Alaska am\u00e9nagement\",\"description\":\"Depuis 20+ ans, Alaska France am\u00e9nage v\u00e9hicules utilitaires avec meubles en bois pour outillage. Pour professionnels et artisans. Fabrication fran\u00e7aise, direct\",\"publisher\":{\"@id\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/#organization\",\"name\":\"Alaska am\u00e9nagement\",\"url\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/ouverture.png\",\"contentUrl\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/ouverture.png\",\"width\":512,\"height\":512,\"caption\":\"Alaska am\u00e9nagement\"},\"image\":{\"@id\":\"https:\\\/\\\/alaska-france.fr\\\/boutique\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"demande-devis - Alaska France, Am\u00e9nagement Utilitaire","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/alaska-france.fr\/boutique\/demande-devis\/","og_locale":"fr_FR","og_type":"article","og_title":"demande-devis - Alaska France, Am\u00e9nagement Utilitaire","og_description":"\u00a0","og_url":"https:\/\/alaska-france.fr\/boutique\/demande-devis\/","og_site_name":"Alaska France, Am\u00e9nagement Utilitaire","article_modified_time":"2025-12-18T16:28:02+00:00","twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/alaska-france.fr\/boutique\/demande-devis\/","url":"https:\/\/alaska-france.fr\/boutique\/demande-devis\/","name":"demande-devis - Alaska France, Am\u00e9nagement Utilitaire","isPartOf":{"@id":"https:\/\/alaska-france.fr\/boutique\/#website"},"datePublished":"2025-01-11T10:25:28+00:00","dateModified":"2025-12-18T16:28:02+00:00","breadcrumb":{"@id":"https:\/\/alaska-france.fr\/boutique\/demande-devis\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/alaska-france.fr\/boutique\/demande-devis\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/alaska-france.fr\/boutique\/demande-devis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/alaska-france.fr\/boutique\/"},{"@type":"ListItem","position":2,"name":"demande-devis"}]},{"@type":"WebSite","@id":"https:\/\/alaska-france.fr\/boutique\/#website","url":"https:\/\/alaska-france.fr\/boutique\/","name":"Alaska am\u00e9nagement","description":"Depuis 20+ ans, Alaska France am\u00e9nage v\u00e9hicules utilitaires avec meubles en bois pour outillage. Pour professionnels et artisans. Fabrication fran\u00e7aise, direct","publisher":{"@id":"https:\/\/alaska-france.fr\/boutique\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/alaska-france.fr\/boutique\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/alaska-france.fr\/boutique\/#organization","name":"Alaska am\u00e9nagement","url":"https:\/\/alaska-france.fr\/boutique\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/alaska-france.fr\/boutique\/#\/schema\/logo\/image\/","url":"https:\/\/alaska-france.fr\/boutique\/wp-content\/uploads\/2025\/01\/ouverture.png","contentUrl":"https:\/\/alaska-france.fr\/boutique\/wp-content\/uploads\/2025\/01\/ouverture.png","width":512,"height":512,"caption":"Alaska am\u00e9nagement"},"image":{"@id":"https:\/\/alaska-france.fr\/boutique\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/alaska-france.fr\/boutique\/wp-json\/wp\/v2\/pages\/1094","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alaska-france.fr\/boutique\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/alaska-france.fr\/boutique\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/alaska-france.fr\/boutique\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alaska-france.fr\/boutique\/wp-json\/wp\/v2\/comments?post=1094"}],"version-history":[{"count":0,"href":"https:\/\/alaska-france.fr\/boutique\/wp-json\/wp\/v2\/pages\/1094\/revisions"}],"wp:attachment":[{"href":"https:\/\/alaska-france.fr\/boutique\/wp-json\/wp\/v2\/media?parent=1094"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}