/* ================================================================
   Configurateur Tesla — Front-end (réplique du style Porsche)
   ================================================================ */

/* Supprime le padding-block: 40px du wrapper Woodmart UNIQUEMENT
   sur les pages contenant le configurateur (via :has()).
   Le configurateur gère lui-même son espacement vertical. */
.wd-content-layout:has(#ctl-app) {
    padding-block: 0 !important;
    padding-top: 0 !important;
    padding-bottom: 0 !important;
}

.ctl-app, .ctl-app *, .ctl-app *::before, .ctl-app *::after,
.ctl-modal, .ctl-modal *, .ctl-modal *::before, .ctl-modal *::after {
    box-sizing: border-box;
}

/* ======================================================================
   RESET WOODMART : neutralise les styles agressifs du thème sur tous
   nos boutons internes (padding, border-radius, uppercase, min-height...).
   ====================================================================== */
.ctl-app button.ctl-opt-info,
.ctl-app button.ctl-acc-header,
.ctl-app button.ctl-btn,
.ctl-app button.ctl-modal-close,
.ctl-modal button.ctl-modal-close,
.ctl-modal button.ctl-btn,
.ctl-modal button.ctl-modal-thumb,
.ctl-modal button.ctl-modal-action,
.ctl-app button.ctl-reset-btn,
.ctl-app button.ctl-line-remove,
.ctl-app button.ctl-nav-toggle {
    all: revert;
    font-family: inherit !important;
    font-weight: inherit !important;
    text-transform: none !important;
    letter-spacing: 0 !important;
    box-shadow: none !important;
    min-width: 0 !important;
    min-height: 0 !important;
    line-height: 1.5 !important;
    cursor: pointer !important;
    background: transparent;
    border: 0;
    padding: 0;
    margin: 0;
    color: inherit;
}

/* v1.8.0-alpha.7 : variables CSS partagées entre `.ctl-app` ET `.ctl-modal` →
   le modal peut être déplacé sur <body> (pour échapper aux transform Elementor)
   tout en gardant accès aux variables (--ctl-text, --ctl-bg, etc.). */
.ctl-app,
.ctl-modal {
    --ctl-bg:        #ffffff;
    --ctl-bg-soft:   #f4f4f6;
    --ctl-bg-frosted:rgba(154,158,170,.08);
    --ctl-border:    #e8e8ec;
    --ctl-border-2:  #d1d1d6;
    --ctl-text:      #010205;
    --ctl-text-2:    #3d3d42;
    --ctl-text-mute: #6e6e73;
    --ctl-text-soft: rgba(26, 26, 30, 0.7);
    --ctl-accent:    #010205;
    --ctl-success:   #00903d;
    --ctl-radius-sm: 8px;
    --ctl-radius:    12px;
    --ctl-radius-lg: 24px;
    --ctl-shadow-md: 0 6px 24px rgba(0,0,0,.06);
    /* Typographie « Tesla » : Inter (chargé via Google Fonts) avec fallback Helvetica Neue / SF. */
    --ctl-font:      "Inter", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}
.ctl-modal {
    font-family: var(--ctl-font);
    color: var(--ctl-text);
}
.ctl-app {
    /* Force full-viewport (sortir de la contrainte e-con-inner d'Elementor) */
    position: relative !important;
    width: 100vw !important;
    margin-left: calc(50% - 50vw) !important;
    margin-right: calc(50% - 50vw) !important;
    max-width: 100vw !important;

    background: var(--ctl-bg);
    color: var(--ctl-text);
    font-family: var(--ctl-font);
    font-size: 16px;
    line-height: 1.5;
    overflow-x: hidden;
}

.ctl-app img { max-width: 100%; height: auto; display: block; }
.ctl-app button { font-family: inherit; cursor: pointer; }

/* ============== STICKY TOP BAR (desktop only) — style Porsche (v1.7.10) ==============
   Mesurée au pixel sur configurator.porsche.com (911 GT3) :
   - Hauteur barre : 86px (padding 15px 34px)
   - Bouton : 56px de haut, radius 12px, padding 16px 28px, font 16px/400 */
.ctl-topbar {
    display: none;
    background: #fff;
    border-bottom: 1px solid var(--ctl-border);
    /* v1.9 : même ombre basse que le header WoodMart du site */
    box-shadow: 0 1px 8px 0 rgba(0, 0, 0, .1);
    position: sticky;
    top: 0;
    z-index: 50;
}
.ctl-topbar-inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 24px;
    padding: 15px clamp(20px, 2.5vw, 34px);
    max-width: none;
    /* v1.7.15 : height (et non min-height) pour empêcher le topbar de grandir
       quand un modèle est sélectionné et que la vignette apparaît.
       v1.9 : hauteur calée sur la barre blanche du header WoodMart (76px). */
    height: 76px;
}
/* Bloc droite : prix + actions */
.ctl-topbar-right {
    display: flex;
    align-items: center;
    gap: 24px;
}
/* Bouton "← Modèle" gauche : style link-pure Porsche */
.ctl-app button.ctl-topbar-model,
.ctl-topbar-model {
    display: inline-flex !important;
    align-items: center !important;
    gap: 8px !important;
    background: transparent !important;
    border: 0 !important;
    /* v1.7.15 : padding vertical 0 pour rester ≤ 56px (= content area du topbar 86px) */
    padding: 0 4px !important;
    margin: 0 !important;
    cursor: pointer !important;
    font-family: inherit !important;
    font-size: 16px !important;
    font-weight: 400 !important;
    line-height: 1.3 !important;
    color: var(--ctl-text) !important;
    text-transform: none !important;
    letter-spacing: 0 !important;
    min-height: 0 !important;
    text-align: left !important;
    transition: opacity .15s !important;
    max-width: 360px !important;
}
.ctl-app button.ctl-topbar-model:hover,
.ctl-topbar-model:hover { opacity: .65 !important; }
/* Thumb du modèle (v1.7.14) — effet "vignette" :
   - cadre gris arrondi 100×56 plein (background-clip: border-box par défaut)
   - image inset de 10px dans le cadre (background-origin: content-box + padding 10px) */
.ctl-topbar-model-thumb {
    flex: 0 0 auto;
    width: 100px;
    height: 56px;
    border-radius: 8px;
    background-color: var(--ctl-bg-soft);
    background-position: center;
    background-size: contain;
    background-repeat: no-repeat;
    background-origin: content-box;
    padding: 10px;
    box-sizing: border-box;
    transition: opacity .15s;
}
.ctl-topbar-model.is-empty .ctl-topbar-model-thumb { display: none; }
.ctl-topbar-model-label {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
/* v1.8.0-alpha.1 : bloc gauche avec bouton modèle + lien vers landing */
.ctl-topbar-left {
    display: flex;
    align-items: center;
    gap: 16px;
    min-width: 0;
}
/* v1.9 : logo T-Lab à gauche de « Sélectionner un modèle » (desktop).
   max-width calé sur le logo du header (150px), hauteur auto → aucune déformation.
   Sélecteur 2 classes + !important pour battre le `img { max-width: 100% }` du thème
   (sinon le logo s'affiche à sa taille réelle 772×105). */
/* Logo cliquable → accueil (desktop). Le lien se comporte comme l'ancien <img> dans le flex du topbar. */
.ctl-topbar-logo-link {
    display: inline-flex;
    align-items: center;
    flex: 0 0 auto;
    text-decoration: none;
    transition: opacity .15s;
}
.ctl-topbar-logo-link:hover { opacity: .8; }
.ctl-topbar .ctl-topbar-logo {
    flex: 0 0 auto;
    width: auto !important;
    height: auto !important;
    max-width: 150px !important;
    display: block;
    /* v1.9 : un peu d'air entre le logo et « Sélectionner un modèle » (en plus du gap:16) */
    margin-right: 12px;
}
/* Lien "Voir les détails" → landing page modèle (architecture hybride) */
.ctl-topbar-model-details {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    font-size: 13px;
    color: var(--ctl-text-mute);
    text-decoration: underline;
    white-space: nowrap;
    transition: color .15s;
}
.ctl-topbar-model-details:hover { color: var(--ctl-text); }
.ctl-topbar-model-details[hidden] { display: none; }
/* Chevron > visible uniquement quand aucun modèle n'est sélectionné */
.ctl-topbar-model-chevron {
    flex: 0 0 auto;
    color: var(--ctl-text);
    display: none;
}
.ctl-topbar-model.is-empty .ctl-topbar-model-chevron { display: inline-block; }
.ctl-topbar-price {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    line-height: 1.1;
    margin-right: 8px;
}
.ctl-topbar-amount {
    font-size: 16px;
    font-weight: 400;
    color: var(--ctl-text);
    white-space: nowrap;
    line-height: 1.2;
}
.ctl-topbar-vat {
    font-size: 11px;
    color: var(--ctl-text-mute);
    margin-top: 2px;
    line-height: 1;
}
.ctl-topbar-actions {
    display: flex;
    gap: 12px;
    align-items: center;
}
/* v1.9 : taille calée sur le bouton « Configurer ma Tesla » du header WoodMart
   (42px de haut, padding 5/20, font 13/600, radius 5px). */
.ctl-app .ctl-topbar-btn,
.ctl-topbar-btn {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    gap: 8px !important;
    padding: 5px 20px !important;
    border-radius: 5px !important;
    font-size: 13px !important;
    font-weight: 600 !important;
    line-height: 15.6px !important;
    text-decoration: none !important;
    border: 1px solid transparent !important;
    cursor: pointer !important;
    font-family: inherit !important;
    text-transform: none !important;
    letter-spacing: 0 !important;
    min-height: 42px !important;
    height: 42px !important;
    white-space: nowrap !important;
    transition: background .2s, color .2s, border-color .2s !important;
}
.ctl-app .ctl-topbar-btn-ghost,
.ctl-topbar-btn-ghost {
    background: transparent !important;
    color: var(--ctl-text) !important;
    border-color: var(--ctl-text) !important;
}
.ctl-app .ctl-topbar-btn-ghost:hover,
.ctl-topbar-btn-ghost:hover {
    background: var(--ctl-text) !important;
    color: #fff !important;
}
.ctl-app .ctl-topbar-btn-primary,
.ctl-topbar-btn-primary {
    background: var(--ctl-text) !important;
    color: #fff !important;
    border-color: var(--ctl-text) !important;
}
.ctl-app .ctl-topbar-btn-primary:hover,
.ctl-topbar-btn-primary:hover {
    background: #2a2a30 !important;
    border-color: #2a2a30 !important;
    color: #fff !important;
}
.ctl-topbar-btn svg { flex-shrink: 0; width: 15px; height: 15px; }

/* Affichage uniquement desktop ≥ 1024px */
@media (min-width: 1024px) {
    .ctl-topbar { display: block; }
    /* Décale les sticky pour ne pas être cachées par la topbar (76px + 16px d'air) */
    .ctl-app .ctl-stage { top: 92px !important; }
    .ctl-app .ctl-summary-actions { top: 92px !important; }
    /* v1.9 : clic sur « Sélectionner un modèle » (ou « Changer ») → le scrollIntoView
       d'un accordéon s'arrête 16px sous la topbar sticky, pas dessous.
       On retranche la hauteur de la barre admin WP (que scrollIntoView ajoute déjà
       via html{margin-top}) pour atterrir au même endroit en admin ET en visiteur. */
    .ctl-app .ctl-acc { scroll-margin-top: calc(92px - var(--wp-admin--admin-bar--height, 0px)); }

    /* v1.9 : en desktop sur la page configurateur, la .ctl-topbar EST le header.
       On masque la rangée logo/menu du header WoodMart (.whb-general-header), mais on
       GARDE le bandeau du haut (.whb-top-bar : Paris/Montpellier/horaires).
       Desktop only : sur mobile la .ctl-topbar est masquée → le header WoodMart reste. */
    .whb-general-header { display: none !important; }
}

/* v1.9 : le conteneur Elementor qui porte le configurateur a un padding-top de 10px.
   On l'annule pour coller le configurateur juste sous le header — desktop ET mobile
   (sinon il reste un écart de 10px sous le header WoodMart en mobile). Règle globale. */
.e-con-inner:has(#ctl-app) { padding-top: 0 !important; }

/* ============== GRILLE PRINCIPALE (proportions Porsche : 65/30) ============== */
.ctl-main {
    display: grid;
    grid-template-columns: minmax(0, 1.95fr) minmax(420px, 0.85fr);
    gap: clamp(20px, 2vw, 40px);
    align-items: start;
    max-width: none;
    margin: 0;
    padding: 24px clamp(16px, 2vw, 36px) 0;
}

/* ============== STAGE GAUCHE (visuel sticky) ============== */
.ctl-app { overflow-x: clip !important; overflow-y: visible !important; }
.ctl-stage {
    position: sticky !important;
    top: 24px !important;
    align-self: start !important;
    z-index: 20 !important;
}
.ctl-panel { z-index: 1 !important; }
.ctl-stage-inner {
    position: relative;
    width: 100%;
    aspect-ratio: 16 / 9;
    background: var(--ctl-bg-soft);
    border-radius: var(--ctl-radius-lg);
    overflow: hidden;
    display: flex; align-items: center; justify-content: center;
}
.ctl-vehicle { position: relative; width: 100%; height: 100%; }
.ctl-vehicle-base {
    width: 100%; height: 100%; object-fit: contain;
}
.ctl-vehicle-overlays {
    position: absolute; inset: 0; pointer-events: none;
}
.ctl-vehicle-overlays img {
    position: absolute; inset: 0;
    width: 100%; height: 100%; object-fit: contain;
    opacity: 0; transition: opacity .35s ease;
}
.ctl-vehicle-overlays img.is-visible { opacity: 1; }

/* Slider d'images principales — overlay au-dessus du placeholder */
.ctl-vehicle-slider {
    position: absolute;
    inset: 0;
    pointer-events: none;
    opacity: 0;
    transition: opacity .25s ease;
    z-index: 2;
    touch-action: pan-y;     /* autorise scroll vertical, capture swipe horizontal */
    user-select: none;
    -webkit-user-select: none;
    cursor: grab;
    /* GPU compositing : évite le repaint pendant le scroll mobile */
    transform: translateZ(0);
    -webkit-transform: translateZ(0);
}
.ctl-vehicle-slider:active { cursor: grabbing; }
/* v1.8.19 : background neutre quand le slider est visible — sinon, avec background-size:
   contain, l'image base du véhicule transparaissait dans les bandes vides (letterbox).
   On masque la base vehicle pour que le slider d'option soit clairement seul à l'écran. */
.ctl-vehicle-slider.is-visible {
    opacity: 1;
    pointer-events: auto;
    background: var(--ctl-bg-soft);
}

.ctl-vehicle-slide {
    position: absolute;
    inset: 0;
    background-position: center;
    background-repeat: no-repeat;
    background-size: contain;
    opacity: 0;
    transition: opacity .6s ease;
}
.ctl-vehicle-slide.is-active { opacity: 1; }

/* v1.8.22 : bande de miniatures sous le stage — réplique EXACTE des thumbs modale.
   On cible via [data-stage-thumbs] (data attr indépendant de la classe) et on style
   les <button> directement → fonctionne quel que soit le nom de classe (ctl-stage-thumb
   legacy ou ctl-modal-thumb). !important nécessaire pour battre les overrides WoodMart
   sur les boutons (qui appliquent padding:5px 20px, background gris, etc.). */
.ctl-stage > [data-stage-thumbs] {
    display: none;
    gap: 8px;
    overflow-x: auto;
    scrollbar-width: thin;
    scrollbar-color: var(--ctl-border-2) transparent;
    padding: 12px 0 4px;
}
.ctl-stage > [data-stage-thumbs].is-visible { display: flex; }
.ctl-stage > [data-stage-thumbs]::-webkit-scrollbar { height: 6px; }
.ctl-stage > [data-stage-thumbs]::-webkit-scrollbar-thumb { background: var(--ctl-border-2); border-radius: 3px; }

/* Style des boutons thumb — réplique stricte des thumbs modal */
.ctl-stage > [data-stage-thumbs] button {
    flex: 0 0 auto !important;
    width: 100px !important;
    height: 56px !important;
    padding: 2px !important;
    border: 2px solid transparent !important;
    border-radius: 12px !important;
    background: transparent !important;
    cursor: pointer !important;
    transition: border-color .2s !important;
    min-height: 0 !important;
    box-shadow: none !important;
}
.ctl-stage > [data-stage-thumbs] button:hover {
    border-color: var(--ctl-border-2) !important;
    background: transparent !important;
}
.ctl-stage > [data-stage-thumbs] button.is-active {
    border-color: var(--ctl-text) !important;
}
.ctl-stage > [data-stage-thumbs] button img {
    width: 100% !important;
    height: 100% !important;
    object-fit: cover !important;
    border-radius: 8px !important;
    display: block !important;
    pointer-events: none !important;
    max-width: none !important;
    vertical-align: top !important;
}

@media (max-width: 1023px) {
    .ctl-stage > [data-stage-thumbs].is-visible { display: none; }
}

/* v1.8.18 : les anciens dots de pagination (.ctl-vehicle-slider-dots) sont remplacés
   par la bande de thumbs sous le stage. On les masque pour ne pas avoir de doublon. */
.ctl-vehicle-slider-dots { display: none !important; }

.ctl-vehicle-slider-dots {
    position: absolute;
    left: 50%;
    bottom: 20px;
    transform: translateX(-50%);
    display: flex;
    gap: 10px;
    z-index: 3;
}
html body #ctl-app .ctl-vehicle-slider-dot {
    width: 12px !important;
    height: 12px !important;
    min-width: 0 !important;
    min-height: 0 !important;
    max-width: 12px !important;
    max-height: 12px !important;
    padding: 0 !important;
    margin: 0 !important;
    border: none !important;
    border-radius: 50% !important;
    background: rgba(255, 255, 255, .55) !important;
    cursor: pointer !important;
    display: inline-block !important;
    box-sizing: border-box !important;
    line-height: 1 !important;
    font-size: 0 !important;
    text-indent: 0 !important;
    outline: none !important;
    appearance: none !important;
    -webkit-appearance: none !important;
    box-shadow: 0 1px 3px rgba(0, 0, 0, .35) !important;
    transition: background .2s ease, transform .2s ease !important;
    flex: 0 0 12px !important;
}
html body #ctl-app .ctl-vehicle-slider-dot:hover { background: rgba(255, 255, 255, .85) !important; }
html body #ctl-app .ctl-vehicle-slider-dot.is-active {
    background: #fff !important;
    transform: scale(1.2) !important;
}

/* Mobile : dots plus discrets */
@media (max-width: 1023px) {
    html body #ctl-app .ctl-vehicle-slider-dots {
        bottom: 12px;
        gap: 8px;
    }
    html body #ctl-app .ctl-vehicle-slider-dot {
        width: 9px !important;
        height: 9px !important;
        max-width: 9px !important;
        max-height: 9px !important;
        flex: 0 0 9px !important;
    }
}

.ctl-stage-meta { margin-top: 18px; padding: 0 4px; }
.ctl-stage-model {
    font-size: clamp(28px, 2vw + 16px, 40px);
    font-weight: 400;
    line-height: 1.2;
    letter-spacing: -.3px;
    margin: 0;
    color: var(--ctl-text);
}
.ctl-stage-tagline {
    font-size: 14px; color: var(--ctl-text-mute);
    margin: 6px 0 0;
}

/* ============== PANEL DROIT ============== */
.ctl-panel { min-width: 0; }

/* v1.7.22 : .ctl-mini-summary supprimé du template — la topbar (desktop) et la sticky
   bottom-bar (mobile) suffisent pour afficher le prix total. */

/* ============== ACCORDEONS ============== */
.ctl-accordions {
    display: flex; flex-direction: column;
    gap: 10px;
    padding-bottom: 60px;
}

.ctl-acc {
    border: 1px solid var(--ctl-border);
    border-radius: var(--ctl-radius-lg);
    background: #fff;
    overflow: hidden;
    transition: border-color .2s, box-shadow .2s;
}
.ctl-acc.is-open {
    border-color: var(--ctl-border);
}
.ctl-acc.is-disabled-group { display: none; }

/* v1.7.20 : padding 16px SYMÉTRIQUE (exact Porsche : 16px sur les 4 côtés).
   - Titre toujours centré verticalement (ouvert ET fermé), hauteur header constante 61px.
   - Espacement géré côté .ctl-acc-body-content via :has() pour adapter au cas avec/sans intro. */
.ctl-acc-header {
    width: 100%;
    background: transparent;
    border: none;
    padding: 16px;
    display: flex; align-items: center; justify-content: space-between;
    gap: 16px;
    cursor: pointer;
    text-align: left;
    color: var(--ctl-text);
    min-height: 0;
}
/* v1.5.3 : hover transparent (pas de fond gris au survol des titres) */
.ctl-acc-header:hover { background: transparent; }

.ctl-acc-title-wrap {
    display: flex; align-items: center; gap: 12px;
    flex: 1; min-width: 0;
}
.ctl-acc-chevron-wrap {
    width: 28px; height: 28px;
    display: flex; align-items: center; justify-content: center;
    border-radius: 50%;
    transition: background .15s;
    flex: 0 0 auto;
}
.ctl-acc:hover .ctl-acc-chevron-wrap { background: transparent; }
.ctl-acc-chevron {
    transition: transform .25s cubic-bezier(.4, 0, .2, 1);
    color: var(--ctl-text-2);
}
.ctl-acc.is-open .ctl-acc-chevron {
    transform: rotate(180deg);
    color: var(--ctl-text);
}
/* v1.6.1 : titre groupe 21px/600 line-height 1.4 (match Porsche h2 = 20.9px) —
   crée une vraie hiérarchie visuelle avec les sub-titles (16px/600) et options (16px/400) */
.ctl-acc-title {
    font-size: 21px; font-weight: 600;
    margin: 0; line-height: 1.4;
    color: var(--ctl-text);
}
.ctl-acc-count {
    display: inline-flex; align-items: center; justify-content: center;
    min-width: 26px; height: 26px;
    padding: 0 9px;
    border-radius: 13px;
    background: var(--ctl-bg-soft);
    color: var(--ctl-text-2);
    font-size: 13px; font-weight: 600;
}
.ctl-acc.is-open .ctl-acc-count {
    background: var(--ctl-text);
    color: #fff;
}

/* v1.5.3 : animation smooth height collapse (style Porsche)
   - Fermeture : 0.22s avec curve "ease-out" → rabattement immédiat sans décalage
   - Ouverture : 0.4s avec curve "decelerate" → expansion smooth Porsche
   - Padding-top 14px en ouvert → gap titre/cards aligné Porsche (~14.64px py-fluid-sm) */
/* v1.7.20 : animation accordéon style Porsche — 3 niveaux de wrapping :
   - .ctl-acc-body : grid container (grid-template-rows 0fr ↔ 1fr) + overflow hidden
   - .ctl-acc-body-inner : clipper + fondu (opacity), AUCUN padding (sinon min-content > 0)
   - .ctl-acc-body-content : porte le padding vertical (24/40), clippé quand body est 0fr
   → Aucune "remontée" du contenu, aucun snap/accroche à la fin, body 100% à 0px quand fermé.
   Horizontal 16px partout (header + body) = exact Porsche. */
.ctl-acc-body {
    display: grid;
    grid-template-rows: 0fr;
    padding: 0 16px;
    overflow: hidden;
    transition: grid-template-rows .3s cubic-bezier(.42, 0, .58, 1);
}
.ctl-acc.is-open .ctl-acc-body {
    grid-template-rows: 1fr;
    transition: grid-template-rows .3s cubic-bezier(0, 0, .2, 1);
}
/* Inner : clipper transparent par défaut, opacité instantanée à l'ouverture,
   fade lent à la fermeture (Porsche-like). AUCUN padding. */
.ctl-acc-body-inner {
    overflow: hidden;
    min-height: 0;
    opacity: 0;
    transition: opacity .25s cubic-bezier(.42, 0, .58, 1);
}
.ctl-acc.is-open .ctl-acc-body-inner {
    opacity: 1;
    transition: opacity .06s ease-out;
}
/* Content : porte le padding vertical (sans affecter le min-content du grid parent) */
.ctl-acc-body-content {
    padding: 24px 0 40px;
}
/* Padding-top resserré quand intro présent (groupe avec description) */
.ctl-acc-body:has(.ctl-acc-intro) .ctl-acc-body-content {
    padding-top: 4px;
}
.ctl-acc-intro {
    font-size: 14px; color: var(--ctl-text-2);
    margin: 0 0 18px;
    line-height: 1.5;
}

/* ============== SUB-GROUPE (sub_label) ============== */
.ctl-sub-group { margin-top: 18px; }
.ctl-sub-group:first-child { margin-top: 0; }
/* v1.7.16 : sous-groupe en style "eyebrow" — moins contrasté
   pour marquer la subordination hiérarchique sous le titre groupe. */
.ctl-sub-group-title {
    font-size: 13px;
    font-weight: 600;
    color: var(--ctl-text-mute);
    text-transform: uppercase;
    letter-spacing: .6px;
    line-height: 1.3;
    margin: 0 0 12px;
}
/* Sous-groupe « répété par option parente » — variante « par carte » :
   pastille « Teinte : X% » au pied de la carte fenêtre + panneau de vignettes déplié dans la carte. */
.ctl-app .ctl-tint-chip {
    display: inline-flex; align-items: center; gap: 5px;
    /* Pas de margin-right : l'écart avec la coche vient du gap 12px de .ctl-model-card-bottom
       (cohérent avec l'écart prix→pastille). L'ancien margin 8px créait un écart de 20px. */
    padding: 6px 12px; border-radius: var(--ctl-radius-sm); /* 8px — même rayon que la coche .ctl-opt-check de la rangée */
    font-size: 13px; font-weight: 500; line-height: 1;
    background: var(--ctl-bg-frosted); color: var(--ctl-text-2);
    border: 1px solid var(--ctl-border-2);
    cursor: pointer; white-space: nowrap;
    transition: all .15s;
}
.ctl-app .ctl-tint-chip:hover { border-color: var(--ctl-text); }
.ctl-app .ctl-tint-chip.is-open { background: var(--ctl-blue); color: var(--ctl-bg); border-color: var(--ctl-blue); }
/* Chevron identique au filtre « Type de couleur » (.ctl-cp-selectwrap::after) : carré bordé tourné à 45°,
   nettement plus visible que l'ancien caractère ▾. currentColor → suit la couleur du chip (foncé fermé,
   blanc ouvert). L'orientation vient de .is-open (bas quand fermé, haut quand ouvert). */
.ctl-app .ctl-tint-caret {
    display: inline-block;
    width: 8px; height: 8px;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    transform: translateY(-2px) rotate(45deg);   /* pointe vers le BAS (fermé) */
    transition: transform .15s ease;
}
.ctl-app .ctl-tint-chip.is-open .ctl-tint-caret {
    transform: translateY(1px) rotate(-135deg);   /* pointe vers le HAUT (ouvert) */
}
.ctl-app .ctl-tint-panel {
    padding: 12px;
    border-top: 1px solid var(--ctl-border);
    background: var(--ctl-bg-soft);
    border-radius: 0 0 var(--ctl-radius) var(--ctl-radius);
}
.ctl-app .ctl-tint-panel-head { font-size: 12px; color: var(--ctl-text-mute); margin: 0 0 10px; }
/* Sous une carte HORIZONTALE (model-card, host sans bordure) : le panneau est un drawer autonome
   posé sous la carte (bordure + radius complets, léger écart). */
.ctl-app .ctl-model-card-host .ctl-tint-panel {
    margin-top: 8px;
    border: 2px solid rgba( 26, 26, 30, .15 );
    border-radius: var(--ctl-radius);
}
/* MOBILE : la ligne du bas de la carte horizontale (prix + coche) est trop étroite pour aussi
   contenir la pastille « Teinte » → elle chevauchait le prix. On passe en flex-wrap : prix + coche
   restent sur la 1ʳᵉ ligne (coche à droite), la pastille descend sur sa propre ligne pleine largeur. */
@media (max-width: 600px) {
    .ctl-app .ctl-model-card-bottom { flex-wrap: wrap; }
    .ctl-app .ctl-model-card-bottom .ctl-model-card-price,
    .ctl-app .ctl-model-card-bottom .ctl-model-card-subtitle { order: 1; }
    .ctl-app .ctl-model-card-bottom .ctl-opt-check,
    .ctl-app .ctl-model-card-bottom .ctl-model-radio { order: 2; }
    .ctl-app .ctl-model-card-bottom .ctl-tint-chip {
        order: 3; flex: 1 0 100%; margin: 10px 0 0; justify-content: center;
    }
    /* Vignettes de teinte : 4 par ligne, alignées à GAUCHE (flux gauche→droite, dernière ligne
       partielle à gauche). Écarts identiques : la grille n'a pas de padding → l'écart aux bords vient
       du padding du panneau (12px) = l'écart entre vignettes (gap 12px). Une ligne pleine paraît centrée. */
    .ctl-app .ctl-tint-panel .ctl-swatch-grid {
        grid-template-columns: repeat(4, 1fr);
        gap: 12px;
        padding: 0;
    }
}

/* === SWATCH GRID (style Porsche "Couleurs") ===
   Pastilles carrées 72×72 FIXES — ne s'étirent pas selon le nombre d'items,
   wrap à la ligne suivante si trop d'items. */
.ctl-app .ctl-swatch-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, 72px);
    justify-content: start;
    gap: 8px;
    /* v1.8.5 : padding latéral 5px pour laisser de la place à l'outline du swatch
       sélectionné (outline-offset 2px + outline-width 1.5px = 3.5px), sinon l'outline
       gauche du leftmost swatch est tronqué par .ctl-acc-body-inner (overflow:hidden
       requis pour l'animation de l'accordéon). */
    padding: 4px 5px 4px;
}
.ctl-app .ctl-opt-swatch {
    position: relative;
    aspect-ratio: 1 / 1;
    width: 100%;
    padding: 0;
    margin: 0;
    background: transparent;
    border: 0;
    border-radius: 12px;
    outline: 1.5px solid transparent;
    outline-offset: 2px;
    overflow: visible;
    cursor: pointer;
    transition: outline-color .2s ease;
}
.ctl-app .ctl-opt-swatch:hover { outline-color: var(--ctl-text); }
.ctl-app .ctl-opt-swatch.is-selected { outline-color: var(--ctl-text); }
.ctl-app .ctl-opt-swatch.is-disabled { opacity: .45; cursor: not-allowed; }
.ctl-app .ctl-opt-swatch.is-disabled:hover { outline-color: transparent; }

/* Pastille avec légende « nom + prix » (activée par sous-groupe via le builder).
   La pastille passe en colonne : image carrée en haut, nom + prix discrets en dessous. */
.ctl-app .ctl-opt-swatch.has-caption {
    aspect-ratio: auto;
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 6px;
}
.ctl-app .ctl-opt-swatch.has-caption .ctl-opt-swatch-img {
    height: auto;
    aspect-ratio: 1 / 1;
}
.ctl-app .ctl-opt-swatch-caption {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1px;
    text-align: center;
    line-height: 1.2;
    padding: 0 1px;
    /* La pastille est un <button> : WoodMart lui impose uppercase + letter-spacing.
       On neutralise pour garder une casse naturelle, cohérente avec les titres de cartes. */
    text-transform: none;
    letter-spacing: normal;
}
.ctl-app .ctl-opt-swatch-name {
    font-size: 12px;
    font-weight: 400;
    color: var(--ctl-text);
    text-transform: none;
}
.ctl-app .ctl-opt-swatch-price {
    font-size: 11px;
    font-weight: 400;
    color: var(--ctl-text-mute);
    text-transform: none;
}

.ctl-app .ctl-opt-swatch-img {
    display: block;
    width: 100%;
    height: 100%;
    border-radius: 12px;
    background-color: var(--ctl-bg-soft);
    background-position: center;
    background-size: cover;
    background-repeat: no-repeat;
    overflow: hidden;
    position: relative;
}
.ctl-app .ctl-opt-swatch-placeholder {
    position: absolute; inset: 0;
    display: flex; align-items: center; justify-content: center;
    padding: 6px;
    font-size: 10px;
    line-height: 1.15;
    text-align: center;
    color: var(--ctl-text-mute);
    background:
        repeating-linear-gradient(45deg,
            rgba(0,0,0,.015) 0 14px,
            rgba(0,0,0,.03) 14px 28px);
}
.ctl-app .ctl-opt-swatch .ctl-opt-soon {
    position: absolute;
    top: 4px; right: 4px;
    background: var(--ctl-text);
    color: #fff;
    font-size: 10px;
    font-weight: 600;
    padding: 2px 6px;
    border-radius: 6px;
    pointer-events: none;
}

/* ============================================================
   GRILLE D'OPTIONS — 2 colonnes (style Porsche "Packs")
   ============================================================ */
.ctl-opt-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 14px;
}

/* ============================================================
   CARTE OPTION — réplique exacte Porsche "Packs"
   ============================================================ */
.ctl-opt {
    position: relative;
    display: flex; flex-direction: column;
    align-items: stretch;
    background: #fff;
    border: 2px solid var(--ctl-border);
    border-radius: var(--ctl-radius);
    overflow: hidden;
    transition: border-color .2s;
    cursor: pointer;
    text-align: left;
    color: var(--ctl-text);
    font-family: inherit;
    height: 100%;
}
.ctl-opt:hover { border-color: var(--ctl-text); }
.ctl-opt.is-selected { border-color: var(--ctl-text); }
.ctl-opt.is-disabled {
    opacity: .55;
    cursor: not-allowed;
}
.ctl-opt.is-disabled:hover { border-color: var(--ctl-border); }

/* Header : image + sticker "i" */
.ctl-opt-header {
    position: relative;
    width: 100%;
    display: flex; flex-direction: column;
}

/* Image en haut, 16:9, full width */
.ctl-opt-thumb {
    position: relative;
    width: 100%;
    aspect-ratio: 16 / 9;
    background: var(--ctl-bg-soft);
    overflow: hidden;
}
.ctl-opt-thumb img {
    width: 100%; height: 100%;
    object-fit: cover;
}
.ctl-opt-thumb-placeholder {
    width: 100%; height: 100%;
    display: flex; align-items: center; justify-content: center;
    color: var(--ctl-text-mute);
    font-size: 11px;
    background:
        repeating-linear-gradient(45deg,
            rgba(0,0,0,.015) 0 14px,
            rgba(0,0,0,.03) 14px 28px);
}

/* "i" sticker en haut-gauche : fond gris, angle bas-droit arrondi uniquement */
.ctl-app .ctl-opt-info {
    position: absolute !important;
    top: 0 !important; left: 0 !important;
    width: 32px !important; height: 32px !important;
    border-radius: 0 0 var(--ctl-radius-sm) 0 !important;
    background: var(--ctl-bg-soft) !important;
    color: var(--ctl-text) !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    z-index: 5 !important;
    overflow: hidden !important;
    transition: background .15s !important;
}
.ctl-app .ctl-opt-info:hover { background: var(--ctl-bg-frosted) !important; }
.ctl-app .ctl-opt-info svg {
    width: 18px !important; height: 18px !important;
    display: block !important;
    color: var(--ctl-text) !important;
}

/* Header accordion (override Woodmart) — v1.7.20 : symétrique 16px sur les 4 côtés */
.ctl-app .ctl-acc-header {
    width: 100% !important;
    padding: 16px !important;
    display: flex !important;
    align-items: center !important;
    justify-content: space-between !important;
    gap: 16px !important;
    text-align: left !important;
    color: var(--ctl-text) !important;
    background: transparent !important;
    border-radius: 24px 24px 0 0 !important;
    min-height: 0 !important;
    font-size: 16px !important;
    font-weight: 400 !important;
    line-height: 1.2 !important;
}
.ctl-app .ctl-acc-header:hover { background: transparent !important; }

/* Boutons primaires/ghost dans le récap (override Woodmart) */
.ctl-app .ctl-btn {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    gap: 8px !important;
    padding: 14px 18px !important;
    border-radius: 12px !important;
    font-size: 14px !important;
    font-weight: 600 !important;
    text-decoration: none !important;
    border: 1px solid transparent !important;
    cursor: pointer !important;
    transition: background .2s, color .2s, border-color .2s !important;
}
.ctl-app .ctl-btn-primary,
.ctl-modal .ctl-btn-primary {
    background: var(--ctl-text) !important;
    color: #fff !important;
    border-color: var(--ctl-text) !important;
}
.ctl-app .ctl-btn-primary:hover,
.ctl-modal .ctl-btn-primary:hover { background: #2a2a30 !important; border-color: #2a2a30 !important; }
.ctl-app .ctl-btn-ghost,
.ctl-modal .ctl-btn-ghost {
    background: transparent !important;
    color: var(--ctl-text) !important;
    border-color: var(--ctl-text) !important;
}
.ctl-app .ctl-btn-ghost:hover { background: var(--ctl-text) !important; color: #fff !important; }

/* Modal close (override Woodmart) — fonctionne aussi quand modal déplacé sur <body> */
.ctl-app .ctl-modal-close,
.ctl-modal .ctl-modal-close {
    position: absolute !important;
    top: 16px !important; right: 16px !important;
    width: 38px !important; height: 38px !important;
    border-radius: 50% !important;
    background: rgba(255,255,255,.95) !important;
    border: 1px solid var(--ctl-border) !important;
    color: var(--ctl-text) !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
}
.ctl-app .ctl-modal-close:hover,
.ctl-modal .ctl-modal-close:hover {
    background: var(--ctl-text) !important; color: #fff !important; border-color: var(--ctl-text) !important;
}

/* Reset btn */
.ctl-app .ctl-reset-btn {
    margin-top: 14px !important;
    color: var(--ctl-text-mute) !important;
    font-size: 12px !important;
    text-decoration: underline !important;
    width: 100% !important;
    padding: 6px !important;
    background: transparent !important;
    border: none !important;
    text-align: center !important;
}
.ctl-app .ctl-reset-btn:hover { color: var(--ctl-text) !important; }

/* Line remove (× dans le récap) */
.ctl-app .ctl-line-remove {
    background: transparent !important;
    border: none !important;
    color: var(--ctl-text-mute) !important;
    padding: 0 4px !important;
    font-size: 18px !important;
    line-height: 1 !important;
}
.ctl-app .ctl-line-remove:hover { color: var(--ctl-text) !important; }

/* Badge "Bientôt" en haut-droite */
.ctl-opt-soon {
    position: absolute;
    top: 8px; right: 8px;
    background: var(--ctl-text);
    color: #fff;
    font-size: 10px; font-weight: 600;
    padding: 4px 8px;
    border-radius: 10px;
    text-transform: uppercase;
    letter-spacing: .5px;
    z-index: 2;
}

/* Contenu sous l'image */
.ctl-opt-content {
    display: flex; flex-direction: column;
    flex: 1;
    padding: 12px;
    gap: 12px;
    justify-content: space-between;
}
.ctl-opt-text {
    display: flex; flex-direction: column;
    gap: 2px;
    min-width: 0;
}
.ctl-opt-title {
    font-size: 16px; font-weight: 400;
    line-height: 1.5;
    margin: 0;
    color: var(--ctl-text);
    word-break: break-word;
    hyphens: auto;
}
.ctl-opt-subtitle {
    /* Sous-titre / description courte affiché entre le titre et le prix */
    font-size: 13px;
    font-weight: 400;
    color: var(--ctl-text-soft);
    margin: 2px 0 0;
    line-height: 1.4;
}
.ctl-opt-price {
    font-size: 16px; font-weight: 400;
    color: var(--ctl-text-soft);
    margin: 0;
}

/* Footer : juste la checkbox alignée à droite */
.ctl-opt-footer {
    display: flex; align-items: center; justify-content: flex-end;
}

/* CHECKBOX carrée style Porsche */
.ctl-opt-check {
    width: 28px; height: 28px;
    border-radius: var(--ctl-radius-sm);
    border: 1px solid var(--ctl-border-2);
    background: var(--ctl-bg-frosted);
    display: inline-flex; align-items: center; justify-content: center;
    transition: all .15s;
    flex: 0 0 auto;
    position: relative;
}
.ctl-opt:hover .ctl-opt-check { border-color: var(--ctl-text); }
.ctl-opt.is-selected .ctl-opt-check {
    border-color: var(--ctl-text);
    background: var(--ctl-text);
}
.ctl-opt.is-selected .ctl-opt-check::after {
    content: "";
    width: 16px; height: 16px;
    background-image: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23fff'%3E%3Cpath d='m20.22 7.47-1.47-1.42-9.26 9.02-4.24-4.15-1.47 1.42 5.71 5.6 10.73-10.47Z'/%3E%3C/svg%3E");
    background-size: contain;
    background-repeat: no-repeat;
    background-position: center;
}

/* ============== RECAP EN BAS ============== */
.ctl-summary-section {
    background: var(--ctl-bg-soft);
    border-top: 1px solid var(--ctl-border);
    /* Padding horizontal aligné sur .ctl-main (même formule) */
    padding: 56px clamp(16px, 2vw, 36px) 80px;
    margin-top: 60px;
}
.ctl-summary-inner { max-width: none; margin: 0; }
.ctl-summary-header {
    display: flex; align-items: baseline; justify-content: space-between;
    flex-wrap: wrap; gap: 16px;
    margin-bottom: 28px;
}
.ctl-summary-title {
    font-size: 28px; font-weight: 600; margin: 0;
    letter-spacing: -.2px;
}
.ctl-summary-subtitle {
    color: var(--ctl-text-mute); font-size: 14px; margin: 6px 0 0;
}

.ctl-summary-grid {
    display: grid;
    /* Mêmes proportions que .ctl-main (colonne stage / colonne accordéons)
       pour aligner visuellement les blocs haut et bas. */
    grid-template-columns: minmax(0, 1.95fr) minmax(420px, 0.85fr);
    gap: clamp(20px, 2vw, 40px);
    align-items: start;
}

/* === RECAP STYLE PORSCHE "Votre équipement sélectionné" (v1.7.8) ===
   Valeurs mesurées sur configurator.porsche.com (911 GT3)  */
.ctl-summary-list {
    background: #fff;
    border: 1px solid var(--ctl-border);
    border-radius: var(--ctl-radius-lg);
    padding: 24px 32px;
}
.ctl-summary-empty {
    color: var(--ctl-text-mute);
    text-align: center;
    padding: 40px 0;
    font-size: 14px;
}
.ctl-summary-group {
    border-top: none;
    padding: 0;
    margin-top: 16px;
}
.ctl-summary-group:first-child { margin-top: 0; }

/* Titre de section + tag compteur + border-bottom */
.ctl-summary-group-title {
    display: flex;
    align-items: center;
    gap: 7px;
    font-size: 16px;
    font-weight: 600;
    line-height: 1.5;
    color: var(--ctl-text);
    text-transform: none;
    letter-spacing: 0;
    padding: 0 0 15px;
    margin: 0;
    border-bottom: 1px solid rgba(79, 80, 89, .325);
}
.ctl-summary-group-tag {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: var(--ctl-bg-soft);
    color: var(--ctl-text);
    border-radius: 999px;
    font-size: 12px;
    font-weight: 600;
    padding: 2px 9px;
    min-width: 22px;
    height: 22px;
    line-height: 1;
}

/* Ligne option : 3 colonnes (titre+thumb / prix / Changer) */
.ctl-summary-line {
    display: grid;
    grid-template-columns: 6.5fr 3fr 1.5fr;
    gap: 15px;
    padding: 16px 0;
    margin: 0;
    border-bottom: 1px solid rgba(79, 80, 89, .325);
    align-items: flex-start;
    font-size: 14px;
    line-height: 1.5;
    color: var(--ctl-text);
}
/* Dernière ligne du groupe : pas de double séparateur avec le titre suivant */
.ctl-summary-group .ctl-summary-line:last-child { border-bottom: 0; }

/* Colonne 1 : thumb + titre */
.ctl-line-main {
    display: flex;
    gap: 15px;
    align-items: flex-start;
    min-width: 0;
}
.ctl-line-thumb {
    width: 48px;
    height: 48px;
    flex: 0 0 48px;
    border-radius: 6px;
    background-color: var(--ctl-bg-soft);
    background-position: center;
    background-size: contain;
    background-repeat: no-repeat;
}
.ctl-line-title {
    color: var(--ctl-text);
    font-weight: 400;
    line-height: 1.5;
    word-break: break-word;
}

/* Colonne 2 : prix */
.ctl-summary-line .ctl-line-price {
    justify-self: end;
    text-align: right;
    color: var(--ctl-text);
    font-weight: 400;
    font-size: 14px;
}

/* Colonne 3 : lien "Changer ›" */
.ctl-app button.ctl-line-changer,
.ctl-line-changer {
    justify-self: end;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    color: var(--ctl-text);
    font-weight: 400;
    text-decoration: none;
    font-size: 14px;
    line-height: 1.5;
    background: transparent;
    border: 0;
    padding: 0;
    margin: 0;
    min-height: 0;
    cursor: pointer;
    font-family: inherit;
    text-transform: none;
    letter-spacing: 0;
}
.ctl-app button.ctl-line-changer:hover,
.ctl-line-changer:hover { text-decoration: underline; }
.ctl-line-changer svg { width: 14px; height: 14px; }

.ctl-summary-actions-title {
    font-size: 18px;
    font-weight: 600;
    color: var(--ctl-text);
    margin: 0 0 16px 0;
    letter-spacing: -.1px;
}

.ctl-summary-actions {
    background: #fff;
    border: 1px solid var(--ctl-border);
    border-radius: var(--ctl-radius-lg);
    padding: 24px;
    position: sticky;
    top: 24px;
}
.ctl-total-row {
    /* Style Porsche : label au-dessus, montant en dessous, alignés à gauche */
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 4px;
    padding-bottom: 16px;
    border-bottom: 1px solid var(--ctl-border);
    margin-bottom: 20px;
}
.ctl-total-label {
    font-size: 16px;
    font-weight: 500;             /* Medium (style Porsche) */
    color: rgba(26, 26, 30, .7);
    letter-spacing: normal;
    line-height: 1.5;
}
.ctl-total-amount {
    font-size: 27px;
    font-weight: 400;             /* Regular style Porsche (pas bold) */
    color: var(--ctl-text);
    letter-spacing: normal;
    line-height: 1.34;
}

.ctl-actions { display: flex; flex-direction: column; gap: 10px; }
.ctl-btn {
    display: inline-flex; align-items: center; justify-content: center;
    gap: 8px;
    padding: 14px 18px;
    border-radius: 12px;
    font-size: 14px; font-weight: 600;
    text-decoration: none;
    border: 1px solid transparent;
    transition: background .2s, color .2s, border-color .2s;
    cursor: pointer;
    font-family: inherit;
}
.ctl-btn-primary {
    background: var(--ctl-text);
    color: #fff;
    border-color: var(--ctl-text);
}
.ctl-btn-primary:hover { background: #2a2a30; border-color: #2a2a30; color: #fff; }
.ctl-btn-ghost {
    background: transparent;
    color: var(--ctl-text);
    border-color: var(--ctl-text);
}
.ctl-btn-ghost:hover { background: var(--ctl-text); color: #fff; }

.ctl-reset-btn {
    margin-top: 14px;
    background: transparent; border: none;
    color: var(--ctl-text-mute);
    font-size: 12px; text-decoration: underline;
    width: 100%; padding: 6px;
    cursor: pointer;
    font-family: inherit;
}
.ctl-reset-btn:hover { color: var(--ctl-text); }

/* ============== MODALE PAR DEFAUT ============== */
/* v1.8.1 : modale collée en bas du viewport, full-width edge-to-edge.
   - flex-end pour aligner en bas
   - aucun padding latéral (modale bord-à-bord)
   - hauteur calc(100vh - 120px) → laisse voir le header en haut */
.ctl-modal {
    position: fixed; inset: 0;
    z-index: 999999;
    display: none;
    align-items: flex-end;
    justify-content: center;
    padding: 0;
}
.ctl-modal[aria-hidden="false"] { display: flex; }
/* v1.8.4 : scroll lock via <html> (ajouté/retiré par JS dans openModal/closeModal).
   On locke le scroll au niveau de <html> et non de <body> car body.overflow:hidden
   casse position:sticky des enfants (le .ctl-topbar se retrouvait poussé hors viewport
   quand l'utilisateur avait déjà scrollé avant d'ouvrir la modale). */
html.ctl-scroll-locked { overflow: hidden !important; }
.ctl-modal-backdrop {
    position: absolute; inset: 0;
    background: rgba(0,0,0,.5);
    backdrop-filter: blur(4px);
}
/* v1.8.0-alpha.4 : MODE PREVIEW (?preview-modal=ID depuis le Builder)
   Masque tout le configurateur autour → l'utilisateur voit uniquement le modal centré
   sur un fond neutre, sans le topbar / accordéons / récap polluant la vue. */
.ctl-app.is-preview-modal .ctl-topbar,
.ctl-app.is-preview-modal .ctl-main,
.ctl-app.is-preview-modal .ctl-sticky-bar,
.ctl-app.is-preview-modal .ctl-summary-section {
    display: none !important;
}
.ctl-app.is-preview-modal {
    min-height: 100vh;
    background: var(--ctl-bg-soft) !important;
}
/* Backdrop du modal en mode preview : couleur unie (pas d'effet flou inutile).
   Note : le modal étant désormais sur <body>, on cible aussi via body.is-preview-modal. */
.ctl-app.is-preview-modal .ctl-modal-backdrop,
body.is-preview-modal .ctl-modal-backdrop {
    background: rgba(0, 0, 0, .25);
    backdrop-filter: none;
}

/* ================================================================
   v1.8.0-alpha.11 — RÉPLIQUE EXACTE MODAL PORSCHE (911 GT3)
   Mesures relevées en live sur configurator.porsche.com /option/P70 :
   - Modal max-width 1600px (1587px Porsche)
   - Padding 48px tout autour
   - Grid 1.95fr / 1fr (left 1036 / right 518 chez Porsche)
   - Gallery rounded 24px / Thumbs 100×56 rounded 12px
   - Title 36px (Porsche 35.9px) — weight 600 (équivalent visuel Porsche)
   - Price 14px / color rgba(17,17,19,0.6)
   - Description 16px / line-height 24px / weight 400
   ================================================================ */

/* v1.8.1 : dialog collé en bas du viewport, full-width edge-to-edge.
   - width 100%, max-width none → bord-à-bord
   - height calc(100vh - 120px) : laisse 120px en haut pour voir le header
   - border-radius uniquement sur le haut (24px 24px 0 0) — le bas touche le viewport
   - Animations slide-up (ouverture) / slide-down (fermeture via .is-ctl-closing) */
.ctl-modal-dialog {
    position: relative;
    width: 100%;
    max-width: none;
    height: calc(100vh - 120px);
    max-height: calc(100vh - 120px);
    margin: 0;
    background: #fff;
    border-radius: 24px 24px 0 0;
    overflow: hidden;
    display: flex; flex-direction: column;
    animation: ctlSlideUp .75s cubic-bezier(.16, 1, .3, 1) both;
    will-change: transform, opacity;
    box-shadow: 0 -10px 40px rgba(0,0,0,.15);
}
.ctl-modal-backdrop {
    animation: ctlBackdropFade .55s cubic-bezier(.4, 0, .2, 1) both;
}
/* État de fermeture : animation inverse, classe ajoutée par JS pendant 380ms avant hide */
.ctl-modal.is-ctl-closing .ctl-modal-dialog {
    animation: ctlSlideDown .38s cubic-bezier(.7, 0, .84, 0) both;
}
.ctl-modal.is-ctl-closing .ctl-modal-backdrop {
    animation: ctlBackdropFadeOut .32s cubic-bezier(.4, 0, .2, 1) both;
}
@keyframes ctlSlideUp {
    from { transform: translateY(100%); opacity: .7; }
    to   { transform: translateY(0);    opacity: 1; }
}
@keyframes ctlSlideDown {
    from { transform: translateY(0);    opacity: 1; }
    to   { transform: translateY(100%); opacity: .7; }
}
@keyframes ctlBackdropFade {
    from { opacity: 0; }
    to   { opacity: 1; }
}
@keyframes ctlBackdropFadeOut {
    from { opacity: 1; }
    to   { opacity: 0; }
}
.ctl-modal-close {
    position: absolute; top: 24px; right: 24px;
    width: 44px; height: 44px;
    border-radius: 50%;
    background: rgba(255,255,255,.95);
    border: 1px solid var(--ctl-border);
    color: var(--ctl-text);
    display: flex; align-items: center; justify-content: center;
    /* v1.8.10 : z-index 20 pour passer au-dessus de l'iframe vidéo YouTube */
    z-index: 20;
    transition: background .15s, color .15s;
}
/* v1.8.10 : l'iframe vidéo doit explicitement avoir un z-index inférieur au close. */
.ctl-modal-slide-video iframe { z-index: 1; }
.ctl-modal-close:hover { background: var(--ctl-text); color: #fff; border-color: var(--ctl-text); }
.ctl-modal-body { overflow-y: auto; }

/* ===== Layout 2 colonnes — grid centré max 1587px (exact Porsche) ===== */
.ctl-modal-grid {
    display: grid;
    grid-template-columns: minmax(0, 1.95fr) minmax(0, 1fr);
    gap: 34px;             /* Porsche gap-fluid-md ≈ 33.6px */
    padding: 48px 0;       /* padding vertical seulement, horizontal géré par max-width */
    max-width: 1587px;     /* Porsche grid_w mesuré */
    margin: 0 auto;        /* centrage horizontal */
    width: calc(100% - 142px);  /* 71px de marge gauche + droite (mesure Porsche) */
    align-items: start;
}
.ctl-modal-left {
    position: sticky;
    top: 0;
    align-self: start;
    min-width: 0;
}
.ctl-modal-right { min-width: 0; }

/* ===== Colonne GAUCHE : galerie + thumbnails ===== */
.ctl-modal-gallery-wrap { display: flex; flex-direction: column; gap: 12px; }

/* Image principale : aspect 16/9, radius 24px (Porsche rounded-3xl) */
.ctl-modal-gallery-main {
    width: 100%;
    aspect-ratio: 16 / 9;
    background: var(--ctl-bg-soft);
    border-radius: 24px;
    overflow: hidden;
}
.ctl-modal-gallery-track {
    display: flex;
    width: 100%;
    height: 100%;
    transition: transform .35s cubic-bezier(.42, 0, .2, 1);
}
/* v1.8.6 : swipe souris/touch sur la galerie.
   - touch-action pan-y : autorise le scroll vertical mobile mais capte le swipe horizontal
   - cursor grab/grabbing pour signaler l'affordance souris (desktop)
   - user-select none pour éviter la sélection de texte pendant le drag
   - is-dragging désactive la transition pour que le track suive le doigt en temps réel */
.ctl-modal-gallery-main {
    touch-action: pan-y;
    cursor: grab;
    user-select: none;
    -webkit-user-select: none;
}
.ctl-modal-gallery-main.is-dragging { cursor: grabbing; }
.ctl-modal-gallery-main.is-dragging .ctl-modal-gallery-track {
    transition: none !important;
}
/* Empêche le drag natif des images (qui prendrait la main sur notre pointer handler) */
.ctl-modal-gallery-main img {
    user-select: none;
    -webkit-user-select: none;
    -webkit-user-drag: none;
    pointer-events: none;
}
.ctl-modal-slide {
    flex: 0 0 100%;
    width: 100%;
    height: 100%;
}
.ctl-modal-slide img {
    width: 100%; height: 100%;
    object-fit: cover;
    display: block;
}
/* v1.8.7 : slide vidéo YouTube — pattern Facade (poster cliquable + iframe à la demande).
   Tant que data-state="poster", l'iframe est cachée et la slide est entièrement swipeable
   (le poster est un <button> qui laisse passer les pointer events au container parent).
   Au clic du bouton → iframe charge avec autoplay=1 et data-state="playing". */
.ctl-modal-slide-video {
    background: #000;
    position: relative;
}
.ctl-modal-slide-video iframe {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
}
/* État poster (par défaut) — masque l'iframe vide */
.ctl-modal-slide-video[data-state="poster"] iframe { display: none; }
/* État playing — masque le poster (l'iframe prend la main pour les contrôles vidéo) */
.ctl-modal-slide-video[data-state="playing"] .ctl-modal-video-poster { display: none; }

/* Poster cliquable : occupe toute la slide, image en object-fit:cover + bouton play centré */
.ctl-modal-video-poster {
    position: absolute;
    inset: 0;
    width: 100%; height: 100%;
    padding: 0; margin: 0; border: 0;
    background: transparent;
    cursor: pointer;
    display: block;
    overflow: hidden;
}
.ctl-modal-video-poster img {
    width: 100%; height: 100%;
    object-fit: cover;
    display: block;
    pointer-events: none;
}
/* Léger overlay sombre pour faire ressortir le bouton play sur l'image */
.ctl-modal-video-poster::before {
    content: "";
    position: absolute; inset: 0;
    background: linear-gradient(to bottom, rgba(0,0,0,.10), rgba(0,0,0,.25));
    pointer-events: none;
}
/* Bouton play rouge style YouTube, centré */
.ctl-modal-video-play-icon {
    position: absolute;
    top: 50%; left: 50%;
    transform: translate(-50%, -50%);
    width: 72px; height: 72px;
    border-radius: 50%;
    background: rgba(255, 0, 0, .92);
    box-shadow: 0 4px 24px rgba(0, 0, 0, .35);
    pointer-events: none;
}
.ctl-modal-video-play-icon::after {
    content: "";
    position: absolute;
    top: 50%; left: 50%;
    transform: translate(-35%, -50%);
    width: 0; height: 0;
    border-style: solid;
    border-width: 14px 0 14px 22px;
    border-color: transparent transparent transparent #fff;
}

/* v1.8.11 : neutralise les overrides WoodMart/Elementor sur le bouton poster.
   - WoodMart applique padding:5px 20px sur les <button> → l'image était 20px plus
     étroite que le slide, montrant le bg gris (#f4f4f6) de .ctl-modal-gallery-main.
   - On force padding:0 et background transparent → image plein cadre, fond noir.
   Ces règles s'appliquent à toutes les tailles (desktop ET mobile) pour la cohérence. */
.ctl-modal-video-poster {
    padding: 0 !important;
    border: 0 !important;
}
.ctl-modal-video-poster img {
    width: 100% !important;
    height: 100% !important;
    object-fit: cover !important;
    display: block !important;
    max-width: none !important;
    vertical-align: top !important;
}
.ctl-modal-gallery-main { background: transparent !important; }
.ctl-modal-slide-video { background: #000 !important; }
.ctl-modal-gallery-placeholder {
    width: 100%; height: 100%;
    display: flex; align-items: center; justify-content: center;
    color: var(--ctl-text-mute);
    font-size: 14px;
    background:
        repeating-linear-gradient(45deg,
            rgba(0,0,0,.015) 0 14px,
            rgba(0,0,0,.03) 14px 28px);
}

/* Bande de thumbnails : scroll horizontal, 100×56, radius 12px, padding 2px */
.ctl-modal-thumbs {
    display: flex;
    gap: 8px;
    overflow-x: auto;
    scrollbar-width: thin;
    scrollbar-color: var(--ctl-border-2) transparent;
    /* v1.8.24 : padding-bottom 4 → 12px pour créer un écart entre les vignettes et la
       scrollbar qui apparaît au swipe horizontal (visible sur iOS Safari pendant le scroll).
       Sans ce padding, la scrollbar se collait au bord inférieur des images. */
    padding-bottom: 12px;
}
.ctl-modal-thumbs::-webkit-scrollbar { height: 6px; }
.ctl-modal-thumbs::-webkit-scrollbar-thumb { background: var(--ctl-border-2); border-radius: 3px; }
.ctl-app button.ctl-modal-thumb,
.ctl-modal button.ctl-modal-thumb,
.ctl-modal-thumb {
    flex: 0 0 auto;
    width: 100px; height: 56px;
    padding: 2px !important;
    border: 2px solid transparent !important;
    border-radius: 12px !important;
    background: transparent !important;
    cursor: pointer !important;
    transition: border-color .2s !important;
    min-height: 0 !important;
}
.ctl-app button.ctl-modal-thumb:hover,
.ctl-modal button.ctl-modal-thumb:hover,
.ctl-modal-thumb:hover { border-color: var(--ctl-border-2) !important; }
.ctl-app button.ctl-modal-thumb.is-active,
.ctl-modal button.ctl-modal-thumb.is-active,
.ctl-modal-thumb.is-active { border-color: var(--ctl-text) !important; }
/* v1.8.0-alpha.13 : !important pour neutraliser les overrides des thèmes (WoodMart) */
.ctl-app .ctl-modal-thumb img,
.ctl-modal .ctl-modal-thumb img,
.ctl-modal-thumb img {
    width: 100% !important;
    height: 100% !important;
    object-fit: cover !important;
    border-radius: 8px !important;
    display: block !important;
}
/* v1.8.2 : thumb vidéo YouTube — overlay sombre + triangle play centré.
   !important sur position:relative car les règles existantes (.ctl-app button.ctl-modal-thumb)
   utilisent !important sur d'autres propriétés et risquent de réinitialiser position:static via
   le navigateur lors d'un repaint avec d'autres règles. z-index explicite pour assurer la
   stratification : image en bas, overlay (1), bouton play (2). */
.ctl-modal-thumb-video {
    position: relative !important;
}
.ctl-modal-thumb-video::before {
    content: "";
    position: absolute;
    inset: 2px;
    background: rgba(0, 0, 0, .35);
    border-radius: 8px;
    pointer-events: none;
    z-index: 1;
}
.ctl-modal-thumb-play {
    position: absolute;
    top: 50%; left: 50%;
    transform: translate(-50%, -50%);
    width: 22px; height: 22px;
    border-radius: 50%;
    background: rgba(255, 255, 255, .95);
    pointer-events: none;
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 2;
}
.ctl-modal-thumb-play::after {
    content: "";
    display: block;
    width: 0; height: 0;
    border-style: solid;
    border-width: 5px 0 5px 8px;
    border-color: transparent transparent transparent #111113;
    margin-left: 2px; /* compensation optique du triangle */
}

/* ===== Colonne DROITE : prix + titre + description + bouton ===== */
.ctl-modal-details { padding: 0; max-width: 65ch; }

/* Prix petit en gris au-dessus du titre — exact Porsche : 14px, rgba(17,17,19,0.6) */
.ctl-modal-price-small {
    font-size: 14px;
    font-weight: 400;
    color: rgba(17, 17, 19, .6);
    margin: 0 0 4px;
    line-height: 1.5;
}

/* Titre H2 — 27px (v1.8.0-alpha.14, taille adaptée au contexte Tesla) */
.ctl-modal-details .ctl-modal-title {
    font-size: 27px;
    font-weight: 500;
    line-height: 1.3;
    letter-spacing: 0;
    margin: 0 0 24px;
    color: var(--ctl-text);
}

/* Description rich text — 16px / line-height 24px (1.5) */
.ctl-modal-details .ctl-modal-desc {
    font-size: 16px;
    font-weight: 400;
    color: var(--ctl-text);
    line-height: 1.5;
    margin: 0 0 32px;
}
.ctl-modal-details .ctl-modal-desc p { margin: 0 0 16px; }
.ctl-modal-details .ctl-modal-desc p:last-child { margin-bottom: 0; }
.ctl-modal-details .ctl-modal-desc ul,
.ctl-modal-details .ctl-modal-desc ol { margin: 0 0 16px; padding-left: 24px; }
.ctl-modal-details .ctl-modal-desc li { margin-bottom: 6px; line-height: 1.5; }
.ctl-modal-details .ctl-modal-desc strong { color: var(--ctl-text); font-weight: 600; }
.ctl-modal-details .ctl-modal-desc a { color: var(--ctl-text); text-decoration: underline; }
.ctl-modal-details .ctl-modal-desc h3,
.ctl-modal-details .ctl-modal-desc h4 {
    font-size: 16px;
    font-weight: 600;
    margin: 24px 0 8px;
    color: var(--ctl-text);
}

/* Bouton action — exact Porsche : 216×56, padding 16/28, radius 12, font 16/400, AUTO width
   v1.8.0-alpha.13 : aligné à gauche dans son container (text-align: left + display:inline-flex). */
.ctl-modal-actions {
    margin-top: 0;
    text-align: left;
}
.ctl-app button.ctl-modal-action,
.ctl-modal button.ctl-modal-action,
.ctl-modal-action {
    width: auto !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    min-height: 56px !important;
    height: 56px !important;
    font-size: 16px !important;
    font-weight: 400 !important;
    border-radius: 12px !important;
    padding: 16px 28px !important;
    background: var(--ctl-text) !important;
    color: #fff !important;
    border: 1px solid var(--ctl-text) !important;
}
.ctl-app button.ctl-modal-action:hover,
.ctl-modal button.ctl-modal-action:hover,
.ctl-modal-action:hover {
    background: #2a2a30 !important;
    border-color: #2a2a30 !important;
}
.ctl-modal-soon {
    display: inline-block;
    color: var(--ctl-text-mute);
    font-style: italic;
    padding: 14px 0;
}

/* Responsive : 1 colonne empilée */
@media (max-width: 1024px) {
    .ctl-modal-grid {
        grid-template-columns: 1fr;
        gap: 32px;
        padding: 32px 0;
        width: calc(100% - 64px);
    }
    .ctl-modal-left { position: static; }
    .ctl-modal-details .ctl-modal-title { font-size: 28px; }
    .ctl-app button.ctl-modal-action,
    .ctl-modal button.ctl-modal-action,
    .ctl-modal-action { width: 100% !important; }
}
@media (max-width: 600px) {
    .ctl-modal-grid {
        padding: 20px 0;
        gap: 20px;
        width: calc(100% - 32px);
    }
    .ctl-modal-details .ctl-modal-title { font-size: 22px; margin-bottom: 16px; }
    .ctl-modal-details .ctl-modal-desc { font-size: 15px; margin-bottom: 24px; }
    .ctl-modal-thumb { width: 72px; height: 40px; }
    .ctl-modal-close { top: 12px; right: 12px; width: 38px; height: 38px; }
}
/* v1.8.1 : séparateur retiré au-dessus du bouton "Ajouter à votre sélection" */
.ctl-modal-actions {
    display: flex; gap: 10px; justify-content: flex-end;
    border-top: none;
    padding-top: 0;
}

/* ============== RESPONSIVE ============== */

/* === TABLETTE / MOBILE (≤ 1023px) — passe en 1 colonne, image full-width === */
@media (max-width: 1023px) {
    .ctl-app .ctl-main {
        /* v1.8.33 : minmax(0, 1fr) au lieu de 1fr pour empêcher le grid track
           de s'étirer à la largeur intrinsèque des images (1920px) — sinon
           .ctl-stage déborde latéralement le viewport sur mobile. */
        grid-template-columns: minmax(0, 1fr) !important;
        padding: 0 !important;
        gap: 0 !important;
        margin: 0 !important;
    }
    /* Ceinture + bretelles : forcer min-width 0 sur .ctl-stage au cas où
       un parent injecté contournerait la règle minmax ci-dessus. */
    .ctl-app .ctl-stage,
    .ctl-app .ctl-stage-inner {
        min-width: 0 !important;
    }

    /* v1.8.34 : FIX EDGE-TO-EDGE STAGE MOBILE — approche en profondeur.
       Diagnostic : sur iPhone 17 Pro réel, l'image stage avait ~5px de gap
       gauche/droite. Hypothèse confirmée : un wrapper Elementor/Woodmart
       applique padding-inline sur breakpoint mobile réel + body a overflow:clip,
       ce qui clippe le 100vw breakout du .ctl-app à la largeur réelle du body.

       Stratégie multi-couches : (1) neutraliser TOUS les paddings ancêtres,
       (2) forcer html/body à 100% sans padding, (3) refaire le breakout au
       niveau du stage, (4) compenser les safe-area-insets iOS. */

    /* (1) Neutraliser padding-inline + max-width sur TOUS les ancêtres connus.
       Sélecteurs avec :has() + sélecteurs ciblés sur classes Woodmart/Elementor.
       Spécificité boostée via html body. */
    html body .wd-content-layout:has(#ctl-app),
    html body .wd-page-content:has(#ctl-app),
    html body .main-page-wrapper:has(#ctl-app),
    html body .wd-page-wrapper:has(#ctl-app),
    html body .website-wrapper:has(#ctl-app),
    html body .content-layout-wrapper:has(#ctl-app),
    html body .e-con-boxed:has(#ctl-app),
    html body .e-con-inner:has(#ctl-app),
    html body .e-con:has(#ctl-app),
    html body .e-parent:has(#ctl-app),
    html body .e-flex:has(#ctl-app),
    html body .elementor-shortcode:has(#ctl-app),
    html body .elementor-widget-container:has(#ctl-app),
    html body .elementor-widget:has(#ctl-app),
    html body .elementor-element:has(#ctl-app),
    html body .elementor-section-wrap:has(#ctl-app),
    html body .elementor-row:has(#ctl-app),
    html body .elementor-column:has(#ctl-app),
    html body .elementor-column-wrap:has(#ctl-app),
    html body .elementor:has(#ctl-app) {
        padding-left: 0 !important;
        padding-right: 0 !important;
        margin-left: auto !important;
        margin-right: auto !important;
        max-width: 100% !important;
    }

    /* (2) html et body en plein width sans padding. body overflow-x: clip
       autorisé (sécurité contre scroll horizontal), mais width = 100% strict. */
    html:has(#ctl-app),
    html body:has(#ctl-app) {
        padding-left: 0 !important;
        padding-right: 0 !important;
        margin-left: 0 !important;
        margin-right: 0 !important;
        width: 100% !important;
        max-width: 100% !important;
        overflow-x: clip !important;
    }

    /* (3) .ctl-stage : son propre breakout indépendant du .ctl-app, en plus
       d'un fallback `inset-inline` pour les navigateurs récents. La technique
       calc(50% - 50vw) compense automatiquement le padding parent restant. */
    html body .ctl-app .ctl-stage {
        position: sticky !important;
        width: 100vw !important;
        max-width: 100vw !important;
        margin-left: calc(50% - 50vw) !important;
        margin-right: calc(50% - 50vw) !important;
        padding-left: 0 !important;
        padding-right: 0 !important;
        left: 0 !important;
        right: 0 !important;
        box-sizing: border-box !important;
    }

    /* (4) Compensation safe-area-inset iOS (iPhone notch/Dynamic Island en
       portrait n'a normalement pas d'inset latéral, mais on couvre le cas
       où certaines apps WebView ou orientations le déclenchent). */
    @supports (padding: env(safe-area-inset-left)) {
        html body .ctl-app .ctl-stage {
            margin-left: calc((50% - 50vw) - env(safe-area-inset-left, 0px)) !important;
            margin-right: calc((50% - 50vw) - env(safe-area-inset-right, 0px)) !important;
        }
    }

    /* (5) Tout ce qui est DANS le stage doit aussi être full-width.
       Override des margins/paddings éventuels héritès du design desktop. */
    html body .ctl-app .ctl-stage-inner,
    html body .ctl-app .ctl-vehicle,
    html body .ctl-app .ctl-vehicle-base,
    html body .ctl-app .ctl-vehicle-slider,
    html body .ctl-app .ctl-vehicle-slide,
    html body .ctl-app .ctl-vehicle-overlays,
    html body .ctl-app .ctl-vehicle-overlays img {
        width: 100% !important;
        max-width: 100% !important;
        margin-left: 0 !important;
        margin-right: 0 !important;
        padding-left: 0 !important;
        padding-right: 0 !important;
        left: 0 !important;
        right: 0 !important;
        box-sizing: border-box !important;
    }

    /* FIX TREMBLEMENT iOS WebKit :
       Sur iOS Safari/Chrome, un ancêtre du sticky avec overflow-x: clip ou hidden
       crée un nouveau scrolling context qui désynchronise le sticky du scroll réel
       de la fenêtre → tremblement à chaque frame. On force overflow: visible
       en mobile uniquement (le débordement horizontal n'est pas un risque). */
    .ctl-app {
        overflow-x: visible !important;
        overflow-y: visible !important;
        overflow: visible !important;
    }
    /* Momentum natif iOS pour le scroll (sans bloquer le pull-to-refresh) */
    html, body {
        -webkit-overflow-scrolling: touch;
    }

    /* Stage : edge-to-edge, sticky en haut, sans border-radius.
       ATTENTION : NE PAS mettre transform/will-change sur l'élément sticky lui-même —
       cela crée un nouveau containing block qui peut casser le sticky sur iOS Safari
       et provoquer un tremblement. Promotion GPU à mettre sur les ENFANTS. */
    .ctl-app .ctl-stage {
        position: -webkit-sticky !important;
        position: sticky !important;
        top: 0 !important;
        z-index: 50 !important;
        background: #fff !important;
        padding: 0 !important;
        margin: 0 !important;
        box-shadow: 0 2px 12px rgba(0,0,0,.08) !important;
        /* Hauteur fixe en svh pour empêcher tout reflow pendant scroll mobile */
        height: auto !important;
    }
    .ctl-app .ctl-stage-inner {
        border-radius: 0 !important;
        /* v1.8.38 : stage en 16/9 strict sur mobile (comme desktop).
           Garantit que l'image principale (1920×1080) s'affiche entièrement
           sans letterbox horizontal NI vertical, sur tous les viewports
           mobile (iPhone SE 320 → Pro Max 430 → iPad 768).
           Height calculé = width × 9/16. Pas de svh = pas de reflow scroll. */
        aspect-ratio: 16 / 9 !important;
        height: auto !important;
        max-height: 56.25vw !important; /* fallback explicite = 100vw × 9/16 */
        width: 100% !important;
        background: var(--ctl-bg-soft) !important;
        /* Promotion GPU sur l'enfant (pas sur le sticky) */
        transform: translateZ(0);
        -webkit-transform: translateZ(0);
        will-change: transform;
        backface-visibility: hidden;
        -webkit-backface-visibility: hidden;
        contain: layout paint;
    }
    .ctl-app .ctl-vehicle {
        /* Idem promotion GPU sur le conteneur d'images */
        transform: translateZ(0);
        -webkit-transform: translateZ(0);
        will-change: transform;
    }
    .ctl-app .ctl-vehicle-base,
    .ctl-app .ctl-vehicle-overlays img {
        object-fit: contain !important;
    }
    /* v1.8.38 : retour à `contain` — le stage est maintenant en 16:9 strict
       (cf. .ctl-stage-inner aspect-ratio plus haut), donc une image 16:9 (la
       norme du configurateur) tient PILE dans le container sans letterbox.
       Les images de ratio différent restent entièrement visibles avec un
       letterbox proportionnel — c'est l'effet voulu (image entière > crop). */
    .ctl-app .ctl-vehicle-slide {
        background-size: contain !important;
        background-position: center center !important;
    }

    /* Panel : padding latéral compact */
    .ctl-app .ctl-panel { padding: 16px 16px 0 !important; }

    /* H1 plus petit dans panel */
    .ctl-app .ctl-panel-title { margin-bottom: 12px !important; }
    .ctl-app .ctl-panel-title-h1 {
        font-size: 22px !important;
        line-height: 1.25 !important;
        padding: 0 !important;
    }

    /* Accordéons : full-width, padding réduit */
    .ctl-app .ctl-accordions { padding-bottom: 100px !important; }
    .ctl-app .ctl-acc { border-radius: 16px !important; }
    .ctl-app .ctl-acc-header {
        padding: 14px 16px !important;
        min-height: 0 !important;       /* retire la min-height qui forçait du vide */
        align-items: center !important;
    }
    .ctl-app .ctl-acc-title {
        font-size: 16px !important;
        line-height: 1.3 !important;
        margin: 0 !important;
    }
    .ctl-app .ctl-acc-title-wrap {
        align-items: center !important;
        gap: 8px !important;
    }
    .ctl-app .ctl-acc-chevron { flex-shrink: 0 !important; }
    /* Padding désactivé quand fermé (sinon padding-bottom contribue à la hauteur même avec max-height: 0) */
    .ctl-app .ctl-acc-body { padding: 0 12px !important; }
    /* Pattern Porsche : padding-bottom 2× sides en mobile pour balance optique
       (uniquement quand ouvert ; quand fermé, body reste padding: 0 12px)
       v1.7.7 : padding-top 2px pour resserrer titre/sous-titre. */
    .ctl-app .ctl-acc.is-open .ctl-acc-body { padding: 2px 12px 24px !important; }

    /* Cards 2 colonnes style Porsche (mobile) */
    .ctl-app .ctl-opt-grid {
        grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
        gap: 8px !important;
        display: grid !important;
    }
    /* Choix du modèle : garde 1 colonne pour cartes modèle horizontales */
    .ctl-app .ctl-acc-primary .ctl-opt-grid {
        grid-template-columns: 1fr !important;
        gap: 10px !important;
    }
    .ctl-app .ctl-opt-content {
        padding: 8px 10px 10px !important;
        gap: 2px !important;
    }
    .ctl-app .ctl-opt-title {
        font-size: 13px !important;
        font-weight: 500 !important;
        line-height: 1.25 !important;
    }
    .ctl-app .ctl-opt-price {
        font-size: 13px !important;
        line-height: 1.25 !important;
        margin-top: 2px !important;
        color: #555 !important;
    }
    /* Model card : layout horizontal compact + fond gris distinct */
    .ctl-app .ctl-model-grid {
        grid-template-columns: 1fr !important;
        gap: 10px !important;
        padding: 4px 0 !important;
    }
    .ctl-app .ctl-model-card {
        border-radius: 12px !important;
        margin: 0 !important;
        overflow: hidden !important;
        background: #fff !important;
        /* Border 1px visible (gris translucide) pour distinguer les modèles non-sélectionnés */
        border: 1px solid rgba(26, 26, 30, .15) !important;
        transition: border-color .2s, background .2s !important;
    }
    .ctl-app .ctl-model-card.is-selected,
    .ctl-app .ctl-model-card[aria-checked="true"],
    .ctl-app .ctl-model-card.is-active {
        border-color: var(--ctl-text) !important;
        background: #fff !important;
    }
    .ctl-app .ctl-model-card .ctl-model-card-inner {
        display: flex !important;
        flex-direction: row !important;
        align-items: stretch !important;
    }
    .ctl-app .ctl-model-card-thumb-wrap {
        flex: 0 0 38% !important;
        max-width: 38% !important;
        aspect-ratio: auto !important;
        min-height: 92px !important;
        position: relative !important;
    }
    .ctl-app .ctl-model-card-thumb-wrap .ctl-opt-thumb {
        aspect-ratio: auto !important;
        height: 100% !important;
        min-height: 92px !important;
        border-radius: 0 !important;
    }
    .ctl-app .ctl-model-card-text {
        padding: 10px 14px !important;
        flex: 1 1 auto !important;
        display: flex !important;
        flex-direction: column !important;
        justify-content: center !important;
        gap: 2px !important;
    }
    /* Carte « fenêtre » : coche alignée sur l'inset des cartes standard en mobile aussi.
       Écart coche = bordure + padding droit. Sur ≤1023px la carte standard a une bordure 2px
       (.ctl-opt) + 10px de padding = 12px ; la carte fenêtre n'a qu'une bordure 1px (.ctl-model-card,
       le host .ctl-opt étant border:none) → on met 11px de padding (1 + 11 = 12px) pour un écart
       identique. !important requis pour battre le !important de la règle précédente. */
    .ctl-app .ctl-win-card .ctl-model-card-text { padding-right: 11px !important; }
    /* Carte « fenêtre » : la hauteur suit le contenu en mobile aussi → on retire le min-height 92px
       imposé à la photo (le picker de modèle, sans .ctl-win-card, le conserve). */
    .ctl-app .ctl-win-card .ctl-model-card-thumb-wrap,
    .ctl-app .ctl-win-card .ctl-model-card-thumb-wrap .ctl-opt-thumb { min-height: 0 !important; }
    /* Plafond miniature 150px aussi en mobile/tablette (le 38%/40% !important des règles génériques
       battrait sinon le plafond desktop sans !important → sur tablette large la photo deviendrait une
       bande large et courte). !important pour battre max-width:38%/40% !important ci-dessus. */
    .ctl-app .ctl-win-card .ctl-model-card-thumb-wrap { max-width: 150px !important; }
    /* Carte « fenêtre » : rythme vertical en mobile aussi — 6px entre titre et rangée statut
       (base = 2px !important, trop tassé). !important pour battre le gap:2px de la règle générique. */
    .ctl-app .ctl-win-card .ctl-model-card-text { gap: 6px !important; }
    .ctl-app .ctl-model-card .ctl-opt-title,
    .ctl-app .ctl-model-card .ctl-model-card-title {
        font-size: 15px !important;
        font-weight: 600 !important;
        line-height: 1.2 !important;
        letter-spacing: -0.01em !important;
    }
    .ctl-app .ctl-model-card .ctl-opt-subtitle,
    .ctl-app .ctl-model-card .ctl-model-card-subtitle,
    .ctl-app .ctl-model-card .ctl-model-subtitle {
        font-size: 12px !important;
        color: var(--ctl-text-soft) !important;
    }
    .ctl-app .ctl-model-card .ctl-opt-info {
        top: 6px !important;
        left: 6px !important;
    }

    /* Récap section : padding réduit */
    .ctl-app .ctl-summary-section {
        padding: 32px 16px 100px !important;
        margin-top: 32px !important;
    }
    .ctl-app .ctl-summary-grid {
        grid-template-columns: 1fr !important;
        gap: 16px !important;
    }
    .ctl-app .ctl-summary-list { padding: 16px !important; }
    .ctl-app .ctl-summary-actions {
        padding: 18px !important;
        position: relative !important;
        top: auto !important;
    }
    /* Récap mobile : passage en 1 colonne (titre/prix/changer empilés) */
    .ctl-app .ctl-summary-line {
        grid-template-columns: 1fr !important;
        gap: 8px !important;
        padding: 14px 0 !important;
    }
    .ctl-app .ctl-summary-line .ctl-line-price,
    .ctl-app .ctl-summary-line .ctl-line-changer {
        justify-self: start !important;
        text-align: left !important;
    }

    /* Sticky bar visible */
    .ctl-app .ctl-sticky-bar { display: flex !important; }
    body { padding-bottom: 80px !important; }
}

/* === MOBILE strict (≤ 600px) === */
@media (max-width: 600px) {
    /* v1.8.38 : stage-inner stage reste en 16/9 (cf. règle ≤1023px) — ne pas
       écraser avec une hauteur fixe ici. L'aspect-ratio héritée donne déjà
       une hauteur adaptée (100vw × 9/16) sur les petits viewports. */
    .ctl-app .ctl-panel-title-h1 { font-size: 20px !important; }

    /* Model card reste horizontal compact (cf. règles ≤1023px) */

    /* Accordion radius plus petit */
    .ctl-app .ctl-acc { border-radius: 12px !important; }

    /* v1.8.10 : modale mobile — fixes spécifiques iOS Safari.
       BUG #1 : sur iOS, 100vh = hauteur viewport quand la barre d'adresse est cachée
                (donc supérieure au viewport visible) → la modale extend au-delà du haut,
                pas de gap visible. Fix : utiliser 100dvh (dynamic viewport height) qui
                s'ajuste à la barre d'outils visible. Fallback 100vh pour vieux navigateurs.
       BUG #2 : sur iOS Safari, les <iframe> sont rendues dans leur propre layer GPU et
                peuvent s'afficher au-dessus des siblings absolument positionnés, même
                avec un z-index plus haut. Fix : position:fixed + transform:translateZ(0)
                + isolation:isolate sur le close X → propre layer composité, viewport-rel. */
    .ctl-modal { padding: 0 !important; }
    .ctl-modal-dialog {
        width: 100% !important;
        max-width: 100% !important;
        /* Fallback pour vieux navigateurs */
        height: calc(100vh - 50px) !important;
        max-height: calc(100vh - 50px) !important;
        /* Override iOS Safari 15.4+ / Chrome 108+ */
        height: calc(100dvh - 50px) !important;
        max-height: calc(100dvh - 50px) !important;
        border-radius: 24px 24px 0 0 !important;
        box-shadow: 0 -10px 40px rgba(0,0,0,.15) !important;
    }
    /* v1.8.11 : X de fermeture placé dans un "header" propre au-dessus du contenu.
       Selector double pour battre .ctl-modal .ctl-modal-close (spécificité 2 classes). */
    .ctl-modal .ctl-modal-close,
    .ctl-modal-close {
        position: fixed !important;
        top: 24px !important;
        right: 20px !important;
        width: 36px !important;
        height: 36px !important;
        z-index: 2147483647 !important;
        transform: translateZ(0) !important;
        -webkit-transform: translate3d(0, 0, 0) !important;
        will-change: transform !important;
        isolation: isolate !important;
    }
    /* v1.8.12 : padding-top 80px sur la grille → 20px d'écart entre le bas du X
       (top:24+h:36 = 60) et le haut de la galerie (80). Évite que le X soit collé
       à l'image/vidéo. */
    .ctl-modal-grid { padding-top: 80px !important; }
    .ctl-modal-content { padding: 20px 22px 24px !important; }
    .ctl-modal-gallery { grid-template-columns: repeat(2, 1fr) !important; }

    /* Sticky bar plus compact */
    .ctl-app .ctl-sticky-bar { padding: 10px 14px !important; }
    .ctl-app .ctl-sticky-bar-amount { font-size: 18px !important; }
    .ctl-app .ctl-sticky-bar-btn { padding: 11px 16px !important; font-size: 14px !important; }

    /* Total récap */
    .ctl-app .ctl-total-amount { font-size: 24px !important; }
}

/* ====================================================================
   v1.5 : H1 dans panel droit, sticky bar mobile, model/length pickers
   ==================================================================== */

/* === H1 dans le panel droit (au-dessus du mini-summary) === */
.ctl-app .ctl-panel-title {
    margin-bottom: 16px;
}
.ctl-app .ctl-panel-title-h1 {
    font-size: clamp(24px, 1.5vw + 12px, 32px);
    font-weight: 600;
    line-height: 1.2;
    letter-spacing: -0.3px;
    color: var(--ctl-text);
    margin: 0;
    padding: 0 4px;
}

/* === STICKY BOTTOM BAR (mobile uniquement, < 1024px) === */
.ctl-app .ctl-sticky-bar { display: none !important; }

@media (max-width: 1023px) {
    .ctl-app .ctl-sticky-bar {
        display: flex !important;
        position: fixed !important;
        bottom: 0; left: 0; right: 0;
        z-index: 999;
        background: #fff;
        border-top: 1px solid var(--ctl-border);
        box-shadow: 0 -4px 24px rgba(0,0,0,.08);
        padding: 12px 16px;
        justify-content: center;
    }
    body { padding-bottom: 80px; }
}
.ctl-app .ctl-sticky-bar-inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    width: 100%;
    max-width: 1480px;
}
.ctl-app .ctl-sticky-bar-price {
    display: flex;
    flex-direction: column;
}
.ctl-app .ctl-sticky-bar-label {
    font-size: 12px;
    color: var(--ctl-text-mute);
    line-height: 1;
}
.ctl-app .ctl-sticky-bar-amount {
    font-size: 22px;
    font-weight: 600;
    color: var(--ctl-text);
    line-height: 1.2;
}
.ctl-app .ctl-sticky-bar-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: var(--ctl-text);
    color: #fff;
    font-size: 15px;
    font-weight: 600;
    padding: 14px 28px;
    border-radius: 12px;
    text-decoration: none;
    border: 1px solid var(--ctl-text);
    cursor: pointer;
    transition: background .2s;
    white-space: nowrap;
}
.ctl-app .ctl-sticky-bar-btn:hover {
    background: #2a2a30;
    color: #fff;
}
@media (max-width: 720px) {
    .ctl-app .ctl-sticky-bar-amount { font-size: 18px; }
    .ctl-app .ctl-sticky-bar-btn { padding: 12px 18px; font-size: 14px; }
}
/* Barre mobile : bouton téléphone (contour) + CTA regroupés à droite. Le bouton téléphone prend
   AUTOMATIQUEMENT la hauteur du CTA (align-items: stretch) et sa largeur = cette hauteur → CARRÉ, même
   border-radius (12px). aspect-ratio ne marche pas en flex-stretch → largeur explicite par breakpoint,
   calée sur la hauteur réelle du CTA (721-1023px ≈ 53 ; ≤720 ≈ 47 ; ≤600 ≈ 45). box-sizing: border-box
   pour que la largeur inclue la bordure. Style secondaire (contour rouge) → le CTA reste dominant. */
.ctl-app .ctl-sticky-bar-actions {
    display: flex;
    align-items: stretch;
    gap: 8px;
}
.ctl-app .ctl-sticky-bar-phone {
    box-sizing: border-box;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 53px;
    width: 53px;
    border-radius: 12px;
    border: 1.5px solid var(--ctl-blue);
    background: transparent;
    color: var(--ctl-blue);
    text-decoration: none;
    transition: background .2s, color .2s;
}
.ctl-app .ctl-sticky-bar-phone:hover,
.ctl-app .ctl-sticky-bar-phone:active {
    background: var(--ctl-blue);
    color: #fff;
}
/* Icône = celle de la top bar WoodMart (fill), colorée par currentColor (rouge, blanc au survol). */
.ctl-app .ctl-sticky-bar-phone svg { width: 22px; height: 22px; fill: currentColor; display: block; }
@media (max-width: 720px) { .ctl-app .ctl-sticky-bar-phone { flex-basis: 47px; width: 47px; } }
@media (max-width: 600px) { .ctl-app .ctl-sticky-bar-phone { flex-basis: 45px; width: 45px; } }

/* (règles mobile stage déplacées dans le bloc RESPONSIVE plus haut, pour éviter les doublons) */

/* === Premier accordéon (Choix du modèle) — style allégé === */
.ctl-app .ctl-acc.ctl-acc-primary {
    background: #fff !important;
    border: 1px solid var(--ctl-border) !important;
    box-shadow: 0 6px 24px rgba(0,0,0,.06) !important;
}
.ctl-app .ctl-acc.ctl-acc-primary .ctl-acc-header {
    background: transparent !important;
    color: var(--ctl-text) !important;
}
.ctl-app .ctl-acc.ctl-acc-primary .ctl-acc-title { color: var(--ctl-text) !important; }
.ctl-app .ctl-acc.ctl-acc-primary .ctl-acc-count { background: var(--ctl-text) !important; color: #fff !important; }
.ctl-app .ctl-acc.ctl-acc-primary .ctl-acc-chevron { color: var(--ctl-text) !important; }
.ctl-app .ctl-acc.ctl-acc-primary .ctl-acc-header:hover { background: transparent !important; }

/* Force la grille du Choix du modèle en 1 colonne (pleine largeur) */
.ctl-app .ctl-acc-primary .ctl-opt-grid,
.ctl-app .ctl-model-grid {
    grid-template-columns: 1fr !important;
    display: flex !important;
    flex-direction: column !important;
    gap: 12px !important;
}
.ctl-app .ctl-acc-primary .ctl-opt {
    width: 100% !important;
    max-width: 100% !important;
    background: transparent !important;
    border: 0 !important;
    padding: 0 !important;
    overflow: visible !important;
    height: auto !important;
}

/* === MODEL CARD : layout horizontal (image gauche, texte droite, radio) === */

/* Fix double-border : .ctl-opt (wrapper) ET .ctl-model-card (label) avaient
   chacun un border:2px → 2 bordures visibles. On retire l'outer pour ne
   garder que celui du .ctl-model-card. */
.ctl-app .ctl-opt.ctl-model-card-host {
    border: none;
    background: transparent;
    overflow: visible;
}

.ctl-app .ctl-model-card {
    display: flex;
    width: 100%;
    overflow: hidden;
    border-radius: 12px;
    /* Border style Porsche : gris-sombre translucide (au lieu du gris très clair) */
    border: 2px solid rgba(26, 26, 30, .15);
    background: #fff;
    transition: border-color .2s;
    cursor: pointer;
}
.ctl-app .ctl-opt:hover .ctl-model-card { border-color: var(--ctl-text); }
.ctl-app .ctl-opt.is-selected .ctl-model-card { border-color: var(--ctl-text); }
.ctl-app .ctl-model-card-inner {
    display: flex;
    width: 100%;
    align-items: stretch;
}
.ctl-app .ctl-model-card-thumb-wrap {
    flex: 0 0 33%;
    max-width: 33%;
    position: relative;
}
.ctl-app .ctl-model-card-thumb-wrap .ctl-opt-thumb {
    aspect-ratio: 16 / 9;
    width: 100%;
    height: 100%;
}
.ctl-app .ctl-model-card-thumb-wrap .ctl-opt-thumb img {
    object-fit: contain; width: 100%; height: 100%;
}

/* Choix du modèle uniquement : padding 6px autour des images pour respirer */
.ctl-app .ctl-acc-primary .ctl-model-card-thumb-wrap .ctl-opt-thumb img {
    padding: 6px;
}

/* Cards horizontales NON-modèle (ex: PPF) : fond blanc sur la zone image
   au lieu du gris-soft par défaut. Le Choix du modèle garde son fond soft. */
.ctl-app .ctl-acc:not(.ctl-acc-primary) .ctl-model-card-thumb-wrap,
.ctl-app .ctl-acc:not(.ctl-acc-primary) .ctl-model-card-thumb-wrap .ctl-opt-thumb {
    background: #fff;
}
.ctl-app .ctl-model-card-text {
    flex: 1;
    /* Padding plus généreux pour matcher la hauteur Porsche (~109px) */
    padding: 18px 20px;
    display: flex;
    flex-direction: column;
    /* center + gap:0 → écart titre/prix de 2px (line-height), identique aux cards verticales */
    justify-content: center;
    gap: 0;
    min-width: 0;
}
/* Carte « fenêtre » (sous-groupe répété, coche carrée) — deux réglages :
   1) INSET COCHE : la coche doit être à 14px du bord droit (comme les cartes standard), pas aux 22px
      qu'impose le padding large du picker de modèle → padding DROIT du bloc texte à 12px (+2px de
      bordure = 14px). Le picker (radio, sans .ctl-win-card) garde son padding large.
   2) HAUTEUR : en desktop la miniature 16/9 à 33% de large ballonnait la carte (jusqu'à ~200px sur les
      cartes larges → énorme vide sous le contenu). On plafonne la miniature (150px) et on lui retire son
      aspect-ratio imposé → la hauteur suit le CONTENU texte, avec 12px de padding haut/bas (compact).
      Gauche laissée à 20px (respiration titre/photo).
   3) RYTHME VERTICAL : gap 8px entre le titre et la rangée statut (prix/pastille/coche) — sinon ils se
      touchent (gap 0) et la carte paraît tassée malgré le padding. 12px padding + 8px gap = aéré et
      équilibré, coche à 14px des DEUX bords (droite et bas). */
.ctl-app .ctl-win-card .ctl-model-card-text { padding: 12px 12px 12px 20px; gap: 8px; }
.ctl-app .ctl-win-card .ctl-model-card-thumb-wrap { max-width: 150px; }
.ctl-app .ctl-win-card .ctl-model-card-thumb-wrap .ctl-opt-thumb { aspect-ratio: auto; }
.ctl-app .ctl-model-card-title {
    font-size: 16px;
    font-weight: 400;
    color: var(--ctl-text);
    line-height: 1.3;
    margin: 0;
}
.ctl-app .ctl-model-card-bottom {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    /* margin-top: 0 (au lieu de auto) — l'écart titre/prix vient du gap parent */
    margin-top: 0;
}
.ctl-app .ctl-model-card-price {
    /* Style Porsche : prix en gris semi-transparent, MÊME taille que le titre (16px) */
    font-size: 16px;
    font-weight: 400;
    color: rgba(17, 17, 19, .6);
    margin: 0;
    flex: 1;
    min-width: 0;
    line-height: 1.5;
}
.ctl-app .ctl-model-card-subtitle {
    font-size: 14px;
    font-weight: 400;
    color: var(--ctl-text-soft);
    margin: 0;
    flex: 1;
    min-width: 0;
}

/* RADIO rond (pour Choix du modèle) */
.ctl-app .ctl-model-radio {
    width: 28px; height: 28px;
    border-radius: 50%;
    border: 1px solid var(--ctl-border-2);
    background: var(--ctl-bg-frosted);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    transition: all .15s;
}
.ctl-app .ctl-opt:hover .ctl-model-radio { border-color: var(--ctl-text); }
.ctl-app .ctl-opt.is-selected .ctl-model-radio {
    border-color: var(--ctl-text);
    background: var(--ctl-text);
}
.ctl-app .ctl-opt.is-selected .ctl-model-radio::after {
    content: "";
    width: 10px; height: 10px;
    background: #fff;
    border-radius: 50%;
}

/* "i" sticker dans la model card — taille Porsche 24px */
.ctl-app .ctl-model-card .ctl-opt-info {
    position: absolute !important;
    top: 0 !important; left: 0 !important;
    width: 24px !important; height: 24px !important;
    min-width: 24px !important; min-height: 24px !important;
    border-radius: 0 0 var(--ctl-radius-sm) 0 !important;
    background: var(--ctl-bg-soft) !important;
    z-index: 5 !important;
}

/* v1.5.2 : règles mobile (model card horizontal compact + options 2-col) déplacées dans le bloc RESPONSIVE @media (max-width: 1023px) plus haut. */

/* === Mobile très étroit (≤ 380px) — ajustements typographiques === */
@media (max-width: 380px) {
    .ctl-app .ctl-opt-content { padding: 6px 8px 8px !important; }
    .ctl-app .ctl-opt-title,
    .ctl-app .ctl-opt-price { font-size: 12px !important; }
    .ctl-app .ctl-model-card-thumb-wrap { flex: 0 0 40% !important; max-width: 40% !important; }
    /* Carte « fenêtre » : coche alignée sur l'inset des cartes standard (bordure 2px + 8px = 10px).
       Bordure fenêtre = 1px → padding 9px (1 + 9 = 10px) pour un écart identique. */
    .ctl-app .ctl-win-card .ctl-model-card-text { padding-right: 9px !important; }
}

/* === LENGTH PICKER (dropdown longueur véhicule) === */
.ctl-app .ctl-length-picker {
    margin-top: 18px;
    padding-top: 18px;
    border-top: 1px solid var(--ctl-border);
}
.ctl-app .ctl-length-picker-label {
    display: block;
    font-size: 13px;
    font-weight: 600;
    color: var(--ctl-text);
    margin: 0 0 8px;
    text-transform: uppercase;
    letter-spacing: .5px;
}
.ctl-app select.ctl-length-picker-select {
    width: 100% !important;
    height: auto !important;
    min-height: 52px !important;
    padding: 14px 44px 14px 16px !important;
    font-size: 15px !important;
    line-height: 1.4 !important;
    color: var(--ctl-text) !important;
    background-color: #fff !important;
    border: 1px solid var(--ctl-border-2) !important;
    border-radius: var(--ctl-radius) !important;
    appearance: none !important;
    -webkit-appearance: none !important;
    -moz-appearance: none !important;
    background-image: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23010205' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") !important;
    background-repeat: no-repeat !important;
    background-position: right 14px center !important;
    background-size: 18px 18px !important;
    cursor: pointer !important;
    font-family: inherit !important;
    box-sizing: border-box !important;
    margin: 0 !important;
    box-shadow: none !important;
    text-overflow: ellipsis !important;
    white-space: nowrap !important;
    overflow: hidden !important;
    transition: border-color .15s !important;
}
.ctl-app select.ctl-length-picker-select:hover { border-color: var(--ctl-text) !important; }
.ctl-app select.ctl-length-picker-select:focus {
    outline: none !important;
    border-color: var(--ctl-text) !important;
    box-shadow: 0 0 0 2px rgba(1,2,5,.1) !important;
}

/* Loading shimmer */
.ctl-app[data-loading="1"] .ctl-accordions::before {
    content: "";
    display: block;
    height: 200px;
    background: linear-gradient(90deg, transparent, rgba(0,0,0,.04), transparent);
    background-size: 200% 100%;
    animation: ctlShimmer 1.4s linear infinite;
    border-radius: 12px;
    margin: 24px 0;
}
@keyframes ctlShimmer {
    0% { background-position: 200% 0; }
    100% { background-position: -200% 0; }
}

/* ============================================================
   THÈME TESLA — accent bleu #3e6ae1 (couche de surcharge)
   Sélections + CTA principal passent en bleu Tesla.
   Ajouté en fin de fichier : ne modifie pas les règles ci-dessus.
   ============================================================ */
.ctl-app,
.ctl-modal {
    /* Accent de marque T-Lab (rouge). Les variables gardent leur nom « blue »
       pour rester compatibles avec les règles ci-dessous, mais portent le rouge. */
    --ctl-blue:      #E11B22;
    --ctl-blue-dark: #B3161B;
    --ctl-blue-soft: rgba(225, 27, 34, .08);
}

/* --- Option simple sélectionnée : bordure + case bleues --- */
.ctl-app .ctl-opt.is-selected { border-color: var(--ctl-blue); }
.ctl-app .ctl-opt.is-selected .ctl-opt-check {
    border-color: var(--ctl-blue);
    background: var(--ctl-blue);
}

/* --- Swatch (coloris) sélectionné : contour bleu --- */
.ctl-app .ctl-opt-swatch.is-selected { outline-color: var(--ctl-blue); }

/* --- Carte modèle / finition sélectionnée : bordure bleue + fond légèrement teinté --- */
.ctl-app .ctl-model-card.is-selected,
.ctl-app .ctl-model-card[aria-checked="true"],
.ctl-app .ctl-model-card.is-active,
.ctl-app .ctl-opt.is-selected .ctl-model-card {
    border-color: var(--ctl-blue) !important;
    background: var(--ctl-blue-soft) !important;
}

/* --- Radio des cartes modèle : pastille bleue quand sélectionné --- */
.ctl-app .ctl-opt.is-selected .ctl-model-radio { border-color: var(--ctl-blue); }
.ctl-app .ctl-opt.is-selected .ctl-model-radio::after { background: var(--ctl-blue); }

/* --- Sélecteur de finition : focus bleu --- */
.ctl-app .ctl-length-picker-select:focus {
    border-color: var(--ctl-blue);
    outline: none;
    box-shadow: 0 0 0 3px var(--ctl-blue-soft);
}

/* --- CTA principal en bleu Tesla (barre du haut, barre sticky, bouton récap) --- */
.ctl-app .ctl-topbar-btn-primary,
.ctl-app .ctl-btn-primary,
.ctl-modal .ctl-btn-primary,
.ctl-app .ctl-sticky-bar-btn {
    background: var(--ctl-blue) !important;
    border-color: var(--ctl-blue) !important;
    color: #fff !important;
}
.ctl-app .ctl-topbar-btn-primary:hover,
.ctl-app .ctl-btn-primary:hover,
.ctl-modal .ctl-btn-primary:hover,
.ctl-app .ctl-sticky-bar-btn:hover {
    background: var(--ctl-blue-dark) !important;
    border-color: var(--ctl-blue-dark) !important;
    color: #fff !important;
}

/* ============================================================
   Header WoodMart : désactivation du sticky SUR LA PAGE CONFIGURATEUR
   ------------------------------------------------------------
   frontend.css n'est chargé QUE sur les pages contenant le configurateur :
   ces règles ne s'appliquent donc qu'ici (pas de body class nécessaire).

   Mécanisme WoodMart (mode « Stick on scroll » / sticky-real, sans clone),
   vérifié en live sur la page :
     - au scroll, .whb-main-header passe en position:fixed (top = hauteur de
       la barre admin) → il chevauche le contenu et masque la .ctl-topbar ;
     - .whb-header reçoit un padding-top de réservation (= hauteur du header,
       ~110px) qui crée un gros espace blanc au-dessus du header.

   Correctif (testé aux deux états, en haut ET au scroll) :
     - .whb-main-header reste dans le flux (jamais fixed) → le header défile
       normalement et disparaît ;
     - padding-top/height de réservation annulés → plus aucun espace blanc.
   La .ctl-topbar du configurateur (position:sticky; top:0) prend alors le
   relais comme seule barre collante, exactement comme le Classe V.

   Header NON sticky sur desktop ET mobile (il défile avec la page).
   Piège de la « saccade » (mobile) : en mode whb-sticked, WoodMart met la bande
   du haut (.whb-top-bar) en display:none → le header rétrécit de 101→60px ;
   comme on l'a remis dans le flux (position:static), ce repli fait remonter tout
   le contenu d'un coup. On l'empêche en mobile en forçant la bande à rester
   affichée. En desktop la rangée logo/menu est masquée et la .ctl-topbar prend
   le relais, donc le repli de la bande n'y pose pas de problème. */
@media (min-width: 1024px) {
    .whb-header { padding-top: 0 !important; height: auto !important; min-height: 0 !important; }
    .whb-header .whb-main-header { position: static !important; top: auto !important; transform: none !important; }
}
@media (max-width: 1023px) {
    .whb-header { padding-top: 0 !important; height: auto !important; min-height: 0 !important; }
    .whb-header .whb-main-header { position: static !important; top: auto !important; transform: none !important; }
    /* empêche le repli de la bande (display:none en sticked) → le header garde sa
       hauteur pleine, défile d'un bloc, sans saccade. */
    .whb-header.whb-sticked .whb-top-bar { display: block !important; }
}

/* ============================================================
   Récap : Sous-total · Remise · Total · Acompte · Immobilisation
   ============================================================ */
.ctl-totals { margin-bottom: 20px; }
.ctl-totals .ctl-total-line {
    display: flex;
    flex-direction: row;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
    padding: 7px 0;
    border: 0;
    margin: 0;
    font-size: 14px;
    color: var(--ctl-text-mute);
}
/* Respecte l'attribut hidden (sinon le display:flex ci-dessus l'écrase) :
   la ligne « Remise » ne s'affiche que si une remise est appliquée. */
.ctl-totals .ctl-total-line[hidden] { display: none !important; }
.ctl-totals .ctl-total-line > span:last-child {
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}
.ctl-totals .ctl-subtotal-row { border-top: 1px solid var(--ctl-border); }
.ctl-totals .ctl-discount-row { color: var(--ctl-blue, #3e6ae1); font-weight: 500; }
.ctl-totals .ctl-grand-total {
    border-top: 1px solid var(--ctl-border);
    margin-top: 4px;
    padding-top: 12px;
    color: var(--ctl-text);
}
.ctl-totals .ctl-grand-total .ctl-total-label {
    font-size: 16px;
    font-weight: 500;
    color: var(--ctl-text);
    line-height: 1.4;
}
.ctl-totals .ctl-grand-total .ctl-total-amount {
    font-size: 24px;
    font-weight: 500;
    line-height: 1.3;
}
.ctl-totals .ctl-acompte-row > span:last-child,
.ctl-totals .ctl-jours-row > span:last-child {
    font-weight: 500;
    color: var(--ctl-text);
}

/* ============================================================
   Email-gate (popup avant téléchargement de la configuration)
   ============================================================ */
.ctl-lead-overlay {
    position: fixed;
    inset: 0;
    z-index: 100000;
    display: none;
    align-items: center;
    justify-content: center;
    padding: 20px;
}
.ctl-lead-overlay.is-open { display: flex; }
.ctl-lead-backdrop {
    position: absolute;
    inset: 0;
    background: rgba(10, 10, 14, .55);
}
.ctl-lead-dialog {
    position: relative;
    width: 100%;
    max-width: 440px;
    background: var(--ctl-bg);
    border-radius: var(--ctl-radius-lg);
    box-shadow: 0 24px 60px rgba(0, 0, 0, .25);
    padding: 32px 28px 26px;
    font-family: var(--ctl-font);
}
/* !important + scope .ctl-app : on bat les styles globaux de boutons WoodMart. */
.ctl-app .ctl-lead-close {
    position: absolute !important;
    top: 10px !important;
    right: 10px !important;
    left: auto !important;
    width: 34px !important;
    height: 34px !important;
    min-height: 0 !important;
    margin: 0 !important;
    padding: 0 !important;
    border: 0 !important;
    background: transparent !important;
    box-shadow: none !important;
    color: var(--ctl-text-mute) !important;
    cursor: pointer;
    border-radius: 50% !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    z-index: 2;
}
.ctl-app .ctl-lead-close:hover { background: var(--ctl-bg-soft) !important; color: var(--ctl-text) !important; }
.ctl-lead-title { font-size: 20px; font-weight: 500; color: var(--ctl-text); margin: 0 0 8px; }
.ctl-lead-text  { font-size: 14px; color: var(--ctl-text-mute); margin: 0 0 18px; line-height: 1.5; }
.ctl-lead-form  { display: flex; flex-direction: column; gap: 12px; }
.ctl-lead-label { display: flex; flex-direction: column; gap: 6px; font-size: 13px; font-weight: 500; color: var(--ctl-text); }
.ctl-lead-opt   { color: var(--ctl-text-mute); font-weight: 400; }
.ctl-lead-req   { color: var(--ctl-blue); }
.ctl-lead-input {
    width: 100%;
    height: 44px;
    padding: 0 14px;
    border: 1px solid var(--ctl-border-2);
    border-radius: var(--ctl-radius-sm);
    font-size: 15px;
    font-family: inherit;
    color: var(--ctl-text);
    background: #fff;
    box-sizing: border-box;
}
.ctl-lead-input:focus {
    outline: none;
    border-color: var(--ctl-blue);
    box-shadow: 0 0 0 3px var(--ctl-blue-soft);
}
/* Placeholder clairement « indice » (gris clair), pas du texte saisi. */
.ctl-lead-input::placeholder { color: #a7a7af; opacity: 1; font-weight: 400; }
.ctl-lead-input::-webkit-input-placeholder { color: #a7a7af; }
/* Honeypot anti-robot : invisible et hors-flux. */
.ctl-hp {
    position: absolute !important;
    left: -9999px !important;
    top: auto;
    width: 1px;
    height: 1px;
    opacity: 0;
    overflow: hidden;
    pointer-events: none;
}
.ctl-lead-error { color: #c2122b; font-size: 13px; margin: -2px 0 0; }
.ctl-lead-consent { display: flex; align-items: flex-start; gap: 8px; font-size: 12.5px; color: var(--ctl-text-mute); line-height: 1.45; margin: 2px 0 0; cursor: pointer; }
.ctl-lead-consent input { margin-top: 2px; flex: 0 0 auto; }
.ctl-lead-submit { margin-top: 6px; justify-content: center; }
.ctl-lead-submit[disabled] { opacity: .6; cursor: default; }
.ctl-lead-note  { font-size: 11.5px; color: var(--ctl-text-mute); line-height: 1.5; margin: 10px 0 0; }

/* ============================================================
   Cartes plus carrées (radius 8px) — esprit Tesla.
   Surcharge ciblée pour ne pas toucher swatches / modale.
   ============================================================ */
.ctl-app .ctl-acc,
.ctl-app .ctl-opt,
.ctl-app .ctl-model-card,
.ctl-app .ctl-model-card .ctl-model-card-inner { border-radius: 8px !important; }

/* ===== Sélecteur de couleurs façon Porsche : menus Type + Groupe + grille de vignettes ===== */
.ctl-app .ctl-color-picker { padding-top: 2px; }
.ctl-app .ctl-cp-filters { display: flex; flex-wrap: wrap; gap: 16px; margin-bottom: 18px; }
.ctl-app .ctl-cp-field { display: flex; flex-direction: column; gap: 7px; flex: 1 1 220px; min-width: 200px; }
.ctl-app .ctl-cp-label { font-size: 15px; color: var(--ctl-text-soft); }
.ctl-app .ctl-cp-selectwrap { position: relative; }
.ctl-app .ctl-cp-selectwrap select {
    -webkit-appearance: none; -moz-appearance: none; appearance: none;
    width: 100%; box-sizing: border-box;
    /* height:auto + min-height : le thème (WoodMart) impose height:42px qui, avec le padding
       en border-box, réduit la zone de texte sous la line-height → texte tronqué. */
    height: auto !important; min-height: 48px;
    padding: 12px 42px 12px 16px;
    font: inherit; font-size: 15px; line-height: 1.3;
    color: var(--ctl-text);
    background-color: var(--ctl-bg-soft);
    /* WoodMart ajoute une flèche en background-image sur les <select> malgré appearance:none →
       elle se superposait à notre chevron ::after (chevron dupliqué). On la retire. */
    background-image: none !important;
    border: 1px solid var(--ctl-border);
    border-radius: 14px;
    cursor: pointer;
}
.ctl-app .ctl-cp-selectwrap select:focus { outline: none; border-color: var(--ctl-text); }
.ctl-app .ctl-cp-selectwrap::after {
    content: ""; position: absolute; right: 18px; top: 50%; margin-top: -6px;
    width: 9px; height: 9px;
    border-right: 2px solid var(--ctl-text-soft);
    border-bottom: 2px solid var(--ctl-text-soft);
    transform: rotate(45deg);
    pointer-events: none;
}
.ctl-app .ctl-swatch-grid.ctl-cp-grid { grid-template-columns: repeat(6, 1fr); }
.ctl-app .ctl-cp-swatch.is-cp-hidden { display: none !important; }
/* Pas de nom sur les vignettes du sélecteur (on garde juste le placeholder hachuré neutre). */
.ctl-app .ctl-cp-swatch .ctl-opt-swatch-placeholder { font-size: 0; }
@media (max-width: 600px) {
    .ctl-app .ctl-cp-filters { gap: 12px; }
    .ctl-app .ctl-cp-field { flex: 1 1 100%; }
    .ctl-app .ctl-swatch-grid.ctl-cp-grid { grid-template-columns: repeat(4, 1fr); }
}

/* Le nombre de cartes par ligne (groupe / sous-groupe) est désormais piloté depuis le builder
   (`_ctl_cards_per_row` / `_ctl_subgroup_cols`) et appliqué en style inline `!important` par
   frontend.js (applyGridCols) → plus de règle codée en dur par libellé de sous-groupe. */
