/* =====================================================================
   DECKUNIVERS — THEME CLAIR, LOT 1 (21/09/2026)
   ---------------------------------------------------------------------
   Cette feuille est chargee UNIQUEMENT en mode previsualisation, APRES
   assets/css/style.css, et tout y est porte par le selecteur racine
   `.du-clair` pose sur <html> par includes/header.php.

   CONSEQUENCE DIRECTE, ET C'EST LE POINT LE PLUS IMPORTANT :
   - assets/css/style.css n'est PAS modifie ;
   - les pages d'administration, qui chargent style.css via admin/header.php,
     ne chargent jamais cette feuille et ne portent jamais la classe
     .du-clair — leur rendu ne peut donc pas changer, par construction ;
   - un visiteur sans le cookie ne recoit meme pas ce fichier.

   METHODE : le theme sombre est presque entierement pilote par les
   variables de :root. On les redefinit ici, ce qui bascule d'un coup
   l'ecrasante majorite des composants ; le reste de la feuille ne traite
   que les endroits ou style.css ecrit une couleur EN DUR, releves un par
   un dans le fichier (et non a l'oeil).

   ZONES SOMBRES ASSUMEES, et pourquoi :
   le mot « DECK » du logo est BLANC (contraste median 3,30:1 sur blanc,
   2,89:1 sur gris leger — sous le seuil de 3:1). Le logo ne peut donc pas
   etre pose sur une surface claire. Restent sombres :
     .site-top (annonces + en-tete), .tc-barre-categories, le hero, le bandeau
     de marque, le pied de page, et la PLAQUE du logo dans chaque tuile
     de plateforme (cinq des onze logos sont des aplats blancs).
   ===================================================================== */

/* ---------------------------------------------------------------------
   1. JETONS — palette validee sur la maquette du 21/09/2026
   Contrastes verifies : texte 14,1:1, texte doux 5,26:1, blanc sur
   violet 7,1:1, blanc sur encre 18,69:1.
   --------------------------------------------------------------------- */
.du-clair {
    /* palette du nouveau theme */
    --tc-fond: #f7f8fb;
    --tc-surface: #ffffff;
    --tc-surface-2: #f1f2f8;
    --tc-bordure: #e5e7f0;
    --tc-bordure-forte: #d3d6e4;
    --tc-encre: #14101f;
    --tc-texte: #2a2438;
    --tc-texte-doux: #6b6480;
    --tc-violet: #6d28d9;
    --tc-violet-clair: #f3ecfe;
    --tc-magenta: #c227b8;
    --tc-cyan: #0e9fc4;
    --tc-vert: #0f8f5f;
    --tc-vert-fond: #e6f6ef;
    --tc-ambre: #8a6410;
    --tc-ambre-fond: #fdf3dd;
    /* OR DES ETOILES DE NOTATION.
       Une note en etoiles est un ELEMENT GRAPHIQUE : le critere applicable
       est le 3:1 du non-texte (WCAG 1.4.11), pas le 4,5:1 du texte. C'est
       l'or LE PLUS CLAIR qui tienne 3:1 sur les SEPT surfaces du theme
       portant du texte (voir section 20.b). H=42deg, saturation 100 % :
       la teinte reste franchement doree, la convention attendue pour une
       note. Source unique : ne pas ecrire la valeur ailleurs. */
    --tc-or: #b57f00;
    --tc-rouge: #c02626;
    --tc-rouge-fond: #fdeaea;
    --tc-degrade: linear-gradient(90deg, #d434c8 0%, #7c3aed 52%, #22b8e0 100%);
    /* MEME DEGRADE, ASSOMBRI, POUR CE QUI PORTE DU TEXTE BLANC.
       Mesure : sur les butees du degrade clair, le blanc donne 4,10:1 au
       magenta, 5,70:1 au violet mais 2,33:1 au cyan — un bouton dont la
       fin du libelle tombe dans le cyan est illisible. Les butees
       assombries donnent 5,78 / 7,10 / 4,62:1, toutes au-dessus du seuil,
       en gardant les trois teintes de la marque.
       Le degrade CLAIR reste utilise partout ou il ne porte pas de
       texte : filet sous l'en-tete, tranche des cartes, accents. */
    --tc-degrade-texte: linear-gradient(90deg, #b3219f 0%, #6d28d9 55%, #0b7f9e 100%);
    --tc-ombre: 0 1px 2px rgba(20, 16, 31, .05), 0 8px 24px rgba(20, 16, 31, .06);
    --tc-ombre-forte: 0 2px 6px rgba(20, 16, 31, .08), 0 18px 44px rgba(20, 16, 31, .10);
    /* teintes claires posees SUR les zones sombres */
    --tc-sur-sombre: rgba(255, 255, 255, .88);
    --tc-sur-sombre-fort: #ffffff;
    --tc-voile-clair: rgba(255, 255, 255, .09);
    --tc-voile-bord: rgba(255, 255, 255, .17);

    /* --- reaffectation des variables de style.css --- */
    --bg-primary: #f7f8fb;
    --bg-secondary: #f1f2f8;
    --bg-card: #ffffff;
    --bg-card-hover: #fbfbfe;
    --accent: #6d28d9;
    /* --accent-light sert de couleur de TEXTE (liens, libelles, prix).
       Sur fond clair il doit rester lisible : #6d28d9 donne 7,1:1 sur
       blanc, la variante pale d'origine (#a78bfa) tombait a 2,2:1. */
    --accent-light: #6d28d9;
    --accent-glow: rgba(109, 40, 217, .18);
    --success: #0f8f5f;
    --danger: #c02626;
    --warning: #8a6410;
    --text-primary: #14101f;
    --text-secondary: #2a2438;
    --text-muted: #6b6480;
    --border: #e5e7f0;
    --radius: 14px;
    --radius-sm: 10px;
    --shadow: 0 1px 2px rgba(20, 16, 31, .05), 0 8px 24px rgba(20, 16, 31, .06);

    background: var(--tc-fond);
}

/* ---------------------------------------------------------------------
   2. SOCLE
   --------------------------------------------------------------------- */
.du-clair body {
    background: var(--tc-fond);
    color: var(--tc-texte);
    -webkit-font-smoothing: antialiased;
}

.du-clair a { color: var(--tc-violet); }
.du-clair a:hover { color: var(--tc-magenta); }

.du-clair h1, .du-clair h2, .du-clair h3, .du-clair h4 { color: var(--tc-encre); }

.du-clair ::selection { background: var(--tc-violet-clair); color: var(--tc-encre); }

/* ---------------------------------------------------------------------
   3. BLOC FIXE DU HAUT — SOMBRE
   On ne touche NI a position:fixed, NI a la cale, NI au script de mesure :
   c'est le correctif iOS du 16/09, seules les couleurs changent ici.
   --------------------------------------------------------------------- */
.du-clair .site-top {
    background: var(--tc-encre);
    /* En defilement, le bloc fixe passe au-dessus du contenu clair : une
       elevation le detache, la ou un filet clair serait invisible. */
    box-shadow: 0 6px 20px rgba(20, 16, 31, .18);
}
.du-clair .header {
    background: transparent;
    border-bottom: 0;
}

.du-clair .user-menu-link { color: var(--tc-sur-sombre); }
.du-clair .user-menu-link:hover { color: #fff; }
/* Le lien de deconnexion porte color:var(--text-muted) EN LIGNE dans
   includes/header.php : sur fond sombre il tomberait a 3,1:1. */
.du-clair .header .user-menu-link[href="/logout.php"] { color: rgba(255, 255, 255, .62) !important; }
.du-clair .header .user-menu-link[href="/logout.php"]:hover { color: #fff !important; }

.du-clair .credits-badge {
    background: var(--tc-voile-clair);
    border: 1px solid var(--tc-voile-bord);
    color: #fff;
}
.du-clair .credits-badge:hover { background: rgba(255, 255, 255, .15); color: #fff; }
.du-clair .credits-badge .amount { color: #cbb6fd; }

/* Pastille de verification d'identite, sur fond sombre. */
.du-clair .header .kyc-badge--unverified {
    color: rgba(255, 255, 255, .78);
    border-color: rgba(255, 255, 255, .34);
}
.du-clair .header .kyc-badge-link:hover .kyc-badge--unverified { color: #fff; border-color: rgba(255, 255, 255, .6); }

/* --- navigation par categorie : la navigation ACTUELLE, restylee ---
   Aucune barre de recherche, aucun menu deroulant ajoute ici : c'est le
   LOT 2. Seules les couleurs et l'etat actif changent.

   CORRECTIF DU 24/09/2026 : BARRE CLAIRE A L'ARRIVEE SUR IPHONE.
   Le fond sombre de la barre et la couleur de ses libelles sont portes
   par UNE SEULE regle, sans condition, sur .tc-barre-categories : un
   conteneur qui NE DEFILE PAS, pose autour de <nav> dans
   includes/header.php.
   POURQUOI PLUS SUR .categories-nav : c'est un conteneur a defilement
   horizontal. WebKit compose tout conteneur qui defile ET deborde (le
   cas du telephone) en calques distincts : son FOND est peint dans le
   calque principal, ses LIBELLES dans le calque du contenu defilant
   (RenderLayerBacking). Ce fond n'avait aucune couleur opaque (le
   raccourci `background` des degrades la remettait a transparent) : si
   ce calque n'est pas peint, la page claire apparait sous des libelles
   blancs. C'est exactement la capture du client. Pose sur un conteneur qui ne defile pas, le fond est
   peint avec la page, comme le hero, qui s'affiche bien chez le client.
   - couleur opaque SOUS les degrades : si un degrade n'est pas trace, la
     barre reste sombre ;
   - background-origin: border-box : les degrades couvrent aussi la
     bordure du haut, en un seul motif, sans dessin en mosaique ;
   - les libelles HERITENT leur couleur de cette regle : ils ne peuvent
     etre blancs que la ou ce fond s'applique ;
   - JAMAIS de transform, will-change, filter, backdrop-filter, z-index ni
     sticky sur ce conteneur : il doit rester peint avec la page.
     (24/09/2026, soir : il recoit position: relative pour porter le filet
     du haut, section 26.a A1.4. SANS z-index : ni contexte d'empilement ni
     calque compose, il reste peint avec la page.)
   Contraste mesure sur le pixel peint : voir CHANTIER.md, 24/09. */
.du-clair .tc-barre-categories {
    background-color: #1f1239;
    background-image:
        radial-gradient(90% 320% at 22% 50%, rgba(212, 52, 200, .18) 0%, rgba(212, 52, 200, 0) 70%),
        linear-gradient(118deg, #1a1033 0%, #241243 55%, #151e39 100%);
    background-origin: border-box;
    border-top: 1px solid rgba(255, 255, 255, .09);
    color: rgba(255, 255, 255, .86);
    --tc-barre-libelle-fort: #fff;
}
/* Le conteneur qui defile reste TRANSPARENT et sans bordure : il n'a plus
   rien a peindre dans son propre calque. -webkit-overflow-scrolling:touch
   (style.css) n'agit plus sur le defilement depuis iOS 13 ; sur iPhone il
   ne fait plus que creer un contexte d'empilement. Neutralise ici. */
.du-clair .categories-nav {
    background: transparent;
    border-top: 0;
    border-bottom: 0;
    position: relative;
    -webkit-overflow-scrolling: auto;
}
/* FILET DE MARQUE — il ferme la zone sombre et « pose » la page claire
   dessous, sans trait gris.
   POURQUOI PAS SUR LA NAVIGATION : .categories-nav est un conteneur a
   DEFILEMENT HORIZONTAL (overflow-x:auto). Un ::after en position absolue
   y est place par rapport a la zone scrollable : des que la liste deborde,
   le filet part avec elle. On le pose donc en bordure HAUTE du premier
   bloc clair, qui ne defile pas.
   Sur l'ACCUEIL, la zone sombre se prolonge dans le bandeau de marque PUIS
   dans le hero : le filet y est au BAS DU HERO (section 10). La bordure de
   .main-content est donc neutralisee sur cette page. */
.du-clair .main-content {
    border-top: 3px solid transparent;
    border-image: var(--tc-degrade) 1;
}
.du-clair .main-content:has(> .landing-space--hero) {
    border-top: 0;
}
.du-clair .categories-list a {
    color: inherit;
    font-weight: 600;
    border-bottom-color: transparent;
}
.du-clair .categories-list a:hover,
.du-clair .categories-list a.active {
    color: var(--tc-barre-libelle-fort, inherit);
    background: rgba(255, 255, 255, .11);
    border-bottom-color: var(--tc-magenta);
}

/* ---------------------------------------------------------------------
   4. CONTENU CLAIR — titres, sections, cartes
   --------------------------------------------------------------------- */
.du-clair .main-content { background: var(--tc-fond); }

.du-clair .section-title { color: var(--tc-encre); letter-spacing: -.02em; }
.du-clair .section-sub { color: var(--tc-texte-doux); }

.du-clair .product-card {
    background: var(--tc-surface);
    border-color: var(--tc-bordure);
    box-shadow: var(--tc-ombre);
}
.du-clair .product-card:hover {
    border-color: var(--tc-violet);
    box-shadow: var(--tc-ombre-forte);
}
.du-clair .product-card-img { background: var(--tc-surface-2); color: var(--tc-violet); }

/* REPLI LOGO DE PLATEFORME — trou latent ferme.
   boutique.php et product.php remplacent l'image produit par
   <div class="platform-logo"> des que le fichier image manque ou est vide.
   Cinq des onze logos sont des aplats BLANCS : sur la vignette claire
   (#f1f2f8) ils seraient invisibles. Aucun des 65 produits n'est dans ce
   cas aujourd'hui (verifie), mais un fichier manquant suffirait.
   Le repli porte donc sa propre plaque sombre : il remplit deja toute la
   vignette (width/height 100%), il n'y a rien a ajouter au markup. */
.du-clair .platform-logo { background: var(--tc-encre); }
.du-clair .product-card-category { color: var(--tc-texte-doux); }
.du-clair .product-card-title { color: var(--tc-encre); }
.du-clair .product-card-value { color: var(--tc-texte-doux); }
.du-clair .price-credits { color: var(--tc-encre); }
.du-clair .price-eur { color: var(--tc-texte-doux); }

/* Etats de stock : les deux badges repris sur les fonds teintes du theme
   clair (les fonds translucides d'origine disparaissaient sur du blanc). */
.du-clair .stock-badge.in-stock {
    background: var(--tc-vert-fond);
    color: var(--tc-vert);
    border: 1px solid rgba(15, 143, 95, .22);
}
.du-clair .stock-badge.in-stock::before { background: var(--tc-vert); box-shadow: none; }
/* DEMANDE DU 09/07/2026 : « Epuise » a la MEME FORME que « En stock », avec
   sa CROIX ROUGE. Un premier jet l'avait passee en ambre pour le contraste :
   c'etait revenir sur un choix deja valide par le client. Le rouge est
   conserve, simplement assombri pour tenir sur son propre fond clair —
   #c02626 sur #fdeaea = 5,11:1. */
.du-clair .stock-badge.out-of-stock {
    background: var(--tc-rouge-fond);
    color: #c02626;
    border: 1px solid rgba(192, 38, 38, .22);
}
.du-clair .stock-badge.out-of-stock::before { color: #c02626; text-shadow: none; }

.du-clair .breadcrumb a { color: var(--tc-texte-doux); }
.du-clair .breadcrumb a:hover { color: var(--tc-violet); }
.du-clair .empty-state { color: var(--tc-texte-doux); }

/* ---------------------------------------------------------------------
   5. BOUTONS
   --------------------------------------------------------------------- */
.du-clair .btn { border-radius: 999px; }
.du-clair .btn-primary {
    background: var(--tc-degrade-texte);
    color: #fff;
    box-shadow: 0 6px 18px rgba(109, 40, 217, .22);
}
.du-clair .btn-primary:hover { box-shadow: 0 10px 26px rgba(109, 40, 217, .3); color: #fff; }
.du-clair .btn-outline {
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure-forte);
    color: var(--tc-encre);
}
.du-clair .btn-outline:hover { border-color: var(--tc-violet); color: var(--tc-violet); }
.du-clair .btn-success { background: var(--tc-vert); color: #fff; }
.du-clair .btn-danger { background: var(--tc-rouge); color: #fff; }

/* ---------------------------------------------------------------------
   6. FORMULAIRES, ALERTES, TABLEAUX, MODALES
   --------------------------------------------------------------------- */
.du-clair .form-group label { color: var(--tc-texte); }
.du-clair .form-control,
.du-clair .code-input-group input {
    background: var(--tc-surface);
    border-color: var(--tc-bordure-forte);
    color: var(--tc-encre);
}
.du-clair .form-control::placeholder { color: var(--tc-texte-doux); }
.du-clair .form-control:focus,
.du-clair .code-input-group input:focus {
    border-color: var(--tc-violet);
    box-shadow: 0 0 0 3px rgba(109, 40, 217, .16);
}

.du-clair .alert-success { background: var(--tc-vert-fond); color: #0b6b47; border-color: rgba(15, 143, 95, .28); }
.du-clair .alert-danger { background: var(--tc-rouge-fond); color: #9a1c1c; border-color: rgba(192, 38, 38, .26); }
.du-clair .alert-warning { background: var(--tc-ambre-fond); color: #6f5010; border-color: rgba(138, 100, 16, .28); }
.du-clair .alert-info { background: var(--tc-violet-clair); color: #432088; border-color: rgba(109, 40, 217, .2); }

.du-clair .badge-success { background: var(--tc-vert-fond); color: var(--tc-vert); }
.du-clair .badge-danger { background: var(--tc-rouge-fond); color: var(--tc-rouge); }
.du-clair .badge-warning { background: var(--tc-ambre-fond); color: var(--tc-ambre); }
.du-clair .badge-info { background: var(--tc-violet-clair); color: var(--tc-violet); }

.du-clair .table-wrap { background: var(--tc-surface); border-color: var(--tc-bordure); box-shadow: var(--tc-ombre); }
.du-clair th { background: var(--tc-surface-2); color: var(--tc-texte-doux); }
.du-clair td { color: var(--tc-texte); }
.du-clair tr:hover td { background: var(--tc-violet-clair); }

.du-clair .modal { background: var(--tc-surface); border-color: var(--tc-bordure); box-shadow: var(--tc-ombre-forte); }
.du-clair .modal-overlay { background: rgba(20, 16, 31, .45); }

.du-clair .login-page { background: var(--tc-fond); }
.du-clair .login-box {
    background: var(--tc-surface);
    border-color: var(--tc-bordure);
    box-shadow: var(--tc-ombre-forte);
}

.du-clair .delivered-code { background: var(--tc-vert-fond); border-color: rgba(15, 143, 95, .45); }
.du-clair .delivered-code .code { background: #fff; color: #0b6b47; border: 1px solid rgba(15, 143, 95, .3); }

.du-clair .legal-content h1, .du-clair .legal-content h2 { color: var(--tc-encre); }
.du-clair .legal-content p, .du-clair .legal-content li { color: var(--tc-texte); }
.du-clair .legal-content strong { color: var(--tc-encre); }
.du-clair .legal-content a { color: var(--tc-violet); }
.du-clair .legal-updated { color: var(--tc-texte-doux); }

/* ---------------------------------------------------------------------
   7. ESPACE CLIENT — onglets, commandes, tickets, messagerie, promo
   style.css ecrit ici des gris en dur, prevus pour du sombre.
   --------------------------------------------------------------------- */
.du-clair .profile-tabs { border-bottom-color: var(--tc-bordure); }
.du-clair .profile-tab { color: var(--tc-texte-doux); }
.du-clair .profile-tab:hover { color: var(--tc-encre); }
.du-clair .profile-tab.active { color: var(--tc-violet); border-bottom-color: var(--tc-violet); }

.du-clair .profile-section { background: transparent; }

.du-clair .order-history { background: var(--tc-surface); border-radius: var(--radius); }
.du-clair .order-history thead { background: var(--tc-surface-2); }
.du-clair .order-history th { color: var(--tc-texte-doux); border-bottom-color: var(--tc-bordure); }
.du-clair .order-history td { color: var(--tc-texte); border-bottom-color: var(--tc-bordure); }
.du-clair .order-history tbody tr:hover { background: var(--tc-violet-clair); }
.du-clair .order-history .status-completed { color: var(--tc-vert); }
.du-clair .order-history .status-pending { color: var(--tc-ambre); }
.du-clair .order-history .status-failed { color: var(--tc-rouge); }

.du-clair .ticket-list .ticket-item {
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure);
    box-shadow: var(--tc-ombre);
}
.du-clair .ticket-list .ticket-item:hover { border-color: var(--tc-violet); }
.du-clair .ticket-item .ticket-subject { color: var(--tc-encre); }
.du-clair .ticket-item .ticket-date { color: var(--tc-texte-doux); }
.du-clair .ticket-item .ticket-status.open { background: var(--tc-violet-clair); color: var(--tc-violet); }
.du-clair .ticket-item .ticket-status.closed { background: var(--tc-surface-2); color: var(--tc-texte-doux); }
.du-clair .ticket-item .ticket-status.answered { background: var(--tc-vert-fond); color: var(--tc-vert); }

.du-clair .chat-messages { background: var(--tc-surface); border-radius: var(--radius); }
.du-clair .chat-messages::-webkit-scrollbar-thumb { background: var(--tc-bordure-forte); }
.du-clair .chat-msg.user .meta,
.du-clair .chat-msg.admin .meta { color: var(--tc-texte-doux); }
.du-clair .chat-input textarea {
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure-forte);
    color: var(--tc-encre);
}
.du-clair .chat-input textarea:focus { border-color: var(--tc-violet); }
.du-clair .chat-input textarea::placeholder { color: var(--tc-texte-doux); }
.du-clair .chat-input button { background: var(--tc-violet); color: #fff; }
.du-clair .chat-input button:hover { background: #5b21b6; }
.du-clair .chat-input button:disabled { background: var(--tc-bordure-forte); color: var(--tc-texte-doux); }

.du-clair .promo-input input[type="text"] {
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure-forte);
    color: var(--tc-encre);
}
.du-clair .promo-input input[type="text"]:focus { border-color: var(--tc-violet); }
.du-clair .promo-input input[type="text"]::placeholder { color: var(--tc-texte-doux); }
.du-clair .promo-input button { background: var(--tc-violet); border-color: var(--tc-violet); color: #fff; }
.du-clair .promo-input button:hover { background: #5b21b6; }
.du-clair .promo-input .promo-result.success { color: var(--tc-vert); }
.du-clair .promo-input .promo-result.error { color: var(--tc-rouge); }

/* ---------------------------------------------------------------------
   8. VERIFICATION D'IDENTITE (KYC)
   --------------------------------------------------------------------- */
.du-clair .kyc-card {
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure);
    box-shadow: var(--tc-ombre);
}
.du-clair .kyc-intro, .du-clair .kyc-limit { color: var(--tc-texte-doux); }
.du-clair .kyc-label { color: var(--tc-encre); }
.du-clair .kyc-input {
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure-forte);
    color: var(--tc-encre);
}
.du-clair input[type=file].kyc-input::file-selector-button {
    background: var(--tc-violet-clair);
    color: var(--tc-violet);
    border: 1px solid rgba(109, 40, 217, .28);
}
.du-clair .kyc-msg--ok { background: var(--tc-vert-fond); border-color: rgba(15, 143, 95, .3); color: #0b6b47; }
.du-clair .kyc-msg--ko { background: var(--tc-rouge-fond); border-color: rgba(192, 38, 38, .3); color: #9a1c1c; }
.du-clair .kyc-state__title { color: var(--tc-encre); }
.du-clair .kyc-state__msg { color: var(--tc-texte-doux); }
/* Les pastilles HORS en-tete (page profil) sont sur fond clair. */
.du-clair .main-content .kyc-badge--unverified { color: var(--tc-texte-doux); border-color: var(--tc-bordure-forte); }
.du-clair .main-content .kyc-badge--pending { color: #6f5010; background: var(--tc-ambre-fond); border-color: rgba(138, 100, 16, .35); }

/* ---------------------------------------------------------------------
   9. TUNNEL DE PAIEMENT
   ON NE TOUCHE PAS a la geometrie : hauteur du conteneur de l'iframe,
   hauteur de l'iframe, regle mobile en ligne de payment.php, position du
   widget. Ce sont des reglages mesures le 10/07 et le 16/09. Couleurs
   seulement.
   --------------------------------------------------------------------- */
.du-clair .payment-section {
    background: var(--tc-surface);
    border-color: var(--tc-bordure);
    box-shadow: var(--tc-ombre);
}
.du-clair .pay-method-title { color: var(--tc-encre); }
.du-clair .pay-tab {
    background: var(--tc-surface);
    border-color: var(--tc-bordure-forte);
    color: var(--tc-texte-doux);
}
.du-clair .pay-tab:hover { border-color: var(--tc-violet); color: var(--tc-encre); }
.du-clair .pay-tab.active {
    border-color: var(--tc-violet);
    background: var(--tc-violet-clair);
    color: var(--tc-violet);
    box-shadow: none;
}
.du-clair .pay-offer-title { color: var(--tc-encre); }
.du-clair .pay-offer-card { background: var(--tc-surface-2); border-color: var(--tc-bordure); }
.du-clair .pay-offer-card:hover { border-color: var(--tc-violet); }
.du-clair .pay-offer-label { color: var(--tc-texte-doux); }
.du-clair .pay-offer-credits { color: var(--tc-encre); }
.du-clair .pay-offer-price { color: var(--tc-violet); }

/* Les paliers de recharge : fonds translucides blancs d'origine, donc
   invisibles sur clair. L'etat selectionne reste le SEUL signal fort,
   comme avant (le clavier le deplace, aria-checked le suit). */
.du-clair .pack-card {
    background: var(--tc-surface);
    border: 2px solid var(--tc-bordure-forte);
    color: var(--tc-texte);
}
.du-clair .pack-card:hover { border-color: rgba(109, 40, 217, .5); }
.du-clair .pack-card.is-selected {
    border-color: var(--tc-violet);
    background: var(--tc-violet-clair);
    box-shadow: 0 0 0 1px var(--tc-violet), 0 6px 20px rgba(109, 40, 217, .18);
}
.du-clair .pack-card .pack-price { color: var(--tc-encre); }

/* L'iframe Allopass porte EN LIGNE border:1px solid rgba(255,255,255,.1),
   invisible sur clair. On ne change QUE la couleur : la largeur reste a
   1 px, donc aucune reprise de mise en page, et ni la hauteur du
   conteneur ni celle de l'iframe ne sont touchees. */
.du-clair #iframe-container-audiotel iframe,
.du-clair #iframe-container-sms iframe { border-color: var(--tc-bordure-forte) !important; }

.du-clair .audiotel-waiting-box { background: var(--tc-surface); border-color: var(--tc-bordure); }
.du-clair .audiotel-waiting-title { color: var(--tc-encre); }
.du-clair .audiotel-waiting-text { color: var(--tc-texte-doux); }

/* Le voile d'achat reste SOMBRE : c'est un voile plein ecran, il doit
   couper la page, et son texte est clair. */
.du-clair .du-buy-overlay { background: rgba(20, 16, 31, .88); }
.du-clair .du-buy-overlay__text { color: #cbb6fd; }

/* ---------------------------------------------------------------------
   10. HERO — LA SEULE ZONE SPATIALE
   Le fond spatial a ete dessine pour du sombre : il est CONFINE ici.
   .landing-space--hero est pose par le gabarit du nouvel accueil ; sur
   tout autre usage de .landing-space, rien ne change.
   --------------------------------------------------------------------- */
.du-clair .landing-space--hero {
    background: radial-gradient(ellipse 130% 78% at 50% 0%, #2a1358 0%, #1a1035 34%, var(--tc-encre) 78%);
}
/* Le fondu de sortie d'origine allait vers #0a0a0f : neutralise. */
.du-clair .landing-space--hero .landing-space__fade { display: none; }
/* FILET DE MARQUE, au BAS DU HERO : c'est la que la zone sombre s'arrete.
   Elle vaut en-tete + navigation + BANDEAU DE MARQUE + hero — le bandeau
   est au-dessus du hero depuis le 21/09, dans la zone du menu.
   Le raccord bandeau/hero est net sans traitement : la butee du degrade
   du hero a 78 % vaut exactement --tc-encre, la couleur de la bande. */
.du-clair .landing-space--hero::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 3px;
    background: var(--tc-degrade);
    z-index: 2;
}
.du-clair .space-hero__kicker { color: #d9a5fd; }
.du-clair .space-hero__title { color: #fff; }
.du-clair .space-hero__sub { color: rgba(255, 255, 255, .8); }
.du-clair .space-hero__trust .trust-item { color: rgba(255, 255, 255, .82); }
.du-clair .space-hero__trust .trust-item::before { background: #35d99a; box-shadow: 0 0 8px rgba(53, 217, 154, .7); }
/* Le bouton principal garde SES animations (poussee periodique + reflet) :
   elles sont definies sur .space-hero__cta dans style.css et ne sont pas
   touchees ici. Seul le remplissage suit le nouveau degrade de marque. */
.du-clair .space-hero__cta { background: var(--tc-degrade-texte); }

/* ---------------------------------------------------------------------
   11. TUILES DE PLATEFORME — le point de lisibilite du brief
   Cinq des onze logos sont des aplats BLANCS (playstation, xbox, steam,
   apple, roblox). Sur une tuile claire ils disparaissent (1:1).
   DECISION : la tuile reste claire, mais le logo est pose sur une PLAQUE
   SOMBRE a l'encre de la marque — 18,69:1 pour un aplat blanc, et les six
   logos couleur (google-play, nintendo, netflix, spotify, xbox-game-pass,
   twitch) gardent leurs couleurs officielles, fixees le 10/07/2026.
   L'alternative — forcer tous les logos en monochrome sombre — detruirait
   cette identite couleur : ecartee.
   --------------------------------------------------------------------- */
.du-clair .explore { background: transparent; }
.du-clair .explore-tile {
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure);
    box-shadow: var(--tc-ombre);
}
.du-clair .explore-tile:hover { border-color: var(--tc-violet); box-shadow: var(--tc-ombre-forte); }
.du-clair .explore-tile__head { color: var(--tc-encre); }
.du-clair .explore-tile__logo {
    background: var(--tc-encre);
    border-radius: 12px;
    padding: 0.7rem 1rem;
    display: flex;
    align-items: center;
    justify-content: center;
    min-width: 96px;
}
.du-clair .explore-tile__name { color: var(--tc-encre); font-weight: 700; }
.du-clair .explore-tile__chev { color: var(--tc-violet); }
.du-clair .explore-tile__head:hover .explore-tile__chev,
.du-clair .explore-tile__head:focus-visible .explore-tile__chev { color: var(--tc-magenta); }
.du-clair .explore-tile__submenu {
    background: var(--tc-surface);
    border-color: var(--tc-bordure);
    box-shadow: var(--tc-ombre-forte);
}
.du-clair .explore-tile__link { color: var(--tc-texte); }
.du-clair .explore-tile__link:hover { background: var(--tc-violet-clair); color: var(--tc-violet); }
.du-clair .explore-tile__all { color: var(--tc-violet); font-weight: 700; }
.du-clair .explore-tile__all:hover { color: var(--tc-magenta); }
.du-clair .explore-tile--all { background: var(--tc-degrade-texte); color: #fff; }
.du-clair .explore-tile--all:hover { color: #fff; }
@media (min-width: 769px) {
    .du-clair .explore-tile__submenu { border-color: var(--tc-bordure); }
}

/* ---------------------------------------------------------------------
   12. REASSURANCE ET AVIS
   --------------------------------------------------------------------- */
.du-clair .reassurance { background: var(--tc-surface); border-block: 1px solid var(--tc-bordure); }
.du-clair .reassurance-item__text strong { color: var(--tc-encre); }
.du-clair .reassurance-item__text span { color: var(--tc-texte-doux); }
.du-clair .reassurance-dot { background: var(--tc-vert); box-shadow: none; }

.du-clair .reviews-landing { background: transparent; }
.du-clair .reviews-avg__num { color: var(--tc-encre); }
.du-clair .reviews-avg__slash, .du-clair .reviews-avg__count { color: var(--tc-texte-doux); }
.du-clair .reviews-avg__stars { color: var(--tc-or); }
.du-clair .review-card {
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure);
    box-shadow: var(--tc-ombre);
}
.du-clair .review-card__head strong { color: var(--tc-encre); }
.du-clair .review-card__head .stars { color: var(--tc-or); }
.du-clair .review-card__date { color: var(--tc-texte-doux); }
.du-clair .review-card p { color: var(--tc-texte); }

/* DEMANDE DU 14/09/2026 : « fine ligne de separation » entre les sections.
   Le filet d'origine etait un degrade violet pale (rgba(167,139,250,.22)),
   invisible sur clair — il avait ete neutralise, ce qui supprimait une
   demande deja livree. Il est RETABLI, dans une teinte qui se voit sur
   clair, et etendu aux sections propres au nouveau gabarit.
   Exclues : .tc-rassure (le filet de marque du hero la separe deja) et les
   sections en surface blanche, qui portent leurs vraies bordures. */
/* Les sections posees sur surface blanche (.tc-section--surface) portent
   deja leurs vraies bordures haute et basse : leur ajouter ce filet
   ferait DEUX traits superposes. Mesure a l'appui, constate sur .explore. */
.du-clair .explore:not(.tc-section--surface)::before,
.du-clair .reassurance::before,
.du-clair .reviews-landing:not(.tc-section--surface)::before {
    display: block;
    background: linear-gradient(90deg, transparent, var(--tc-bordure-forte), transparent);
}
.du-clair .tc-section--surface::before { display: none; }
.du-clair .tc-section:not(.tc-section--surface):not(.tc-rassure) { position: relative; }
.du-clair .tc-section:not(.tc-section--surface):not(.tc-rassure)::before {
    content: "";
    position: absolute;
    top: 0;
    left: 50%;
    transform: translateX(-50%);
    width: min(1100px, 86%);
    height: 1px;
    background: linear-gradient(90deg, transparent, var(--tc-bordure-forte), transparent);
    pointer-events: none;
}

/* ---------------------------------------------------------------------
   13. PIED DE PAGE — SOMBRE (le logo y figure)
   --------------------------------------------------------------------- */
.du-clair .footer-bar {
    background: var(--tc-encre);
    border-top: 0;
    color: rgba(255, 255, 255, .7);
    padding: 1.6rem 1rem 1.3rem;
}
.du-clair .footer-bar a { color: rgba(255, 255, 255, .72); }
.du-clair .footer-bar a:hover { color: #fff; }
.du-clair .footer-bar-sep { color: rgba(255, 255, 255, .35); opacity: 1; }
.du-clair .lang-opt { color: rgba(255, 255, 255, .72); }
.du-clair .lang-opt:hover { color: #fff; }
.du-clair .lang-opt.active { background: var(--tc-violet); color: #fff; }

/* Le bandeau de cookies est pose en styles EN LIGNE dans
   includes/footer.php (fond sombre, texte en var(--text-secondary)).
   Sur le theme clair ce texte deviendrait sombre sur sombre : on passe
   le bandeau en clair, ce qui impose !important sur les proprietes
   ecrites en ligne. */
.du-clair #cookie-banner {
    background: var(--tc-surface) !important;
    border-top: 1px solid var(--tc-bordure) !important;
    box-shadow: 0 -8px 28px rgba(20, 16, 31, .10);
}
.du-clair #cookie-banner p { color: var(--tc-texte) !important; }
.du-clair #cookie-banner p a { color: var(--tc-violet) !important; }
.du-clair #cookie-banner button:first-of-type {
    border: 1px solid var(--tc-bordure-forte) !important;
    color: var(--tc-texte-doux) !important;
}
.du-clair #cookie-banner button:last-of-type { background: var(--tc-degrade-texte) !important; }

/* ---------------------------------------------------------------------
   14. NOUVEL ACCUEIL — sections propres au gabarit theme-clair
   --------------------------------------------------------------------- */
.du-clair .tc-section { padding: 3.2rem 0; }
.du-clair .tc-section--surface { background: var(--tc-surface); border-block: 1px solid var(--tc-bordure); }
.du-clair .tc-conteneur { max-width: 1200px; margin: 0 auto; padding: 0 1rem; }
.du-clair .tc-etiquette {
    display: inline-block;
    font-size: .72rem;
    font-weight: 800;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--tc-violet);
    background: var(--tc-violet-clair);
    padding: .32rem .7rem;
    border-radius: 999px;
    margin-bottom: .7rem;
}
.du-clair .tc-centre { text-align: center; }
.du-clair .tc-centre .tc-etiquette { margin-inline: auto; }

/* --- barre de reassurance --- */
/* La barre de reassurance suit immediatement le hero : c'est le filet au
   bas du hero qui fait la separation, elle n'en porte pas. */
.du-clair .tc-rassure { background: var(--tc-surface); border-bottom: 1px solid var(--tc-bordure); }
.du-clair .tc-rassure-grille {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: .5rem;
    padding: 1.1rem 0;
}
.du-clair .tc-rea { display: flex; align-items: center; gap: .7rem; padding: .4rem .6rem; line-height: 1.35; }
.du-clair .tc-rea__pastille {
    flex: none;
    width: 34px;
    height: 34px;
    border-radius: 10px;
    display: grid;
    place-items: center;
    background: var(--tc-violet-clair);
    color: var(--tc-violet);
}
.du-clair .tc-rea__pastille svg { width: 18px; height: 18px; }
.du-clair .tc-rea b { display: block; font-size: .86rem; color: var(--tc-encre); }
.du-clair .tc-rea span { color: var(--tc-texte-doux); font-size: .78rem; }

/* --- les deux facons de payer --- */
.du-clair .tc-payer-grille { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1.1rem; }
.du-clair .tc-carte-payer {
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure);
    border-radius: var(--radius);
    padding: 1.4rem 1.5rem;
    box-shadow: var(--tc-ombre);
    position: relative;
    overflow: hidden;
    display: flex;
    flex-direction: column;
    gap: .55rem;
}
.du-clair .tc-carte-payer::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 4px;
    background: var(--tc-filet); /* 25/09 : meme definition que les autres lignes */
}
.du-clair .tc-carte-payer h3 { margin: 0; font-size: 1.05rem; font-weight: 800; color: var(--tc-encre); }
.du-clair .tc-carte-payer p { margin: 0; font-size: .9rem; color: var(--tc-texte-doux); }
.du-clair .tc-puces { display: flex; flex-wrap: wrap; gap: .4rem; }
.du-clair .tc-puce {
    font-size: .74rem;
    font-weight: 700;
    background: var(--tc-surface-2);
    border: 1px solid var(--tc-bordure);
    border-radius: 999px;
    padding: .24rem .6rem;
    color: var(--tc-texte-doux);
}
.du-clair .tc-carte-payer .btn { align-self: flex-start; margin-top: .3rem; }

/* --- comment ca marche --- */
.du-clair .tc-etapes {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(215px, 1fr));
    gap: 1.1rem;
    counter-reset: tcetape;
    margin-top: 1.6rem;
}
.du-clair .tc-etape {
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure);
    border-radius: var(--radius);
    padding: 1.6rem 1.25rem 1.25rem;
    position: relative;
    counter-increment: tcetape;
    box-shadow: var(--tc-ombre);
}
.du-clair .tc-etape::before {
    content: counter(tcetape);
    position: absolute;
    top: -14px;
    left: 1.25rem;
    width: 30px;
    height: 30px;
    border-radius: 9px;
    background: var(--tc-degrade-texte);
    color: #fff;
    font-weight: 800;
    font-size: .92rem;
    display: grid;
    place-items: center;
}
.du-clair .tc-etape h3 { margin: .3rem 0 .4rem; font-size: .98rem; font-weight: 800; color: var(--tc-encre); }
.du-clair .tc-etape p { margin: 0; font-size: .87rem; color: var(--tc-texte-doux); line-height: 1.55; }

/* ---------------------------------------------------------------------
   15. BANDEAU DE MARQUE EN GRAND
   Regles reprises telles quelles du bandeau d'origine, car ce sont des
   INVARIANTS demontres le 16/09/2026 :
     - une copie de piste doit rester PLUS LARGE que le conteneur, sinon
       un vide apparait a droite en fin de cycle ;
     - padding-left DOIT valoir exactement gap, sinon le raccord se voit ;
     - masquer une serie la retire des DEUX copies a l'identique, donc la
       symetrie est preservee ;
     - la duree doit suivre la distance : reduire la piste a duree
       constante divise la vitesse. SI LE NOMBRE DE SERIES D'UN PALIER
       CHANGE, RECALCULER SA DUREE.
   Ici le conteneur est la LARGEUR TOTALE de la fenetre et les logos sont
   plus grands : les deux valeurs ont ete remesurees, elles ne sont pas
   recopiees de l'ancien bandeau.
   POSITION (21/09/2026) : juste SOUS LE HERO, avant la barre de
   reassurance. Elle prolonge la zone sombre du haut de page. Le gabarit
   de l'accueil la pose la ; deplacer ce bloc oblige a deplacer AUSSI le
   filet de marque, qui marque la fin de la zone sombre.
   --------------------------------------------------------------------- */
.du-clair .bandeau-marque {
    display: block;
    overflow: hidden;
    background: var(--tc-encre);
    padding: 2.1rem 0;
    position: relative;
}
.du-clair .bandeau-marque::before,
.du-clair .bandeau-marque::after {
    content: "";
    position: absolute;
    top: 0;
    bottom: 0;
    width: 110px;
    z-index: 2;
    pointer-events: none;
}
/* PALIER 100 % OPAQUE DES FONDUS — regle posee le 15/09/2026 : il doit etre
   AU MOINS aussi large que le logo le plus large, sinon un logo se trouve
   tronque au bord au lieu d'y disparaitre.
   Mesure du 21/09 a cette nouvelle taille : le plus large est
   xbox-game-pass, 66 px en bureau. Le palier passe donc de 34 a 70 px.
   La LARGEUR TOTALE du fondu ne bouge pas (110 px) : seule la traine se
   raccourcit, la part de bande mangee reste identique. */
.du-clair .bandeau-marque::before { left: 0; background: linear-gradient(90deg, var(--tc-encre) 70px, transparent 100%); }
.du-clair .bandeau-marque::after { right: 0; background: linear-gradient(270deg, var(--tc-encre) 70px, transparent 100%); }
.du-clair .bandeau-marque__piste {
    display: flex;
    align-items: center;
    width: max-content;
    gap: 64px;
    padding-left: 64px; /* == gap : condition du raccord invisible */
    animation: du-bandeau-marque 35s linear infinite;
}
.du-clair .bandeau-marque__item { flex: none; display: flex; align-items: center; }
.du-clair .bandeau-marque__item img,
.du-clair .bandeau-marque__item svg {
    height: 46px;
    width: auto;
    display: block;
    opacity: .9;
    transition: opacity .2s;
}
.du-clair .bandeau-marque:hover .bandeau-marque__item img,
.du-clair .bandeau-marque:hover .bandeau-marque__item svg { opacity: 1; }
@keyframes du-bandeau-marque {
    from { transform: translate3d(0, 0, 0); }
    to { transform: translate3d(-50%, 0, 0); }
}
/* Pause au survol, demandee au brief. */
.du-clair .bandeau-marque:hover .bandeau-marque__piste { animation-play-state: paused; }
/* Pause hors champ : une piste de plusieurs milliers de pixels n'a aucune
   raison d'etre recomposee a chaque image quand elle n'est plus visible. */
.du-clair .bandeau-marque--hors-vue .bandeau-marque__piste { animation-play-state: paused; }

/* Nombre de series affichees selon la largeur, et duree recalculee pour
   chaque palier afin que la VITESSE reste constante.
   Les logos etant ici presque deux fois plus hauts que dans l'ancien
   bandeau, une serie est presque deux fois plus large : deux series
   suffisent largement jusqu'aux tres grands ecrans, la troisieme n'est
   servie qu'au-dela. Valeurs remesurees le 21/09/2026, voir le rapport. */
.du-clair .bandeau-marque__item--s2 { display: none; }
@media (min-width: 2001px) {
    .du-clair .bandeau-marque__item--s2 { display: flex; }
    .du-clair .bandeau-marque__piste { animation-duration: 52s; }
}
@media (max-width: 640px) {
    .du-clair .bandeau-marque { padding: 1.5rem 0; }
    .du-clair .bandeau-marque__item img,
    .du-clair .bandeau-marque__item svg { height: 34px; }
    .du-clair .bandeau-marque__piste { gap: 44px; padding-left: 44px; animation-duration: 31s; }
    /* Meme regle sous 640 px : le plus large y mesure 48 px, le palier
       passe de 26 a 52 px. La largeur totale du fondu reste a 64 px, donc
       la part de bande couverte ne change pas (37,1 % a 360 px, valeur
       deja retenue le 16/09). */
    .du-clair .bandeau-marque::before,
    .du-clair .bandeau-marque::after { width: 64px; }
    .du-clair .bandeau-marque::before { background: linear-gradient(90deg, var(--tc-encre) 52px, transparent 100%); }
    .du-clair .bandeau-marque::after { background: linear-gradient(270deg, var(--tc-encre) 52px, transparent 100%); }
}

/* ---------------------------------------------------------------------
   16. RUBAN DE PREVISUALISATION — disparaitra a la bascule
   --------------------------------------------------------------------- */
.du-apercu-ruban {
    position: fixed;
    right: 12px;
    bottom: 12px;
    z-index: 2147483000;
    display: flex;
    align-items: center;
    gap: 8px;
    background: #14101f;
    color: #fff;
    border: 1px solid rgba(255, 255, 255, .22);
    border-radius: 999px;
    padding: 7px 8px 7px 14px;
    font: 700 11px/1 'Inter', system-ui, sans-serif;
    box-shadow: 0 8px 28px rgba(0, 0, 0, .35);
}
.du-apercu-ruban i {
    font-style: normal;
    background: linear-gradient(90deg, #d434c8, #7c3aed, #22b8e0);
    -webkit-background-clip: text;
    background-clip: text;
    -webkit-text-fill-color: transparent;
}
.du-apercu-ruban a {
    color: #fff;
    text-decoration: none;
    background: rgba(255, 255, 255, .14);
    border-radius: 999px;
    padding: 5px 10px;
}
.du-apercu-ruban a:hover { background: rgba(255, 255, 255, .26); color: #fff; }
@media print { .du-apercu-ruban { display: none; } }

/* ---------------------------------------------------------------------
   17. RESPONSIVE
   --------------------------------------------------------------------- */
@media (max-width: 1024px) {
    .du-clair .tc-rassure-grille { grid-template-columns: repeat(2, 1fr); }
    .du-clair .tc-payer-grille { grid-template-columns: 1fr; }
}
@media (max-width: 768px) {
    .du-clair .tc-section { padding: 2.3rem 0; }
    .du-clair .explore-tile__logo { min-width: 0; padding: .55rem .8rem; }
}
@media (max-width: 480px) {
    .du-clair .tc-rassure-grille { grid-template-columns: 1fr; }
}

/* ---------------------------------------------------------------------
   18. MOUVEMENT REDUIT — strict, comme partout sur le site
   --------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
    .du-clair .bandeau-marque__piste { animation: none; transform: none; }
    .du-clair .tc-carte-payer, .du-clair .tc-etape, .du-clair .explore-tile { transition: none; }
}

/* =====================================================================
   19. COUCHE DE COMPATIBILITE — styles ECRITS DANS LES PAGES
   ---------------------------------------------------------------------
   Une partie du site n'habille pas ses composants depuis style.css mais
   depuis un bloc <style> en tete de page, voire depuis un attribut
   style= en ligne. Ces couleurs-la ne passent PAS par les variables :
   redefinir :root ne les atteint pas, et elles ont toutes ete ecrites
   pour un fond sombre (voiles blancs translucides, texte blanc, violets
   pales). Sur clair elles donnent des panneaux invisibles et du texte
   illisible.
   Releve fait par grep dans les fichiers, pas a l'oeil. Deux cas :
     - regle d'un bloc <style> de page : elle est plus BASSE dans le
       document que cette feuille, donc on la bat par la SPECIFICITE
       (.du-clair X = 0,2,0 contre X = 0,1,0) ;
     - attribut style= en ligne : rien ne le bat sans !important.
   ===================================================================== */

/* --- 19.a attributs style= en ligne (y compris ceux poses par le JS de
       product.php, dont la serialisation ajoute des espaces : les deux
       ecritures sont couvertes) --- */
.du-clair [style*="background:rgba(255,255,255,0."],
.du-clair [style*="background: rgba(255, 255, 255, 0."] {
    background-color: var(--tc-surface-2) !important;
    background-image: none !important;
}
.du-clair [style*="background:rgba(0,0,0,0."],
.du-clair [style*="background: rgba(0, 0, 0, 0."] {
    background-color: var(--tc-violet-clair) !important;
    background-image: none !important;
}
.du-clair [style*="solid rgba(255,255,255,0."],
.du-clair [style*="solid rgba(255, 255, 255, 0."],
.du-clair [style*="border-color: rgba(255, 255, 255, 0."] {
    border-color: var(--tc-bordure) !important;
}
.du-clair [style*="color:#c4b5fd"],
.du-clair [style*="color: #c4b5fd"],
.du-clair [style*="color:#a78bfa"],
.du-clair [style*="color: #a78bfa"] { color: var(--tc-violet) !important; }
/* TEXTE BLANC POSE EN LIGNE. Invisible sur clair (titres des pages de
   connexion, libelles du compte, question de la FAQ). Trois exclusions,
   toutes trouvees par la mesure :
   - ce qui est dans une zone restee sombre ;
   - ce qui declare LUI-MEME un fond en ligne : pagination active
     (background:#7c3aed), badge de fidelite, boutons en degrade. Y
     toucher donnait de l'encre sur violet, 3,28:1 ;
   - SAUF si ce fond est un voile blanc translucide, car la section 19
     vient justement de l'eclaircir : le blanc y deviendrait invisible
     (zone de saisie d'avis de la fiche produit).
   La question de la FAQ declare « background:none » : elle serait exclue
   a tort, on la rattrape nommement. */
.du-clair [style*="color:#fff"]:not([style*="background:"]):not(.site-top *):not(.footer-bar *):not(.bandeau-marque *):not(.space-hero *),
.du-clair [style*="color: #fff"]:not([style*="background:"]):not(.site-top *):not(.footer-bar *):not(.bandeau-marque *):not(.space-hero *),
.du-clair [style*="color:#fff"][style*="background:rgba(255,255,255"]:not(.site-top *):not(.footer-bar *):not(.bandeau-marque *):not(.space-hero *),
.du-clair .faq-question {
    color: var(--tc-encre) !important;
}

/* --- 19.b espace client (bloc <style> de profile.php) --- */
.du-clair .profile-tabs { border-bottom-color: var(--tc-bordure); }
.du-clair .profile-tab { color: var(--tc-texte-doux); }
.du-clair .profile-tab:hover { color: var(--tc-encre); }
.du-clair .profile-tab.active { color: var(--tc-violet); border-bottom-color: var(--tc-violet); }
.du-clair .profile-card {
    background: var(--tc-surface);
    border-color: var(--tc-bordure);
    box-shadow: var(--tc-ombre);
}
.du-clair .profile-field { border-bottom-color: var(--tc-bordure); }
.du-clair .profile-field-label { color: var(--tc-texte-doux); }
.du-clair .profile-field-value { color: var(--tc-encre); }
.du-clair .orders-table th { color: var(--tc-texte-doux); border-bottom-color: var(--tc-bordure); }
.du-clair .orders-table td { color: var(--tc-texte); border-bottom-color: var(--tc-bordure); }
.du-clair .orders-table tr:hover td { background: var(--tc-violet-clair); }
.du-clair .btn-reveal { background: var(--tc-violet-clair); color: var(--tc-violet); border-color: rgba(109, 40, 217, .28); }
.du-clair .btn-reveal:hover { background: #e7dafd; }
/* Les trois pastilles d'etat : leurs teintes d'origine (#22c55e, #fbbf24,
   #ef4444) tombent respectivement a 2,3 / 1,7 / 3,3:1 sur fond clair. */
.du-clair .status-completed { background: var(--tc-vert-fond); color: var(--tc-vert); }
.du-clair .status-pending { background: var(--tc-ambre-fond); color: var(--tc-ambre); }
.du-clair .status-failed { background: var(--tc-rouge-fond); color: var(--tc-rouge); }
.du-clair .ticket-row { background: var(--tc-surface); border-color: var(--tc-bordure); box-shadow: var(--tc-ombre); }
.du-clair .ticket-row:hover { border-color: var(--tc-violet); }
.du-clair .ticket-subject { color: var(--tc-encre); }
.du-clair .ticket-date { color: var(--tc-texte-doux); }
.du-clair .ticket-open { background: var(--tc-violet-clair); color: var(--tc-violet); }
.du-clair .ticket-closed { background: var(--tc-surface-2); color: var(--tc-texte-doux); }

/* --- 19.c fiche produit (bloc <style> de product.php) --- */
.du-clair .variant-btn {
    background: var(--tc-surface);
    color: var(--tc-texte);
    border-color: var(--tc-bordure-forte);
}
.du-clair .variant-btn:hover { border-color: var(--tc-violet); color: var(--tc-violet); }
.du-clair .variant-btn.active {
    background: var(--tc-degrade-texte);
    color: #fff;
    border-color: transparent;
}
.du-clair .variants-label-text { color: var(--tc-texte-doux); }

/* --- 19.d recharge de credits (bloc <style> de payment.php) ---
   Couleurs seulement : la geometrie du widget n'est pas touchee. */
.du-clair .allopass-loader-text { color: var(--tc-violet); }
.du-clair .allopass-loader-sub { color: var(--tc-texte-doux); }
.du-clair .allopass-spinner { border-top-color: var(--tc-violet); }

/* --- 19.e FAQ : le panneau et la question sont en ligne --- */
.du-clair .faq-item { box-shadow: var(--tc-ombre); }
.du-clair .faq-answer { color: var(--tc-texte); }

/* =====================================================================
   20. CORRECTIFS ISSUS DU BALAYAGE EXHAUSTIF DES TEXTES
   ---------------------------------------------------------------------
   Releve obtenu en parcourant TOUS les elements porteurs de texte de
   chaque page (et non une liste de selecteurs choisis d'avance), avec
   calcul du fond effectif par composition des couches translucides.
   Chaque valeur ci-dessous est mesuree, pas estimee.
   ===================================================================== */

/* --- 20.a etiquette de categorie sur la vignette produit ---
   boutique.php l.76 ecrit EN LIGNE la couleur de marque de la categorie,
   issue de la base. Elle a ete choisie pour un fond sombre. Mesures sur
   blanc : Razer Gold 1,78:1 · Apple 1,78:1 · Steam 2,02:1 · Roblox
   3,46:1 · Google Play 3,50:1 — toutes sous le seuil de 4,5.
   La maquette validee le 21/09 avait deja tranche dans ce sens : son
   etiquette de categorie est en gris doux, pas en couleur de marque.
   On aligne, et on mesure : #6b6480 sur blanc = 5,59:1.
   L'identite couleur de la plateforme reste portee par son LOGO, qui est
   sur plaque sombre et garde ses couleurs officielles. */
.du-clair .product-card-category { color: var(--tc-texte-doux) !important; }

/* --- 20.b ETOILES DE NOTATION ---
   CRITERE : une note en etoiles est un ELEMENT GRAPHIQUE porteur
   d'information, donc WCAG 1.4.11 « contraste du non-texte », seuil
   **3:1**, et non le 4,5:1 du texte. Un premier jet visait 4,5:1 et
   aboutissait a un brun-orange (#a04a08, H=26deg) : seuil trop exigeant,
   et l'or est la convention attendue pour une note.
   RETENU `--tc-or` = #b57f00, H=42deg, saturation 100 % — l'or le plus
   clair qui tienne 3:1 sur les sept surfaces du theme portant du texte :
     blanc 3,50 · fond de page 3,30 · surface grise 3,13 · violet clair
     3,04 · vert clair 3,13 · ambre clair 3,17 · rouge clair 3,02.
   Pour memoire, sur ces memes fonds : #facc15 (or du site) descend a
   1,37:1, #e0a107 (or de la maquette) a 2,03:1.
   EMPLACEMENTS, releves par grep dans le code et non a l'oeil :
     - `.reviews-avg__stars` et `.review-card__head .stars` (style.css,
       utilises par le nouvel accueil) ;
     - `product.php` l.92 et l.447, `boutique.php` l.90 et l.154 : etoiles
       ecrites EN LIGNE ;
     - `product.php` l.476/482/489 : le JS de notation repeint les etoiles
       choisies. Il ecrit `#facc15`, que le navigateur serialise en
       `rgb(250, 204, 21)` — les deux ecritures sont couvertes ;
     - `product.php` l.408-412 : les etoiles VIDES du selecteur n'ont
       aucune couleur propre et heritaient du texte. Elles recoivent une
       teinte attenuee pour rester distinctes des pleines.
   HORS PERIMETRE : `admin/reviews.php` l.87 porte le meme `#facc15`, mais
   l'administration ne charge jamais cette feuille et ne porte jamais
   `.du-clair` : elle n'est pas touchee. */
.du-clair .reviews-avg__stars,
.du-clair .review-card__head .stars,
.du-clair [style*="color:#facc15"],
.du-clair [style*="color: rgb(250, 204, 21)"] { color: var(--tc-or) !important; }
/* SELECTEUR DE NOTE de la fiche produit, etoiles NON choisies.
   Premiere valeur essayee : la bordure forte (#d3d6e4) — mesuree a
   1,30:1, bien trop pale. Ce sont des etoiles CLIQUABLES : elles portent
   l'affordance du controle, le 3:1 s'applique aussi a elles.
   #6b6480 donne 5,00:1 sur la surface grise et 5,59:1 sur blanc, et reste
   nettement distinct de l'or des etoiles choisies. */
.du-clair .star { color: var(--tc-texte-doux); }
.du-clair .star:hover { color: var(--tc-or); }

/* --- 20.c pastilles de stock : les teintes du theme clair etaient trop
   pales SUR LEUR PROPRE FOND teinte (3,67:1 et 4,87:1). --- */
.du-clair .stock-badge.in-stock { color: #0b6b47; }      /* 5,86:1 sur #e6f6ef */
.du-clair .stock-badge.in-stock::before { background: #0b6b47; }
/* « Epuise » garde sa CROIX ROUGE (demande du 09/07). Cette regle, plus
   bas dans la feuille, l'emportait sur celle de la section 4 et remettait
   de l'ambre : les deux sont desormais alignees sur le rouge.
   #c02626 sur son fond #fdeaea = 5,11:1. */
.du-clair .stock-badge.out-of-stock { color: #c02626; }
.du-clair .stock-badge.out-of-stock::before { color: #c02626; }

/* --- 20.c bis PASTILLES D'ETAT RONDES (demandes du 06/07 et du 10/07 :
   rond vert a coche pour une reussite, rond rouge a croix pour un echec,
   jamais d'emoji). Les teintes d'origine portent un glyphe BLANC :
   blanc sur #22c55e = 2,28:1, blanc sur #ef4444 = 3,76:1. Les deux teintes
   sont assombries — le vert et le rouge restent le vert et le rouge —
   pour que la coche et la croix soient lisibles : 6,55:1 et 5,92:1. --- */
.du-clair .status-dot.ok { background: #0b6b47; }
.du-clair .status-dot.ko { background: #c02626; }

/* BADGE « VERIFIE » (demande du 10/07 : badge PLEIN quand le compte est
   verifie). Il porte son propre fond vert #22c55e avec du texte ET une
   coche BLANCS : 2,28:1, sous le seuil — et ce, deja sur le theme sombre,
   puisque le fond du badge est le vert dans les deux cas. Meme vert,
   assombri : blanc sur #0b6b47 = 6,55:1. La forme pleine, elle, ne change
   pas. A confirmer avec le client, c'est un ecart visible. */
.du-clair .kyc-badge--verified { background: #0b6b47; box-shadow: 0 0 8px rgba(11, 107, 71, .3); }

/* --- 20.d separateur du pied de page : 0,35 d'opacite donnait 3,21:1
   sur l'encre. 0,45 donne 4,54:1. --- */
.du-clair .footer-bar-sep { color: rgba(255, 255, 255, .45); }

/* --- 20.e RATTRAPAGE DE MES PROPRES REGLES EN LIGNE ---
   Les deux regles generiques de la section 19 etaient trop larges, le
   balayage l'a montre :
   1) le violet pale du pied de page (#c4b5fd, 10,12:1 sur l'encre) etait
      ramene au violet fonce, soit 2,63:1 — une regression que j'avais
      introduite. Les zones sombres sont donc exclues.
   2) « color:#fff » etait converti en encre meme sur un element posant
      lui-meme un fond sombre en ligne. Corrige DANS la regle de la
      section 19 plutot qu'ici : une regle de rattrapage separee avait
      une specificite plus FAIBLE (0,4,0 contre 0,6,0) et ne s'appliquait
      donc jamais — elle donnait l'illusion d'un correctif. */
.du-clair .site-top [style*="color:#c4b5fd"],
.du-clair .footer-bar [style*="color:#c4b5fd"],
.du-clair .bandeau-marque [style*="color:#c4b5fd"],
.du-clair .space-hero [style*="color:#c4b5fd"],
.du-clair .site-top [style*="color:#a78bfa"],
.du-clair .footer-bar [style*="color:#a78bfa"] { color: #c4b5fd !important; }


/* --- 20.f pastille de categorie de la fiche produit ---
   product.php l.76 pose EN LIGNE background et color depuis la base :
   pour Google Play cela donne du blanc sur un or rgb(191,151,31), soit
   2,74:1. Ce defaut est PREEXISTANT — la pastille porte la meme couleur
   de base sur le theme sombre, le rapport y est identique — mais il n'y
   a pas de raison de le reconduire dans une refonte.
   Meme arbitrage que pour l'etiquette des vignettes : pastille neutre,
   l'identite de la plateforme restant portee par son LOGO juste au-dessus,
   qui garde ses couleurs officielles sur plaque sombre.
   Mesure : #2a2438 sur #f1f2f8 = 12,2:1. */
.du-clair .category-tag {
    background: var(--tc-surface-2) !important;
    color: var(--tc-texte) !important;
    border: 1px solid var(--tc-bordure);
}

/* --- 20.g niveau de fidelite (espace client) ---
   Les quatre teintes de paliers viennent de l'ADMIN
   (`loyalty_tier_N_color`) : #22c55e, #3b82f6, #f59e0b, #ef4444. En texte
   sur blanc elles donnent 2,28 / 3,68 / 2,15 / 3,35:1 — toutes sous le
   seuil. Comme ce sont des reglages et non du code, on ne les remplace
   pas : on neutralise seulement leur usage EN TEXTE (le nom du prochain
   palier), ou la couleur n'est que decorative. #2a2438 sur blanc = 14,92:1.
   Le BADGE de palier, lui, garde sa couleur de fond : c'est un reglage
   d'administration, et le rapport y est le MEME que sur le theme sombre
   (le fond du badge est la couleur du palier dans les deux cas). Signale
   dans le rapport ; la correction est de choisir des teintes plus sombres
   depuis l'administration. */
.du-clair .profile-field-value strong[style*="color:"] { color: var(--tc-texte) !important; }

/* =====================================================================
   21. FICHE PRODUIT — PAIEMENT EN DEUX SECTIONS, LANGUE ET REGION
   (demandes du client du 21/09/2026 au soir)
   ---------------------------------------------------------------------
   Reorganisation VISUELLE : les boutons d'achat, leurs id et leurs
   gestionnaires sont ceux de production, repris verbatim par
   includes/theme-clair/fiche-paiement.php.
   ===================================================================== */

/* --- les deux encarts langue / region --- */
.du-clair .tc-attributs {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
    margin: .9rem 0 .25rem;
}
.du-clair .tc-attribut {
    display: inline-flex;
    align-items: baseline;
    gap: .4rem;
    background: var(--tc-surface-2);
    border: 1px solid var(--tc-bordure);
    border-radius: 999px;
    padding: .34rem .8rem;
    font-size: .82rem;
    line-height: 1.2;
}
.du-clair .tc-attribut b {
    font-weight: 700;
    color: var(--tc-texte-doux);
    text-transform: uppercase;
    letter-spacing: .06em;
    font-size: .7rem;
}
.du-clair .tc-attribut span { color: var(--tc-encre); font-weight: 600; }

/* --- les deux sections de paiement --- */
.du-clair .tc-paiement {
    display: grid;
    gap: .9rem;
    margin-top: 1.5rem;
}
.du-clair .tc-pay {
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure);
    border-radius: var(--radius);
    box-shadow: var(--tc-ombre);
    padding: 1.15rem 1.25rem 1.25rem;
    position: relative;
    overflow: hidden;
}
/* Tranche de marque a gauche, comme les cartes « deux façons de payer »
   de l'accueil : les deux blocs se repondent. */
.du-clair .tc-pay::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 4px;
    background: var(--tc-filet); /* 25/09 : meme definition que les autres lignes */
}
.du-clair .tc-pay__tete {
    display: flex;
    align-items: center;
    gap: .85rem;
    margin-bottom: .95rem;
}
.du-clair .tc-pay__icone {
    flex: none;
    width: 40px;
    height: 40px;
    border-radius: 11px;
    display: grid;
    place-items: center;
    background: var(--tc-violet-clair);
    color: var(--tc-violet);
}
.du-clair .tc-pay__icone svg { width: 21px; height: 21px; }
.du-clair .tc-pay__texte { flex: 1 1 auto; min-width: 0; }
.du-clair .tc-pay__titre {
    margin: 0;
    font-size: 1rem;
    font-weight: 800;
    color: var(--tc-encre);
    line-height: 1.25;
}
.du-clair .tc-pay__sous {
    margin: .15rem 0 0;
    font-size: .82rem;
    color: var(--tc-texte-doux);
    line-height: 1.4;
}
.du-clair .tc-pay__prix {
    flex: none;
    font-size: 1.05rem;
    font-weight: 800;
    color: var(--tc-encre);
    white-space: nowrap;   /* « 4,89 € » et « 500 crédits » ne se coupent jamais */
}
.du-clair .tc-pay__prix small { font-size: .74rem; font-weight: 600; color: var(--tc-texte-doux); }
.du-clair .tc-pay__boutons { display: flex; gap: .5rem; flex-wrap: wrap; }
.du-clair .tc-pay__promo { margin-bottom: .25rem; }
.du-clair .tc-pay__connexion { margin: 0; text-align: center; font-size: .85rem; }
.du-clair .tc-pay__connexion a { color: var(--tc-violet); font-weight: 600; }

/* --- les garanties, sous les deux sections --- */
.du-clair .tc-garanties {
    list-style: none;
    margin: 1.1rem 0 0;
    padding: 1rem 0 0;
    border-top: 1px solid var(--tc-bordure);
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: .75rem 1rem;
}
.du-clair .tc-garanties li {
    display: grid;
    grid-template-columns: 26px 1fr;
    grid-template-rows: auto auto;
    align-items: center;
    column-gap: .55rem;
    margin: 0;
}
.du-clair .tc-garanties__pic {
    grid-row: 1 / span 2;
    width: 26px;
    height: 26px;
    border-radius: 8px;
    display: grid;
    place-items: center;
    background: var(--tc-vert-fond);
    color: #0b6b47;
}
.du-clair .tc-garanties__pic svg { width: 15px; height: 15px; }
.du-clair .tc-garanties b {
    font-size: .84rem;
    font-weight: 700;
    color: var(--tc-encre);
    line-height: 1.3;
}
.du-clair .tc-garanties li > span:not(.tc-garanties__pic) {
    grid-column: 2;
    font-size: .76rem;
    color: var(--tc-texte-doux);
    line-height: 1.35;
}
/* Une garantie sans sous-titre : sa pastille reste centree sur la ligne. */
.du-clair .tc-garanties li:not(:has(> span:not(.tc-garanties__pic))) .tc-garanties__pic { grid-row: 1; }

@media (max-width: 520px) {
    .du-clair .tc-garanties { grid-template-columns: 1fr; }
    .du-clair .tc-pay { padding: 1rem 1rem 1.1rem; }
    .du-clair .tc-pay__tete { flex-wrap: wrap; gap: .7rem; }
    /* Sous 520 px le prix passe a la ligne, sous le libelle, plutot que de
       comprimer le titre : il reste sur une seule ligne. */
    .du-clair .tc-pay__prix { flex-basis: 100%; }
}

/* =====================================================================
   22. ALIGNEMENT SUR LA MAQUETTE VALIDEE (22/09/2026)
   ===================================================================== */

/* --- 22.a EN-TETE : acces au compte lisible + bouton d'inscription ---
   La maquette portait « Se connecter » et « Créer un compte ». Le libelle
   du lien de compte est masque en production par
   .user-menu-link{font-size:0 !important} — bloc de PRESERVATION du
   16/09, pose pour garder l'apparence validee apres le defaut d'accolade.
   On le retablit ICI, en apercu seulement, et on garde la forme compacte
   sous 640 px : c'est elle qui evite le retour du debordement corrige le
   13/07/2026. */
.du-clair .header .user-menu-link { font-size: .88rem !important; }
.du-clair .tc-inscription {
    display: inline-flex;
    align-items: center;
    white-space: nowrap;
    background: var(--tc-degrade-texte);
    color: #fff;
    font-size: .82rem;
    font-weight: 700;
    border-radius: 999px;
    padding: .42rem .9rem;
    margin-left: .15rem;
    transition: filter .15s, transform .15s;
}
.du-clair .tc-inscription:hover { color: #fff; filter: brightness(1.08); transform: translateY(-1px); }
@media (max-width: 640px) {
    /* Forme compacte : le lien de compte redevient une icone seule, le
       bouton d'inscription se resserre. Le bloc gauche reste court. */
    .du-clair .header .user-menu-link { font-size: 0 !important; }
    .du-clair .tc-inscription { font-size: .74rem; padding: .34rem .62rem; margin-left: 0; }
}

/* --- 22.b PRODUIT A LA UNE ---
   Reprend le dessin du bandeau vedette de la maquette : carte sombre,
   deux lueurs de marque, marqueur en capitales. Le contenu, lui, est
   celui demande le 21/09 : image, nom, prix en credits, deux boutons. */
.du-clair .tc-une { padding: 2.2rem 0 0; }
.du-clair .tc-une__carte {
    position: relative;
    overflow: hidden;
    display: grid;
    grid-template-columns: minmax(0, .82fr) minmax(0, 1.18fr);
    gap: 1.6rem;
    align-items: center;
    background: var(--tc-encre);
    color: #fff;
    border-radius: var(--radius);
    padding: 1.6rem 1.8rem;
}
.du-clair .tc-une__carte::before {
    content: "";
    position: absolute;
    inset: 0;
    background:
        radial-gradient(640px 320px at 12% 0%, rgba(212, 52, 200, .30), transparent 70%),
        radial-gradient(560px 360px at 88% 100%, rgba(34, 184, 224, .24), transparent 70%);
    pointer-events: none;
}
.du-clair .tc-une__carte > * { position: relative; }
.du-clair .tc-une__visuel {
    background: rgba(255, 255, 255, .06);
    border: 1px solid rgba(255, 255, 255, .14);
    border-radius: var(--radius-sm);
    /* 25/09/2026 : le cadre prend le format des visuels du catalogue (1320x833,
       et 800x505 pour deux produits, meme rapport a 0,03 % pres). En 16/10 et
       avec la marge interne de .6rem, l'image laissait des bandes vides en
       haut et sur les cotes et depassait en bas (rognee).
       content-box : le rapport s'applique a l'INTERIEUR du cadre, la ou se pose
       l'image. Sur la boite bordure comprise, la bordure de 1 px rendait
       l'interieur un peu moins haut que l'image (0,73 px rogne en bas, mesure). */
    box-sizing: content-box;
    aspect-ratio: 1320 / 833;
    display: grid;
    place-items: center;
    overflow: hidden;
}
.du-clair .tc-une__visuel img { width: 100%; height: 100%; object-fit: contain; padding: 0; }
.du-clair .tc-une__sansimage img { height: 56px; width: auto; }
.du-clair .tc-une__marqueur {
    display: inline-flex;
    align-items: center;
    font-size: .7rem;
    font-weight: 800;
    letter-spacing: .12em;
    text-transform: uppercase;
    background: rgba(255, 255, 255, .14);
    border: 1px solid rgba(255, 255, 255, .22);
    padding: .3rem .65rem;
    border-radius: 999px;
}
.du-clair .tc-une__titre {
    font-size: clamp(1.35rem, 3vw, 2rem);
    font-weight: 800;
    letter-spacing: -.02em;
    color: #fff;
    margin: .7rem 0 .25rem;
    line-height: 1.15;
}
.du-clair .tc-une__cat {
    margin: 0;
    font-size: .78rem;
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: rgba(255, 255, 255, .72);
}
.du-clair .tc-une__prix { margin: .8rem 0 1.1rem; font-size: 1.7rem; font-weight: 800; color: #fff; }
.du-clair .tc-une__prix small { font-size: .8rem; font-weight: 600; color: rgba(255, 255, 255, .72); margin-left: .25rem; }
.du-clair .tc-une__actions { display: flex; gap: .6rem; flex-wrap: wrap; }
/* Le bouton secondaire est sur fond SOMBRE ici : la variante claire de
   .btn-outline y serait a 1,3:1. */
.du-clair .tc-une__actions .btn-outline {
    background: rgba(255, 255, 255, .10);
    border-color: rgba(255, 255, 255, .28);
    color: #fff;
}
.du-clair .tc-une__actions .btn-outline:hover { background: rgba(255, 255, 255, .18); border-color: rgba(255, 255, 255, .5); color: #fff; }
@media (max-width: 720px) {
    .du-clair .tc-une__carte { grid-template-columns: 1fr; padding: 1.2rem 1.2rem 1.4rem; gap: 1.1rem; }
}

/* --- 22.c ACCES RAPIDE PAR CATEGORIE (section 8 de la maquette) --- */
.du-clair .tc-pastilles { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: 1.4rem; }
.du-clair .tc-pastille {
    display: inline-flex;
    align-items: center;
    gap: .5rem;
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure);
    border-radius: 999px;
    padding: .5rem .95rem;
    font-size: .87rem;
    font-weight: 600;
    color: var(--tc-texte);
    transition: border-color .18s, color .18s, transform .18s;
}
.du-clair .tc-pastille:hover { border-color: var(--tc-violet); color: var(--tc-violet); transform: translateY(-1px); }
/* Meme regle que partout : un logo de plateforme ne va pas sur du clair,
   cinq des onze sont des aplats blancs. Plaque sombre. */
.du-clair .tc-pastille__logo {
    display: inline-grid;
    place-items: center;
    background: var(--tc-encre);
    border-radius: 6px;
    padding: 3px 5px;
}
.du-clair .tc-pastille__logo img { height: 15px; width: auto; display: block; }
.du-clair .tc-pastille--tout { background: var(--tc-degrade-texte); color: #fff; border-color: transparent; }
.du-clair .tc-pastille--tout:hover { color: #fff; }

/* --- 22.d BARRE DE REASSURANCE : cinq gages, comme la maquette --- */
.du-clair .tc-rassure-grille { grid-template-columns: repeat(5, 1fr); }
@media (max-width: 1024px) { .du-clair .tc-rassure-grille { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 720px)  { .du-clair .tc-rassure-grille { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 480px)  { .du-clair .tc-rassure-grille { grid-template-columns: 1fr; } }

/* --- 22.e CARTES PRODUITS DE LA BOUTIQUE, au dessin de la maquette ---
   Le badge de stock quitte la ligne de prix pour se poser EN HAUT A
   GAUCHE de l'image, comme dans la maquette. Aucun markup touche : la
   carte devient le repere de positionnement. */
.du-clair .product-card { position: relative; }
.du-clair .product-card .stock-badge {
    position: absolute;
    top: .6rem;
    left: .6rem;
    z-index: 2;
    font-size: .68rem;
    letter-spacing: .04em;
    text-transform: uppercase;
    padding: .28rem .55rem;
    box-shadow: 0 1px 3px rgba(20, 16, 31, .12);
}
.du-clair .product-card-category {
    font-size: .7rem;
    font-weight: 800;
    letter-spacing: .08em;
}
.du-clair .product-card-title { font-size: .93rem; font-weight: 700; line-height: 1.3; }
.du-clair .product-card-value { font-size: .78rem; }
.du-clair .product-card:hover { transform: translateY(-4px); }
.du-clair .product-card-footer { margin-top: auto; align-items: baseline; }
.du-clair .product-card .price-credits { font-size: 1.1rem; font-weight: 800; }
.du-clair .product-card .price-eur { font-size: .84rem; }

/* --- 22.f NOTE GLOBALE DES AVIS, au dessin de la maquette ---
   La maquette presentait la note dans une CARTE bordee, alignee a gauche,
   avec le chiffre en gros et le detail dessous. */
.du-clair .reviews-avg {
    display: inline-flex;
    align-items: center;
    gap: 1rem;
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure);
    border-radius: var(--radius);
    box-shadow: var(--tc-ombre);
    padding: .9rem 1.3rem;
    text-align: left;
    margin-bottom: 1.6rem;
}
.du-clair .reviews-avg__num { font-size: 2.4rem; line-height: 1; }
.du-clair .reviews-avg__slash { display: none; }  /* la maquette n'affiche pas « /5 » */
.du-clair .reviews-avg__stars { margin: 0; display: block; font-size: 1rem; letter-spacing: .08em; }
.du-clair .reviews-avg__count { display: block; font-size: .8rem; margin-top: .15rem; }

/* --- 22.g ENCART D'INFORMATION sous « comment ça marche » --- */
.du-clair .tc-encart {
    margin: 1.4rem 0 0;
    background: var(--tc-violet-clair);
    border: 1px solid rgba(109, 40, 217, .16);
    border-radius: var(--radius);
    padding: 1.1rem 1.3rem;
    font-size: .9rem;
    line-height: 1.55;
    color: #432088;   /* 8,1:1 sur #f3ecfe */
}

/* =====================================================================
   23. PIED DE PAGE A QUATRE COLONNES (maquette validee)
   ---------------------------------------------------------------------
   Il remplace le pied d'une ligne sur les 18 pages publiques, en apercu
   seulement. Fond a l'encre : le logo COMPLET y est pose, et le mot
   « DECK » est blanc — il ne peut pas aller sur du clair.
   ===================================================================== */
.du-clair .tc-pied {
    width: 100%;
    margin-top: auto;               /* body est un flex column : le pied colle en bas */
    background: var(--tc-encre);
    color: rgba(255, 255, 255, .76);
    padding: 3rem 0 1.6rem;
}
.du-clair .tc-pied__grille {
    display: grid;
    grid-template-columns: 1.5fr 1fr 1fr 1fr;
    gap: 2rem;
}
.du-clair .tc-pied h5 {
    color: #fff;
    font-size: .78rem;
    font-weight: 800;
    letter-spacing: .12em;
    text-transform: uppercase;
    margin: 0 0 .9rem;
}
.du-clair .tc-pied__col a {
    display: block;
    padding: .28rem 0;
    font-size: .88rem;
    color: rgba(255, 255, 255, .76);   /* 10,1:1 sur l'encre */
}
.du-clair .tc-pied__col a:hover { color: #fff; }
.du-clair .tc-pied__logo { display: inline-block; }
.du-clair .tc-pied__logo img { height: 40px; width: auto; margin-bottom: .9rem; }
.du-clair .tc-pied__intro { font-size: .88rem; line-height: 1.6; max-width: 34ch; margin: 0; }
.du-clair .tc-pied__moyens { display: flex; gap: .45rem; flex-wrap: wrap; margin-top: 1rem; }
.du-clair .tc-pied__moyens span {
    background: rgba(255, 255, 255, .1);
    border: 1px solid rgba(255, 255, 255, .18);
    border-radius: 7px;
    padding: .3rem .6rem;
    font-size: .72rem;
    font-weight: 700;
    color: #fff;
    white-space: nowrap;
}
.du-clair .tc-pied__bas {
    border-top: 1px solid rgba(255, 255, 255, .14);
    margin-top: 2.2rem;
    padding-top: 1.3rem;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .8rem 1.2rem;
    flex-wrap: wrap;
    font-size: .8rem;
}
.du-clair .tc-pied__officiel { color: rgba(255, 255, 255, .76); }
.du-clair .tc-pied .footer-lang { margin: 0; }
@media (max-width: 1024px) { .du-clair .tc-pied__grille { grid-template-columns: 1fr 1fr; } }
@media (max-width: 640px)  {
    .du-clair .tc-pied__grille { grid-template-columns: 1fr; gap: 1.6rem; }
    .du-clair .tc-pied { padding: 2.2rem 0 1.4rem; }
    .du-clair .tc-pied__bas { justify-content: flex-start; margin-top: 1.6rem; }
}

/* =====================================================================
   24. LOT 4 (22/09/2026) — SECTIONS DE PRODUITS DE L'ACCUEIL,
       MOYENS DE PAIEMENT PAR ARTICLE, INFORMATIONS AU PREMIER ACHAT
   ---------------------------------------------------------------------
   Tout est scope sous .du-clair : rien de ceci n'atteint la production ni
   l'administration, qui charge style.css et jamais cette feuille.
   ===================================================================== */

/* --- 24.a En-tete de section avec lien lateral (dessin de la maquette) --- */
.du-clair .tc-tete-section {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: 1rem;
    flex-wrap: wrap;
    margin-bottom: 1.6rem;
}
.du-clair .tc-tete-section .section-title { margin: 0 0 .25rem; }
.du-clair .tc-tete-section .section-sub { margin: 0; }
.du-clair .tc-lien-plus {
    flex: 0 0 auto;
    font-size: .88rem;
    font-weight: 700;
    color: var(--tc-violet);
    text-decoration: none;
    border-bottom: 1px solid currentColor;
    padding-bottom: 1px;
    white-space: nowrap;
}
.du-clair .tc-lien-plus:hover { color: var(--tc-encre); }

/* Grille alignee sur la maquette (222 px) plutot que sur les 260 px de
   style.css : la maquette validee montre quatre cartes par ligne au bureau. */
.du-clair .tc-grille-produits {
    grid-template-columns: repeat(auto-fill, minmax(222px, 1fr));
    gap: 1.1rem;
}

/* --- 24.b Sections de paiement fermees pour l'article --- */
/* La section reste VISIBLE et lisible : elle explique, elle ne disparait pas.
   Le texte reste sur le fond de surface, pas sur une teinte pale ou il
   perdrait son contraste. */
.du-clair .tc-pay--ferme { opacity: 1; }
.du-clair .tc-pay--ferme .tc-pay__titre,
.du-clair .tc-pay--ferme .tc-pay__prix { color: var(--tc-texte-doux); }
.du-clair .tc-pay__refus {
    margin: .2rem 0 0;
    padding: .7rem .85rem;
    border-radius: .6rem;
    background: var(--tc-surface-2);
    border: 1px dashed var(--tc-bordure-forte);
    color: var(--tc-texte);          /* 11,3:1 sur --tc-surface-2 */
    font-size: .88rem;
    line-height: 1.5;
}

/* --- 24.c Bandeau « premiere commande » et bouton vers la fiche --- */
.du-clair .tc-avis-infos {
    display: flex;
    align-items: flex-start;
    gap: .7rem;
    margin: 0 0 1rem;
    padding: .85rem 1rem;
    border-radius: .7rem;
    background: var(--tc-violet-clair);
    border: 1px solid #d9c9fb;
}
.du-clair .tc-avis-infos__pic {
    flex: 0 0 auto;
    width: 20px;
    height: 20px;
    color: var(--tc-violet);
    margin-top: 1px;
}
.du-clair .tc-avis-infos__pic svg { width: 100%; height: 100%; display: block; }
.du-clair .tc-avis-infos div { display: flex; flex-direction: column; gap: .15rem; }
.du-clair .tc-avis-infos b { font-size: .86rem; font-weight: 800; color: var(--tc-encre); }
.du-clair .tc-avis-infos span { font-size: .86rem; line-height: 1.5; color: var(--tc-texte); }
.du-clair .tc-pay__infos { width: 100%; text-align: center; }

/* --- 24.d Page « Mes informations » --- */
.du-clair .du-infos { max-width: 680px; margin: 0 auto; padding: 1.75rem 1rem 3.5rem; }
.du-clair .du-infos__titre {
    font-size: clamp(1.35rem, 2.6vw, 1.8rem);
    font-weight: 800;
    letter-spacing: -.02em;
    color: var(--tc-encre);
    margin: 0 0 .5rem;
}
.du-clair .du-infos__intro {
    margin: 0 0 1.5rem;
    color: var(--tc-texte-doux);
    font-size: .93rem;
    line-height: 1.6;
}
.du-clair .du-infos__form {
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure);
    border-radius: var(--tc-rayon, .9rem);
    padding: 1.4rem;
    display: flex;
    flex-direction: column;
    gap: 1rem;
}
.du-clair .du-infos__duo { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
.du-clair .du-infos .form-group { display: flex; flex-direction: column; gap: .35rem; margin: 0; }
.du-clair .du-infos label {
    font-size: .82rem;
    font-weight: 700;
    color: var(--tc-encre);
}
.du-clair .du-infos .form-control {
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure-forte);
    color: var(--tc-encre);
    border-radius: .55rem;
    padding: .6rem .7rem;
    font-size: .93rem;
    width: 100%;
}
.du-clair .du-infos .form-control:focus {
    outline: 2px solid var(--tc-violet);
    outline-offset: 1px;
    border-color: var(--tc-violet);
}
/* Le message d'erreur d'un champ. #b3261e = 5,9:1 sur la surface blanche :
   au-dela du 4,5:1 exige pour du texte. */
.du-clair .du-infos__msg { font-size: .8rem; color: #b3261e; font-weight: 600; }
.du-clair .du-infos__case {
    display: flex;
    align-items: flex-start;
    gap: .6rem;
    font-size: .88rem;
    font-weight: 400;
    line-height: 1.55;
    color: var(--tc-texte);
}
.du-clair .du-infos__case input { margin-top: .2rem; flex: 0 0 auto; width: 16px; height: 16px; }
.du-clair .du-infos__case a { color: var(--tc-violet); font-weight: 700; }
.du-clair .du-infos__preuve {
    margin: 0;
    padding: .65rem .8rem;
    border-radius: .55rem;
    background: #e6f6ef;
    color: #0b6b47;                 /* 5,86:1 sur #e6f6ef, deja mesure le 21/09 */
    font-size: .85rem;
    font-weight: 600;
}
.du-clair .du-infos__ok,
.du-clair .du-infos__err {
    margin: 0 0 1.25rem;
    padding: .8rem 1rem;
    border-radius: .6rem;
    font-size: .9rem;
    font-weight: 600;
}
.du-clair .du-infos__ok  { background: #e6f6ef; color: #0b6b47; border: 1px solid rgba(11,107,71,.22); }
.du-clair .du-infos__err { background: #fdeaea; color: #b3261e; border: 1px solid rgba(179,38,30,.22); }
.du-clair .du-infos__envoi { align-self: flex-start; }

@media (max-width: 640px) {
    .du-clair .du-infos__duo { grid-template-columns: 1fr; gap: 1rem; }
    .du-clair .du-infos__form { padding: 1.1rem; }
    .du-clair .du-infos__envoi { align-self: stretch; text-align: center; }
    .du-clair .tc-tete-section { margin-bottom: 1.1rem; }
    .du-clair .tc-grille-produits { grid-template-columns: repeat(2, 1fr); gap: .75rem; }
}

/* =====================================================================
   25. RETOUCHES DU 22/09/2026 (validation client de la previsualisation)
   ---------------------------------------------------------------------
   Sept demandes : bandeau en bas de zone sombre sur fond spatial, logos
   sans plaque noire, drapeau francais, titre en degrade, cartes de
   categorie sans fleche, essai d'en-tete en degrade, logo sur la fiche.
   Tout est scope sous .du-clair : ni la production ni l'administration
   ne recoivent une seule de ces regles.
   ===================================================================== */

/* ---------------------------------------------------------------------
   25.a LOGOS SANS PLAQUE — le point delicat de la demande
   Le client trouve les plaques noires « pas tres propre ». Elles
   servaient pourtant la lisibilite : neuf des seize logos sont des
   aplats blancs, invisibles sur une carte claire.
   SOLUTION : les logos MONOCHROMES sont inseres dans la page et peints
   en currentColor — encre sur fond clair (15,76:1), blanc sur fond
   sombre. Les logos EN COULEUR gardent leurs couleurs officielles,
   fixees le 10/07/2026, et ne sont jamais repeints.
   Mesures sur carte blanche : xbox et xbox-game-pass 5,37:1,
   net-flix 4,79:1, twitch 4,64:1, nintendo 4,00:1, google-play 3,92:1
   sur son rouge et 3,56:1 sur son bleu. Tous au-dessus de 3:1.
   --------------------------------------------------------------------- */
.du-clair .tc-logo {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: none;
    line-height: 0;
}
.du-clair .tc-logo svg,
.du-clair .tc-logo img {
    display: block;
    width: auto;
    height: 100%;
    max-width: 100%;
    object-fit: contain;
}
.du-clair .tc-logo--mono { color: var(--tc-encre); }
.du-clair .tc-logo--mono.tc-logo--sombre { color: #fff; }
/* Logo RASTER fourni a part (24/09/2026 : piece Razer Gold), servi en
   <picture> : WebP d'abord, PNG en repli. Le <picture> ne forme aucune
   boite : l'image redevient l'enfant direct de .tc-logo et recoit les memes
   regles de taille que les autres logos, a chaque emplacement (15, 30, 34,
   56 px, 1em, 46 %). */
.du-clair .tc-logo picture { display: contents; }

/* Le repli de vignette claire (produit sans image) n'a plus besoin de sa
   plaque : le logo y est deja recolorie. Specificite 0,3,0 contre 0,2,0
   pour la regle de plaque, elle passe donc devant — verifie. */
.du-clair .platform-logo.tc-repli-clair {
    background: var(--tc-surface-2);
    color: var(--tc-encre);
    display: grid;
    place-items: center;
}
.du-clair .platform-logo.tc-repli-clair .tc-logo { height: 46%; }

/* Pastilles d'acces rapide : meme regle, plus de pave sombre. */
.du-clair .tc-pastille__logo {
    background: transparent;
    border-radius: 0;
    padding: 0;
    height: 15px;
}
.du-clair .tc-pastille__logo svg,
.du-clair .tc-pastille__logo img { height: 15px; }

/* ---------------------------------------------------------------------
   25.b DRAPEAU FRANCAIS — dessine, jamais un emoji
   Windows n'affiche pas les emojis de drapeaux : il ecrit « FR ».
   --------------------------------------------------------------------- */
.du-clair .tc-drapeau {
    display: inline-flex;
    align-items: center;
    flex: none;
    line-height: 0;
}
.du-clair .tc-drapeau svg { display: block; height: 1em; width: auto; }
.du-clair .tc-drapeau--ligne { margin-right: .4em; vertical-align: -.12em; }
.du-clair .tc-pied__officiel .tc-drapeau--ligne { margin-left: .15em; }

/* ---------------------------------------------------------------------
   25.c LA ZONE SOMBRE S'ETEND : hero + reassurance + bandeau
   Le bandeau descend en bas de la zone sombre, comme demande. Il est
   DANS .landing-space--hero : le fond spatial et ses trois couches
   d'etoiles animees passent donc dessous sans aucun redessin, et le
   filet de couleur (.landing-space--hero::after) le ferme par en bas.
   --------------------------------------------------------------------- */
.du-clair .tc-rassure--sombre {
    background: transparent;
    border-bottom: 0;
    border-top: 1px solid rgba(255, 255, 255, .10);
    position: relative;
    z-index: 1;
    padding: 1.1rem 0 .4rem;
}
.du-clair .tc-rassure--sombre .tc-rea b { color: #fff; }                    /* 18,69:1 */
.du-clair .tc-rassure--sombre .tc-rea span { color: rgba(255,255,255,.78); } /* 10,9:1  */
.du-clair .tc-rassure--sombre .tc-rea__pastille {
    background: rgba(255, 255, 255, .10);
    border-color: rgba(255, 255, 255, .18);
    color: #c9b6ff;                                                          /* 8,6:1   */
}
/* Le bandeau ne porte plus son propre aplat : le ciel du hero se voit.
   Meme specificite que la regle d'origine (0,2,0), mais posee APRES :
   c'est l'ordre qui tranche, et il est verifie au rendu. */
.du-clair .bandeau-marque {
    background: transparent;
    padding: 1.5rem 0 2.1rem;
    position: relative;
    z-index: 1;
}
/* PALIER OPAQUE DES FONDUS : la regle du 15/09 (palier au moins aussi
   large que le plus large logo) est conservee telle quelle — 70 px au
   bureau, 52 px au telephone. La couleur reste --tc-encre : le degrade
   du hero bute exactement sur cette valeur a partir de 78 %, et le
   bandeau est tout en bas. Le raccord est donc invisible. */

/* ---------------------------------------------------------------------
   25.d TITRE EN DEGRADE + DEUX BOUTONS (composition de la maquette)
   Les couleurs du logo telles quelles ne passent pas sur le ciel du
   hero : #7c3aed n'y atteint que 2,77:1 et #d434c8 que 3,85:1, sous le
   4,5:1 demande. Les memes teintes eclaircies y arrivent toutes :
   #ff5ce1 5,91:1, #b79bff 6,86:1, #4fd6f5 9,21:1, mesures sur le point
   le plus clair du fond (#2a1358, haut du degrade radial).
   --------------------------------------------------------------------- */
.du-clair .tc-titre-degrade {
    background: linear-gradient(100deg, #ff5ce1 0%, #b79bff 52%, #4fd6f5 100%);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
    -webkit-text-fill-color: transparent;
}
/* REPLI, EN REGLE DE PREMIER NIVEAU et non imbriquee : un navigateur qui
   ignore l'imbrication CSS aurait ignore le repli AVEC elle, et c'est
   justement un vieux navigateur qui en a besoin. Sans background-clip:text,
   un titre en couleur transparente disparait completement. */
@supports not ((-webkit-background-clip: text) or (background-clip: text)) {
    .du-clair .tc-titre-degrade {
        background: none;
        color: #fff;
        -webkit-text-fill-color: #fff;
    }
}
.du-clair .space-hero__actions {
    display: flex;
    gap: .75rem;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
    margin-top: 1.4rem;
}
.du-clair .space-hero__actions .space-hero__cta { margin: 0; }
.du-clair .tc-btn-fantome {
    background: rgba(255, 255, 255, .08);
    border: 1px solid rgba(255, 255, 255, .34);
    color: #fff;                       /* 15,7:1 sur le ciel du hero */
    font-weight: 700;
    padding: .85rem 1.5rem;
    border-radius: 999px;
    text-decoration: none;
    transition: background .2s, border-color .2s;
}
.du-clair .tc-btn-fantome:hover,
.du-clair .tc-btn-fantome:focus-visible {
    background: rgba(255, 255, 255, .16);
    border-color: rgba(255, 255, 255, .62);
    color: #fff;
}

/* ---------------------------------------------------------------------
   25.e CARTES DE CATEGORIE — plus de fleche, plus de sous-menu
   --------------------------------------------------------------------- */
.du-clair .tc-cat-grille {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(158px, 1fr));
    gap: .9rem;
    margin-top: 1.6rem;
}
.du-clair .tc-cat-carte {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: flex-start;
    gap: .55rem;
    padding: 1.15rem .8rem 1rem;
    background: var(--tc-surface);
    border: 1px solid var(--tc-bordure);
    border-radius: var(--tc-rayon, .9rem);
    box-shadow: var(--tc-ombre);
    text-decoration: none;
    text-align: center;
    transition: transform .18s, border-color .18s, box-shadow .18s;
}
.du-clair .tc-cat-carte:hover,
.du-clair .tc-cat-carte:focus-visible {
    transform: translateY(-3px);
    border-color: var(--tc-violet);
    box-shadow: var(--tc-ombre-forte);
}
.du-clair .tc-cat-carte__logo { height: 34px; margin-bottom: .1rem; }
.du-clair .tc-cat-carte__logo svg,
.du-clair .tc-cat-carte__logo img { height: 34px; max-width: 108px; }
/* Repli sans logo : le NOM ENTIER, jamais des initiales. */
.du-clair .tc-cat-carte__mot {
    height: 34px;
    display: grid;
    place-items: center;
    font-size: .95rem;
    font-weight: 800;
    letter-spacing: -.02em;
    color: var(--tc-encre);
    line-height: 1;
    padding: 0 .2rem;
}
.du-clair .tc-cat-carte__nom {
    font-size: .92rem;
    font-weight: 700;
    color: var(--tc-encre);
    line-height: 1.25;
}
.du-clair .tc-cat-carte__sous {
    font-size: .74rem;
    color: var(--tc-texte-doux);
    line-height: 1.3;
}
.du-clair .tc-cat-carte--tout {
    background: var(--tc-degrade-texte);
    border-color: transparent;
}
.du-clair .tc-cat-carte--tout .tc-cat-carte__nom,
.du-clair .tc-cat-carte--tout .tc-cat-carte__sous { color: #fff; }
.du-clair .tc-cat-carte--tout .tc-cat-carte__logo { color: #fff; }
.du-clair .tc-cat-carte--tout .tc-cat-carte__logo svg { height: 30px; }

/* ---------------------------------------------------------------------
   25.f LOGO DE LA MARQUE SUR LA FICHE PRODUIT
   Taille en em : le logo suit le titre, du bureau au telephone, sans
   media query. aria-hidden cote markup : le nom de la categorie est
   deja ecrit juste au-dessus.
   --------------------------------------------------------------------- */
.du-clair .tc-titre-fiche {
    display: flex;
    align-items: center;
    gap: .55em;
    flex-wrap: wrap;
}
.du-clair .tc-logo-fiche { height: .95em; }
.du-clair .tc-logo-fiche svg,
.du-clair .tc-logo-fiche img { height: .95em; max-width: 2.6em; }

/* ---------------------------------------------------------------------
   25.g ESSAI D'EN-TETE EN DEGRADE (violet, rose, bleu sombre)
   AUCUN backdrop-filter : le flou de l'en-tete a ete retire le 15/09 et
   sa suppression avait provoque le decrochage sur iPhone. L'en-tete
   fixe retenu alors n'est pas touche — seule la couleur de fond change.
   Couleur douce et diffuse obtenue par deux voiles radiaux poses sur un
   degre lineaire. Pire cas apres composition : #4c3a81, ou le texte de
   navigation donne 7,43:1 et le logo blanc 9,42:1.
   --------------------------------------------------------------------- */
.du-clair.du-entete-degrade .site-top {
    background:
        radial-gradient(120% 150% at 10% -20%, rgba(212, 52, 200, .26) 0%, rgba(212, 52, 200, 0) 60%),
        radial-gradient(110% 160% at 90% 0%, rgba(34, 184, 224, .20) 0%, rgba(34, 184, 224, 0) 64%),
        linear-gradient(118deg, #1b1033 0%, #2a1147 48%, #16203d 100%);
}
/* (24/09/2026) La regle d'essai qui peignait .categories-nav ici est
   retiree : elle remettait un fond sur le conteneur qui defile. Le fond
   de la barre est sur .tc-barre-categories, section 3. */

/* Le selecteur du ruban de previsualisation. */
.du-apercu-choix { display: inline-flex; gap: .25rem; margin: 0 .55rem; }
.du-apercu-choix button {
    font: inherit;
    font-size: .74rem;
    line-height: 1;
    padding: .34rem .55rem;
    border-radius: 999px;
    border: 1px solid rgba(255, 255, 255, .34);
    background: rgba(255, 255, 255, .10);
    color: #fff;
    cursor: pointer;
}
.du-apercu-choix button:hover { background: rgba(255, 255, 255, .22); }
.du-apercu-choix button.est-actif {
    background: #fff;
    color: #14101f;
    border-color: #fff;
    font-weight: 700;
}

@media (max-width: 640px) {
    .du-clair .tc-cat-grille { grid-template-columns: repeat(2, 1fr); gap: .65rem; }
    .du-clair .tc-cat-carte { padding: .9rem .6rem .85rem; }
    .du-clair .space-hero__actions { flex-direction: column; align-items: stretch; }
    .du-clair .space-hero__actions .btn { width: 100%; text-align: center; }
    .du-apercu-choix { margin: 0 .3rem; }
    .du-apercu-choix button { padding: .3rem .4rem; font-size: .68rem; }
}

/* Le mot « nouveau theme » du ruban de previsualisation etait a 3,28:1 :
   c'est un TEXTE EN DEGRADE, son encre est faite des arrets du degrade et
   son arret violet #7c3aed ne passe pas sur l'encre. Poser `color` n'aurait
   rien change — `-webkit-text-fill-color: transparent` l'emporte. Ce sont
   donc les ARRETS qui sont eclaircis, exactement comme pour le titre du
   hero : 5,91 / 6,86 / 9,21:1. Releve par le balayage, pas a l'oeil. */
/* ET `background-image`, PAS `background` : le raccourci remet
   background-clip a sa valeur initiale (border-box). Avec `background`, le
   mot perdait son `background-clip: text` et devenait INVISIBLE — encre
   transparente sur un pave colore. Le balayage l'a vu immediatement : le
   ratio est tombe de 3,28 a 1,00. */
.du-apercu-ruban i { background-image: linear-gradient(90deg, #ff5ce1, #b79bff, #4fd6f5); }

/* =====================================================================
   26. AJUSTEMENTS FINAUX DU 23/09/2026 (retours du client sur l'apercu)
   A1 barres en degrade, A2 bandeau pleine largeur au masque, A3 titres
   de section alignes, A4 titres de section en degrade, A5 titre
   d'accueil anime, A6 titre a flammes, A7 logos rognes, A9 en-tete en
   degrade par defaut.
   Tout est scope sous .du-clair : ni la production ni l'administration
   ne recoivent une seule de ces regles.
   ===================================================================== */

/* ---------------------------------------------------------------------
   26.a LE FILET, DEFINI UNE SEULE FOIS
   Toutes les lignes multicolores le reprennent (25/09/2026) : bas de
   l'en-tete fixe, sous la barre de categories, haut et bas du bandeau,
   haut du pied de page, tranches verticales des cartes de paiement. Les
   titres de section de A4 en derivent. Une seule valeur a changer.
   --------------------------------------------------------------------- */
.du-clair {
    --tc-filet: linear-gradient(90deg, #d434c8 0%, #7c3aed 52%, #22b8e0 100%);
    --tc-filet-ep: 3px;
    /* MEMES ARRETS POUR LES TITRES, A UNE CORRECTION PRES. Sur fond clair
       le cyan de la maquette ne donne que 2,33:1 sur blanc et 2,20:1 sur
       le fond de page : il passe sous le 3:1 exige pour un titre. Il est
       assombri de la seule valeur necessaire, TEINTE ET SATURATION
       INCHANGEES (H=193 deg, S=85 %, V de 88 % a 72 %) : #22b8e0 devient
       #1c97b8, soit 3,40:1 sur blanc et 3,21:1 sur le fond de page.
       Magenta et violet passaient deja : 4,10:1 et 5,70:1 sur blanc. */
    --tc-filet-titre: linear-gradient(95deg, #d434c8 0%, #7c3aed 52%, #1c97b8 100%);
}

/* A1.1 sous la barre de categories, sur TOUTES les pages publiques.
   La regle existait deja pour les 17 autres pages ; l'exception qui la
   retirait sur l'accueil est levee, le client la veut partout. */
.du-clair .main-content {
    border-top: var(--tc-filet-ep) solid transparent;
    border-image: var(--tc-filet) 1;
}
.du-clair .main-content:has(> .landing-space--hero) {
    border-top: var(--tc-filet-ep) solid transparent;
    border-image: var(--tc-filet) 1;
}
/* A1.4 SOUS L'EN-TETE FIXE, EN PERMANENCE (25/09/2026, demande du client).
   Elle remplace la ligne posee le 24/09 en haut de la barre de categories :
   cette barre part avec la page, sa ligne aussi ; celle-ci reste collee au
   bord bas de l'en-tete fixe pendant le defilement, bandeau d'annonces
   ouvert ou ferme, sur toutes les pages publiques.
   VRAIE BORDURE de .site-top, et non un pseudo-element : elle fait partie de
   la boite, donc de la hauteur que le script de includes/header.php mesure
   et reporte sur .site-top-spacer. Aucun contenu n'est recouvert, aucun saut
   au chargement. .site-top ne defile pas horizontalement (lecon iPhone).
   Elle est peinte DANS l'en-tete : l'ombre portee de .site-top tombe en
   dessous et ne l'assombrit plus. */
.du-clair .site-top {
    border-bottom: var(--tc-filet-ep) solid transparent;
    border-image: var(--tc-filet) 1;
}
/* Le liseré de 1 px du haut de la barre de categories touchait la nouvelle
   ligne : il devient transparent (le fond de la barre, pose en
   border-box, passe dessous). La barre garde sa hauteur. */
.du-clair .tc-barre-categories { border-top-color: transparent; }
/* A1.5 EN HAUT DU PIED DE PAGE (25/09/2026, demande du client), a la
   frontiere entre le dernier bloc clair et le pied sombre. */
.du-clair .tc-pied {
    border-top: var(--tc-filet-ep) solid transparent;
    border-image: var(--tc-filet) 1;
}
/* A1.2 en bas du bandeau : deja pose par .landing-space--hero::after,
   repris sur la meme variable. */
.du-clair .landing-space--hero::after {
    height: var(--tc-filet-ep);
    background: var(--tc-filet);
}

/* ---------------------------------------------------------------------
   26.b A2 — BANDEAU PLEINE LARGEUR, FONDU PAR MASQUE
   Les deux voiles opaques disparaissent. Ils etaient peints a l'encre du
   theme, mais le fond est un ciel anime : ils dessinaient deux
   rectangles plus sombres, et c'est ce que le client voit sur ses
   captures. Le fondu se fait desormais par masque sur la zone de
   defilement : les logos s'effacent par TRANSPARENCE, donc quel que soit
   le fond, et plus rien n'est peint par-dessus.
   Aucun backdrop-filter : couteux sur une zone animee et fragile sur iOS.
   --------------------------------------------------------------------- */
.du-clair .bandeau-marque {
    position: relative;
    overflow: visible;          /* c'est la zone interieure qui coupe */
    background: transparent;
    padding: calc(var(--tc-filet-ep) + 1.4rem) 0 2rem;
}
/* A1.3 la barre, en HAUT du bandeau. Elle est posee sur le bandeau
   lui-meme et NON sur la zone masquee : le masque l'effacerait sur les
   cotes, exactement comme les logos. */
.du-clair .bandeau-marque::before {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    bottom: auto;
    width: auto;
    height: var(--tc-filet-ep);
    background: var(--tc-filet);
    z-index: 3;
    pointer-events: none;
}
/* L'ancien voile de droite n'a plus d'objet. */
.du-clair .bandeau-marque::after { content: none; }
.du-clair .bandeau-marque__zone {
    --tc-fondu: clamp(48px, 12vw, 180px);
    overflow: hidden;
    -webkit-mask-image: linear-gradient(90deg, transparent 0, #000 var(--tc-fondu), #000 calc(100% - var(--tc-fondu)), transparent 100%);
            mask-image: linear-gradient(90deg, transparent 0, #000 var(--tc-fondu), #000 calc(100% - var(--tc-fondu)), transparent 100%);
}

/* ---------------------------------------------------------------------
   26.c A3 — TITRES DE SECTION DECALES (defaut)
   CAUSE : style.css pose `text-align: center` sur .section-title ET sur
   .section-sub. Dans l'en-tete de section a gauche, le bloc prend la
   largeur de son element le plus large ; le titre et l'accroche y sont
   donc centres pendant que l'etiquette et le lien restent au bord. D'ou
   le titre qui parait pousse vers la droite, et son centre qui tombe sur
   celui de l'accroche — exactement ce que montrent les captures.
   CORRECTION DANS LA REGLE DU COMPOSANT, donc valable pour toutes les
   en-tetes de section qui partagent cette structure.
   --------------------------------------------------------------------- */
.du-clair .tc-tete-section,
.du-clair .tc-tete-section > div {
    text-align: left;
}
.du-clair .tc-tete-section .section-title,
.du-clair .tc-tete-section .section-sub,
.du-clair .tc-tete-section .tc-etiquette {
    text-align: left;
    margin-inline: 0;
}

/* ---------------------------------------------------------------------
   26.d A4 — TITRES DE SECTION DE L'ACCUEIL EN DEGRADE
   Portee : l'accueil SEUL. Le marqueur est le meme que celui deja
   utilise par la feuille : .main-content qui contient la zone spatiale
   en enfant direct n'existe que sur l'accueil.
   inline-block : sans cela le degrade couvrirait toute la colonne et un
   titre court n'afficherait que son extremite magenta.
   Le titre reste un vrai texte, selectionnable et lisible par un lecteur
   d'ecran. Les noms de produit (.tc-une__titre) et les noms de cartes de
   categorie ne sont pas vises.
   --------------------------------------------------------------------- */
.du-clair .main-content:has(> .landing-space--hero) .section-title {
    /* BLOC a largeur ajustee, et NON inline-block : en inline-block le titre
       se rangeait sur la MEME LIGNE que son etiquette (« PAIEMENT  Deux
       facons de payer »). `display: block` le remet sur sa ligne, et
       `width: fit-content` garde le degrade sur le texte seul — sans quoi il
       couvrirait toute la colonne et un titre court n'afficherait que son
       extremite magenta. */
    display: block;
    width: fit-content;
    max-width: 100%;
    background-image: var(--tc-filet-titre);
    -webkit-background-clip: text;
            background-clip: text;
    -webkit-text-fill-color: transparent;
    /* Le raccourci `background` remettrait background-clip a border-box et
       le titre deviendrait invisible : toujours background-image. */
}
/* Repli en regle de PREMIER NIVEAU : un navigateur sans background-clip
   sur du texte doit garder un titre plein, pas un titre transparent. */
/* Titre centre : la boite ajustee doit etre recentree a la main, une boite
   `fit-content` ne suit pas le text-align de son parent. */
.du-clair .tc-centre .section-title,
.du-clair .tc-une-tete .section-title { margin-inline: auto; }
@supports not ((-webkit-background-clip: text) or (background-clip: text)) {
    .du-clair .main-content:has(> .landing-space--hero) .section-title {
        background-image: none;
        color: var(--tc-violet);
        -webkit-text-fill-color: var(--tc-violet);
    }
}

/* ---------------------------------------------------------------------
   26.e A5 — TITRE D'ACCUEIL : LA COULEUR GLISSE
   Memes couleurs qu'aujourd'hui (#ff5ce1, #b79bff, #4fd6f5), mesurees le
   22/09 a 5,91 / 6,86 / 9,21:1 sur le ciel du hero. Le degrade est
   REFERME SUR SA COULEUR DE DEPART et l'aller-retour se fait en
   `alternate` : aucune rupture a la boucle.
   `background-image` et non `background` : le raccourci effacerait le
   decoupage sur le texte.
   --------------------------------------------------------------------- */
.du-clair .tc-titre-degrade {
    background-image: linear-gradient(100deg, #ff5ce1 0%, #b79bff 26%, #4fd6f5 50%, #b79bff 74%, #ff5ce1 100%);
    background-size: 220% 100%;
    background-position: 0% 50%;
    background-repeat: no-repeat;
    /* 25/09/2026 : 7s -> 3,5s (demande client, environ deux fois plus vif). */
    animation: du-titre-couleur 3.5s ease-in-out infinite alternate;
}
@keyframes du-titre-couleur {
    from { background-position: 0% 50%; }
    to   { background-position: 100% 50%; }
}
/* Pause hors champ, meme mecanisme que le bandeau. */
.du-clair .tc-titre-degrade.est-hors-vue { animation-play-state: paused; }

/* ---------------------------------------------------------------------
   26.f A6 — TITRE A FLAMMES, AU-DESSUS DU PRODUIT A LA UNE
   --------------------------------------------------------------------- */
.du-clair .tc-une-tete {
    padding: 2.4rem 0 0;
    text-align: center;
}
.du-clair .tc-titre-flammes {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: .6em;
    flex-wrap: nowrap;          /* une flamme ne tombe jamais seule */
    max-width: 100%;
}
.du-clair .tc-titre-flammes > span:not(.tc-flamme) {
    min-width: 0;               /* le texte, lui, a le droit de passer a la ligne */
}
.du-clair .tc-flamme {
    flex: none;
    display: inline-flex;
    align-items: center;
    width: .9em;
    height: 1.1em;
}
.du-clair .tc-flamme svg { width: 100%; height: 100%; display: block; overflow: visible; }
.du-clair .tc-flamme--droite svg { transform: scaleX(-1); }
/* Le vacillement porte sur les TRACES, pas sur le <svg> : le miroir de la
   flamme de droite reste ainsi independant de l'animation.
   transform-box: fill-box + origine en bas : sans eux, Safari prend le
   repere du document et la flamme part de travers. */
.du-clair .tc-flamme .du-flamme-ext,
.du-clair .tc-flamme .du-flamme-mid,
.du-clair .tc-flamme .du-flamme-coeur {
    transform-box: fill-box;
    transform-origin: 50% 100%;
    will-change: transform;
}
.du-clair .tc-flamme .du-flamme-ext   { animation: du-vacille 2.6s ease-in-out infinite; }
.du-clair .tc-flamme .du-flamme-mid   { animation: du-vacille 2.2s ease-in-out infinite reverse; }
.du-clair .tc-flamme .du-flamme-coeur { animation: du-vacille-coeur 1.9s ease-in-out infinite; }
/* Les deux flammes dephasees : elles ne battent pas ensemble. */
.du-clair .tc-flamme--droite .du-flamme-ext   { animation-delay: -1.1s; }
.du-clair .tc-flamme--droite .du-flamme-mid   { animation-delay: -.7s; }
.du-clair .tc-flamme--droite .du-flamme-coeur { animation-delay: -.5s; }
@keyframes du-vacille {
    0%, 100% { transform: scale(1, 1) rotate(0deg); }
    30%      { transform: scale(.96, 1.06) rotate(-2.4deg); }
    62%      { transform: scale(1.04, .97) rotate(2.1deg); }
}
@keyframes du-vacille-coeur {
    0%, 100% { transform: translateY(0) scale(1); opacity: 1; }
    40%      { transform: translateY(-4%) scale(1.07); opacity: .88; }
    70%      { transform: translateY(1%) scale(.95); opacity: 1; }
}

/* ---------------------------------------------------------------------
   26.g A7 — PLUS AUCUN LOGO ROGNE
   La cause etait dans le rendu (dimensions intrinseques retirees du SVG
   insere) et elle est corrigee dans includes/theme-clair/logos.php.
   Ici, les deux garde-fous qui empechent le defaut de revenir :
   overflow visible sur le dessin, et une boite qui suit le RAPPORT du
   logo au lieu de l'enfermer dans un carre.
   --------------------------------------------------------------------- */
.du-clair .tc-logo svg,
.du-clair .tc-logo img { overflow: visible; }
.du-clair .tc-cat-carte__logo { height: 34px; width: auto; }
.du-clair .tc-cat-carte__logo svg,
.du-clair .tc-cat-carte__logo img { height: 34px; width: auto; max-width: 136px; }
.du-clair .tc-logo-fiche { height: 1em; }
.du-clair .tc-logo-fiche svg,
.du-clair .tc-logo-fiche img { height: 1em; width: auto; max-width: 3.4em; }
.du-clair .tc-pastille__logo svg,
.du-clair .tc-pastille__logo img { height: 15px; width: auto; max-width: 60px; }

/* ---------------------------------------------------------------------
   26.h A9 — L'EN-TETE EN DEGRADE DEVIENT LA VERSION PAR DEFAUT
   Le client l'a retenue. Les regles ne dependent plus de la classe
   d'essai : elles s'appliquent des que le nouveau theme est actif.
   Toujours aucun backdrop-filter : le flou de l'en-tete a ete retire le
   15/09 et sa suppression avait provoque le decrochage sur iPhone.
   L'en-tete fixe retenu alors n'est pas touche, seule la couleur change.

   COULEUR OPAQUE SOUS LE DEGRADE (24/09/2026, meme logique que la barre
   de categories, section 3) : une zone sombre ne doit pas dependre d'un
   seul calque peint. Si le degrade n'est pas trace, l'en-tete reste
   sombre, et Safari 26+ lit une couleur franche pour prolonger l'en-tete
   fixe dans la bande de statut.
   VALEUR MESUREE, pas choisie a l'oeil : #3b215b est la couleur unique la
   plus proche du bord haut PEINT de l'en-tete (ecart median dE 6, iPhone et
   bureau), la ou cette prolongation le rejoint. #1b1033, l'arret de depart
   du degrade, en etait a dE 20 : une bande nettement plus sombre. Aucune
   couleur unique ne colle a tout le bord, qui va du violet (gauche) au
   bleu-vert (droite). Invisible tant que le degrade est peint (il est
   opaque). Contraste du blanc sur cette couleur seule : 13,5:1.
   --------------------------------------------------------------------- */
.du-clair .site-top {
    background-color: #3b215b;
    background-image:
        radial-gradient(120% 150% at 10% -20%, rgba(212, 52, 200, .26) 0%, rgba(212, 52, 200, 0) 60%),
        radial-gradient(110% 160% at 90% 0%, rgba(34, 184, 224, .20) 0%, rgba(34, 184, 224, 0) 64%),
        linear-gradient(118deg, #1b1033 0%, #2a1147 48%, #16203d 100%);
}
/* La barre de categories n'est plus definie ici : son fond et la couleur
   de ses libelles sont portes par .tc-barre-categories (section 3),
   correctif du 24/09/2026. Un fond pose sur .categories-nav, conteneur qui
   defile, n'est pas fiable sur iPhone. */

/* ---------------------------------------------------------------------
   26.j FOND SPATIAL PLUS VIVANT (25/09/2026, demande du client)
   Memes couches qu'avant (nebuleuse + trois champs d'etoiles, style.css),
   aucune nouvelle : seules la vitesse et l'amplitude changent, et le
   scintillement est plus marque. transform et opacity uniquement, donc
   composes par le GPU.
   Vitesse moyenne d'un aller (deplacement / duree) :
     champ 1 (1 px, le plus lointain) : (-40, 24) en 24 s, 1,9 px/s (0,31 avant)
     champ 2 (2 px)                   : (48, -28) en 18 s, 3,1 px/s (0,15 avant)
     champ 3 (2 px, le plus proche)   : (-36, -54) en 13 s, 5,0 px/s (0,11 avant)
   Amplitude maximale par axe : 54 px. Le champ genere dans accueil.php
   deborde la zone de 120 px de chaque cote.
   MOUVEMENT REDUIT : la regle de style.css (animation: none !important sur
   .space-hero__layer et .space-hero__nebula) l'emporte sur celles-ci, les
   etoiles restent fixes.
   --------------------------------------------------------------------- */
.du-clair #du-stars1 { animation: tc-scintille 3s ease-in-out infinite alternate, tc-derive1 24s ease-in-out infinite alternate; }
.du-clair #du-stars2 { animation: tc-scintille 4.5s ease-in-out infinite alternate, tc-derive2 18s ease-in-out infinite alternate; }
.du-clair #du-stars3 { animation: tc-scintille 6s ease-in-out infinite alternate, tc-derive3 13s ease-in-out infinite alternate; }
@keyframes tc-scintille { from { opacity: .2; } to { opacity: 1; } }
@keyframes tc-derive1 { from { transform: translate3d(0, 0, 0); } to { transform: translate3d(-40px, 24px, 0); } }
@keyframes tc-derive2 { from { transform: translate3d(0, 0, 0); } to { transform: translate3d(48px, -28px, 0); } }
@keyframes tc-derive3 { from { transform: translate3d(0, 0, 0); } to { transform: translate3d(-36px, -54px, 0); } }
.du-clair .space-hero__nebula { animation: tc-nebuleuse 14s ease-in-out infinite alternate; }
@keyframes tc-nebuleuse { from { opacity: .7; transform: scale(1); } to { opacity: 1; transform: scale(1.06); } }

/* ---------------------------------------------------------------------
   26.i MOUVEMENT REDUIT — toutes les animations de cette passe s'arretent
   --------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
    .du-clair .tc-titre-degrade {
        animation: none;
        background-position: 0% 50%;
    }
    .du-clair .tc-flamme .du-flamme-ext,
    .du-clair .tc-flamme .du-flamme-mid,
    .du-clair .tc-flamme .du-flamme-coeur {
        animation: none;
        transform: none;
        opacity: 1;
    }
}

@media (max-width: 640px) {
    .du-clair .bandeau-marque { padding: calc(var(--tc-filet-ep) + 1rem) 0 1.4rem; }
    .du-clair .tc-une-tete { padding-top: 1.8rem; }
    .du-clair .tc-titre-flammes { gap: .45em; }
    .du-clair .tc-cat-carte__logo,
    .du-clair .tc-cat-carte__logo svg,
    .du-clair .tc-cat-carte__logo img { height: 30px; }
}

/* ---------------------------------------------------------------------
   27/09/2026 : BORDS DES BOUTONS MULTICOLORES (defaut signale par le client)
   Un fond en degrade pose avec « background: » garde background-origin:
   padding-box et background-repeat: repeat. Sur un element qui a une
   BORDURE, meme transparente, le degrade est dimensionne sur la boite
   interieure puis se REPETE sous la bordure : le bord gauche montre la fin
   du degrade (bleu-vert) et le bord droit son debut (magenta). Mesure sur
   le pixel peint le 27/09 : #0c7e9e dans le bord gauche contre #b2229f
   juste a l'interieur.
   border-box : le degrade couvre toute la boite, bordure comprise, sans
   repetition. Couleurs, dimensions, arrondis et etats inchanges.
   Famille relevee sur les STYLES CALCULES (degrade + bordure non nulle,
   au repos, au survol, au focus et a l'appui) : ces trois elements seuls.
   Toute nouvelle regle qui pose un degrade sur un element a bordure doit
   rejoindre cette liste. PLACEE EN FIN DE FEUILLE : un « background: »
   posterieur remettrait l'origine a padding-box.
   --------------------------------------------------------------------- */
.du-clair .tc-pastille--tout,
.du-clair .tc-cat-carte--tout,
.du-clair .variant-btn.active { background-origin: border-box; }

/* ---------------------------------------------------------------------
   27. FOND DE L'ACCUEIL AVEC L'IMAGE DU CLIENT (27/09/2026, commande reglee)
   L'image (includes/theme-clair/accueil.php, <picture class="tc-fond-client">)
   remplace le degrade radial de la section 10 et la nebuleuse CSS, retiree du
   gabarit : les regles de .space-hero__nebula (style.css, 26.j) ne s'appliquent
   plus a rien. Les trois couches d'etoiles restent au-dessus, inchangees.
   ▸ Fond d'attente sombre sous l'image, le temps qu'elle arrive : le texte
     reste lisible des la premiere image.
   ▸ object-fit: cover, point focal sur l'horizon et le lever de soleil :
     50 % 60 % dans l'image paysage, 51 % 53 % dans l'image portrait (nouvelle
     image du client, 28/09 ; 70 % 59 % dans la precedente).
   ▸ Zoom de 1 a 1,08, 10 s par sens, soit 20 s l'aller-retour (28/09/2026,
     demande du client : « animations plus rapides » ; 50 s par sens avant),
     ease-in-out (demarrage et arret doux), transform seul, autour
     du point focal (un zoom avant ne decouvre jamais de bord). En pause hors
     de l'ecran (classe posee par assets/js/accueil-fond.js), arrete en
     mouvement reduit.
   ▸ Voile sombre pour la lisibilite, regle sur la mesure du contraste de
     chaque texte de la zone au point le plus defavorable.
   LA LISTE DE MEDIA CI-DESSOUS EST CELLE DES <source> DU GABARIT : les
   changer ENSEMBLE.
   --------------------------------------------------------------------- */
.du-clair .landing-space--hero { background: #0d0a1f; }
.du-clair .tc-fond-client { position: absolute; inset: 0; display: block; overflow: hidden; }
.du-clair .tc-fond-client__img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: 50% 60%;
    transform-origin: 50% 60%;
    animation: tc-fond-zoom 10s ease-in-out infinite alternate;
}
@media (max-width: 900px), (max-aspect-ratio: 1/1) and (max-width: 1020px) {
    .du-clair .tc-fond-client__img { object-position: 51% 53%; transform-origin: 51% 53%; }
}
@keyframes tc-fond-zoom { from { transform: scale(1); } to { transform: scale(1.08); } }
.du-clair .landing-space--hero.tc-fond-hors-vue .tc-fond-client__img { animation-play-state: paused; }
/* Voile : base legere a 40 % partout (l'image reste visible sur les cotes et
   sous les logos), renforce derriere la colonne du hero et derriere la rangee
   de reassurance (environ 72 % au total). Mesure du 27/09 sur 25 formats
   d'ecran, aux deux bouts du zoom : chaque texte de la zone au moins a 3,25:1
   (grands titres, seuil 3:1) et 5,07:1 (autres textes, seuil 4,5:1) au pixel
   le plus defavorable. Ne pas l'alleger sans refaire cette mesure.
   2e passe du 27/09 (images nettes, points clairs plus vifs) : 342 mesures sur
   9 formats, au moins 3,41:1 et 4,68:1 ; seul le voile portrait a ete renforce. */
.du-clair .tc-fond-client__voile {
    position: absolute;
    inset: 0;
    background:
        radial-gradient(max(720px, 42%) 40% at 50% 40%, rgba(7, 5, 20, .56) 60%, rgba(7, 5, 20, 0) 100%),
        linear-gradient(180deg, rgba(7, 5, 20, 0) 58%, rgba(7, 5, 20, .54) 66%, rgba(7, 5, 20, .54) 90%, rgba(7, 5, 20, 0) 97%),
        rgba(7, 5, 20, .40);
}
@media (max-width: 900px), (max-aspect-ratio: 1/1) and (max-width: 1020px) {
    /* Telephone et tablette : les textes couvrent presque toute la largeur, voile
       continu a 71 %, plus leger derriere le logo (haut) et le bandeau (bas).
       27/09, 2e passe (image plus nette, points clairs plus vifs) : 76 % dans la
       bande du kicker et du titre (9 a 45 % de la hauteur), mesure a l'appui. */
    .du-clair .tc-fond-client__voile {
        background: linear-gradient(180deg, rgba(7, 5, 20, .52) 0%, rgba(7, 5, 20, .76) 9%, rgba(7, 5, 20, .76) 45%, rgba(7, 5, 20, .71) 52%, rgba(7, 5, 20, .71) 90%, rgba(7, 5, 20, .45) 100%);
    }
}
@media (prefers-reduced-motion: reduce) {
    .du-clair .tc-fond-client__img { animation: none; transform: none; }
}

/* ---------------------------------------------------------------------
   28. CARTE « N°1 DES VENTES » (28/09/2026, commande reglee)
   ▸ Titre : police dans l'esprit du logo (Chakra Petch Bold Italic, licence
     OFL, fichier heberge et reduit aux caracteres des deux titres FR et EN,
     licence jointe : assets/fonts/chakra-petch-OFL.txt), font-display: swap.
     Degrade du texte de A4 conserve. UNE ligne, meme a 320 px.
   ▸ A4 (26.d) impose display: block a tout .section-title de l'accueil et
     annulait le display: inline-flex du titre a flammes (26.f). La regle
     ci-dessous est PLUS SPECIFIQUE : le titre redevient une rangee flexible,
     flammes centrees sur le texte.
   ▸ Flammes : nouvelles, plus grandes et plus vives, avec etincelles qui
     montent. transform et opacity seulement ; en pause hors de l'ecran
     (classe est-hors-vue posee par assets/js/accueil-fond.js) ; arretees en
     mouvement reduit.
   ▸ Carte : fond degrade bleu et violet anime, lent et fluide : rotation d'un
     pseudo-element (transform), jamais de background-position anime.
   ▸ Mise en page (demande du client) : le titre descend un peu, l'espace
     entre le bandeau et la carte diminue ; c'est sous le titre que tout se
     resserre. Valeurs mesurees dans le rapport du 28/09.
   --------------------------------------------------------------------- */
@font-face {
    font-family: "DU Titre N1";
    src: url("/assets/fonts/chakra-petch-titre-n1.woff2?v=20260928c") format("woff2");
    font-weight: 700;
    font-style: italic;
    font-display: swap;
    unicode-range: U+20, U+23, U+31, U+4E, U+62, U+64, U+65, U+6C, U+6E, U+72-74, U+76, U+A0, U+B0;
}
.du-clair .tc-une-tete { padding-top: 2.7rem; }
.du-clair .tc-une { padding-top: 1.1rem; }
.du-clair .main-content:has(> .landing-space--hero) .tc-une-tete .tc-titre-n1 {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: .3em;
    width: fit-content;
    max-width: 100%;
    margin: 0 auto;
    font-family: "DU Titre N1", "Arial Black", Arial, sans-serif;
    font-style: italic;
    font-weight: 700;
    letter-spacing: .01em;
    line-height: 1.2;
    white-space: nowrap;
}
.du-clair .tc-titre-n1__texte { white-space: nowrap; padding-inline-end: .06em; }
.du-clair .tc-n1-flamme {
    flex: none;
    display: block;
    width: 1em;
    height: 1.6em;
}
.du-clair .tc-n1-flamme svg { display: block; width: 100%; height: 100%; overflow: visible; }
.du-clair .tc-n1-flamme--droite svg { transform: scaleX(-1); }
.du-clair .tc-n1-feu__corps,
.du-clair .tc-n1-c1,
.du-clair .tc-n1-c2,
.du-clair .tc-n1-c3,
.du-clair .tc-n1-c4 {
    transform-box: fill-box;
    transform-origin: 50% 100%;
}
.du-clair .tc-n1-feu__corps { animation: tc-n1-balance 3.2s ease-in-out infinite; }
.du-clair .tc-n1-c1 { animation: tc-n1-lecher 1.3s ease-in-out infinite; }
.du-clair .tc-n1-c2 { animation: tc-n1-lecher 1.05s ease-in-out infinite reverse; }
.du-clair .tc-n1-c3 { animation: tc-n1-lecher .85s ease-in-out infinite; }
.du-clair .tc-n1-c4 { transform-origin: 50% 70%; animation: tc-n1-coeur .7s ease-in-out infinite alternate; }
/* Les deux flammes dephasees : elles ne battent pas ensemble. */
.du-clair .tc-n1-flamme--droite .tc-n1-feu__corps { animation-delay: -1.6s; }
.du-clair .tc-n1-flamme--droite .tc-n1-c1 { animation-delay: -.5s; }
.du-clair .tc-n1-flamme--droite .tc-n1-c2 { animation-delay: -.3s; }
.du-clair .tc-n1-flamme--droite .tc-n1-c3 { animation-delay: -.6s; }
@keyframes tc-n1-lecher {
    0%, 100% { transform: scale(1, 1) skewX(0deg); }
    25%      { transform: scale(.94, 1.1) skewX(-4deg); }
    55%      { transform: scale(1.05, .95) skewX(3deg); }
    80%      { transform: scale(.97, 1.06) skewX(-2deg); }
}
@keyframes tc-n1-coeur {
    from { transform: scale(.9); opacity: .85; }
    to   { transform: scale(1.12); opacity: 1; }
}
@keyframes tc-n1-balance {
    0%, 100% { transform: rotate(-1.5deg); }
    50%      { transform: rotate(1.5deg); }
}
/* Etincelles : elles montent, derivent un peu et s'eteignent, chacune a son rythme. */
.du-clair .tc-n1-e {
    transform-box: fill-box;
    transform-origin: 50% 50%;
    opacity: 0;
    animation: tc-n1-monte 1.8s ease-out infinite;
}
.du-clair .tc-n1-e1 { --tc-dx: -4px; animation-duration: 1.7s; animation-delay: -.2s; }
.du-clair .tc-n1-e2 { --tc-dx: 5px;  animation-duration: 2.1s; animation-delay: -1.1s; }
.du-clair .tc-n1-e3 { --tc-dx: -1px; animation-duration: 1.5s; animation-delay: -.7s; }
.du-clair .tc-n1-e4 { --tc-dx: 6px;  animation-duration: 2.4s; animation-delay: -1.7s; }
.du-clair .tc-n1-e5 { --tc-dx: -6px; animation-duration: 1.9s; animation-delay: -1.3s; }
.du-clair .tc-n1-flamme--droite .tc-n1-e { animation-delay: -.9s; }
@keyframes tc-n1-monte {
    0%   { opacity: 0; transform: translate(0, 8px) scale(1); }
    15%  { opacity: 1; }
    100% { opacity: 0; transform: translate(var(--tc-dx, 0px), -34px) scale(.4); }
}
/* Fond de la carte : taches bleues et violettes, tournant lentement. */
.du-clair .tc-une__carte::before {
    inset: -60%;
    background:
        radial-gradient(28% 28% at 32% 34%, rgba(124, 58, 237, .52), transparent 70%),
        radial-gradient(26% 26% at 68% 62%, rgba(34, 184, 224, .40), transparent 70%),
        radial-gradient(22% 22% at 62% 30%, rgba(79, 70, 229, .48), transparent 70%),
        radial-gradient(20% 20% at 36% 70%, rgba(212, 52, 200, .28), transparent 70%);
    animation: tc-n1-fond 26s linear infinite;
}
.du-clair .tc-une__carte::after {
    content: "";
    position: absolute;
    inset: -30%;
    pointer-events: none;
    background: radial-gradient(34% 34% at 50% 50%, rgba(34, 184, 224, .22), transparent 70%);
    animation: tc-n1-halo 9s ease-in-out infinite alternate;
}
.du-clair .tc-une__carte > * { z-index: 1; }
@keyframes tc-n1-fond { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
@keyframes tc-n1-halo {
    from { transform: translate(-16%, 8%) scale(1); opacity: .55; }
    to   { transform: translate(16%, -8%) scale(1.22); opacity: 1; }
}
/* Hors de l'ecran : tout est en pause. */
.du-clair .tc-une-tete.est-hors-vue .tc-n1-feu *,
.du-clair .tc-une.est-hors-vue .tc-une__carte::before,
.du-clair .tc-une.est-hors-vue .tc-une__carte::after { animation-play-state: paused; }
@media (max-width: 640px) {
    .du-clair .tc-une-tete { padding-top: 2.2rem; }
    .du-clair .tc-une { padding-top: 1.15rem; }
}
@media (prefers-reduced-motion: reduce) {
    .du-clair .tc-n1-feu *,
    .du-clair .tc-une__carte::before,
    .du-clair .tc-une__carte::after { animation: none; }
    .du-clair .tc-n1-e { opacity: 0; }
}

/* ---------------------------------------------------------------------
   29. ETOILES DE L'ACCUEIL PLUS VIVANTES (28/09/2026, commande reglee)
   Etoiles generees dans includes/theme-clair/accueil.php (tirage fixe).
   ▸ Scintillement DESYNCHRONISE : chaque couche de 26.j est repartie en trois
     sous-couches (memes etoiles, meme derive) qui scintillent chacune a leur
     rythme ; les sous-couches « a » gardent les regles de 26.j.
   ▸ 4e couche d'etoiles RONDES de 3 et 4 px avec halo, quelques-unes aux
     couleurs de la marque ; couche de densite pour le telephone (< 600 px).
   ▸ 3 etoiles filantes, chacune visible une seconde environ par cycle.
   ▸ transform et opacity seulement ; tout est en pause hors de l'ecran (classe
     posee par assets/js/accueil-fond.js) ; mouvement reduit : style.css fige
     deja .space-hero__layer, les etoiles filantes sont masquees.
   --------------------------------------------------------------------- */
.du-clair #du-stars1b, .du-clair #du-stars1c { width: 1px; height: 1px; }
.du-clair #du-stars2b, .du-clair #du-stars2c,
.du-clair #du-stars3b, .du-clair #du-stars3c { width: 2px; height: 2px; }
.du-clair #du-stars1b { animation: tc-scintille 2.3s ease-in-out -.8s infinite alternate, tc-derive1 24s ease-in-out infinite alternate; }
.du-clair #du-stars1c { animation: tc-scintille 3.7s ease-in-out -2.1s infinite alternate, tc-derive1 24s ease-in-out infinite alternate; }
.du-clair #du-stars2b { animation: tc-scintille 3.1s ease-in-out -1.4s infinite alternate, tc-derive2 18s ease-in-out infinite alternate; }
.du-clair #du-stars2c { animation: tc-scintille 5.3s ease-in-out -3.2s infinite alternate, tc-derive2 18s ease-in-out infinite alternate; }
.du-clair #du-stars3b { animation: tc-scintille 4.1s ease-in-out -.6s infinite alternate, tc-derive3 13s ease-in-out infinite alternate; }
.du-clair #du-stars3c { animation: tc-scintille 7.2s ease-in-out -4.4s infinite alternate, tc-derive3 13s ease-in-out infinite alternate; }
.du-clair .tc-etoiles-rondes { width: 3px; height: 3px; border-radius: 50%; opacity: 1; }
.du-clair #du-stars4b { width: 4px; height: 4px; }
.du-clair #du-stars4a { animation: tc-scintille-rond 2.6s ease-in-out -.4s infinite alternate, tc-derive2 18s ease-in-out infinite alternate; }
.du-clair #du-stars4b { animation: tc-scintille-rond 3.4s ease-in-out -1.9s infinite alternate, tc-derive3 13s ease-in-out infinite alternate; }
.du-clair #du-stars4c { animation: tc-scintille-rond 4.3s ease-in-out -2.7s infinite alternate, tc-derive1 24s ease-in-out infinite alternate; }
.du-clair #du-stars5a { animation: tc-scintille-rond 2.9s ease-in-out -1.1s infinite alternate, tc-derive2 18s ease-in-out infinite alternate; }
.du-clair #du-stars5b { animation: tc-scintille-rond 3.8s ease-in-out -2.5s infinite alternate, tc-derive3 13s ease-in-out infinite alternate; }
.du-clair .tc-etoiles-tel { display: none; }
@media (max-width: 600px) { .du-clair .tc-etoiles-tel { display: block; } }
/* opacity seule : transform appartient deja a la derive de la meme couche. */
@keyframes tc-scintille-rond {
    from { opacity: .3; }
    to   { opacity: 1; }
}
/* Etoiles filantes : un trait lumineux qui file en diagonale puis s'eteint. */
.du-clair .tc-filante {
    position: absolute;
    width: 120px;
    height: 2px;
    border-radius: 2px;
    background: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(214, 200, 255, .55) 60%, #fff);
    opacity: 0;
    pointer-events: none;
    transform-origin: 100% 50%;
}
.du-clair .tc-filante--1 { top: 10%; left: 62%; animation: tc-filante 11s linear 1.5s infinite; }
.du-clair .tc-filante--2 { top: 24%; left: 18%; animation: tc-filante 14s linear 6s infinite; }
.du-clair .tc-filante--3 { top: 5%;  left: 84%; animation: tc-filante 17s linear 10s infinite; }
@keyframes tc-filante {
    0%   { opacity: 0; transform: rotate(-24deg) translateX(0) scaleX(.4); }
    1.5% { opacity: 1; }
    7%   { opacity: 0; transform: rotate(-24deg) translateX(-340px) scaleX(1); }
    100% { opacity: 0; transform: rotate(-24deg) translateX(-340px) scaleX(1); }
}
/* Hors de l'ecran : toutes les etoiles en pause (les trois couches d'origine comprises). */
.du-clair .landing-space--hero.tc-fond-hors-vue .space-hero__layer,
.du-clair .landing-space--hero.tc-fond-hors-vue .tc-filante { animation-play-state: paused; }
@media (prefers-reduced-motion: reduce) {
    .du-clair .tc-filante { display: none; }
}

/* ---------------------------------------------------------------------
   30. « PRIX : » A LA PLACE DE LA VALEUR (29/09/2026)
   ▸ Cartes produits (accueil, boutique, categories) : « Prix : » puis le tarif
     en euros, a la place de la valeur ; les credits restent en bas de la carte.
   ▸ Fiche produit : « Prix : » et le tarif en euros a la place de la valeur,
     plus grand et en gras.
   ▸ Le libelle et le montant ne se coupent jamais eux-memes (nowrap chacun).
   --------------------------------------------------------------------- */
.du-clair .product-card-prix { font-size: .84rem; color: var(--tc-texte-doux); }
.du-clair .product-card-prix__lib,
.du-clair .product-card-prix__montant { white-space: nowrap; }
.du-clair .product-card-prix__montant { color: var(--tc-encre); font-weight: 800; }
.du-clair .du-prix-fiche { font-size: 1.6rem; font-weight: 800; line-height: 1.2; color: var(--tc-encre); }
.du-clair .du-prix-fiche__lib,
.du-clair .du-prix-fiche__montant { white-space: nowrap; }

/* ---------------------------------------------------------------------
   31. FLUIDITE DU HAUT DE L'ACCUEIL SUR IPHONE (29/09/2026, correction gratuite)
   Releve du 29/09 (arbre des calques de Chrome, 440 x 956 en densite 3) : 60 calques
   composes, dont 14 calques d'etoiles d'environ 2 700 x 1 500 px chacun, un calque de
   440 x 9 106 px cree par le chevauchement du titre « N°1 des ventes » et 7 sections
   gardees en calque par will-change. Sur iPhone, la memoire graphique s'epuisait : des
   zones restaient noires ou vides au defilement (carte N°1, bandeau des marques).
   ▸ Etoiles : UN canvas (assets/js/accueil-fond.js) ; les regles des sections 26.j et 29
     sur #du-stars* n'ont plus d'element a styler.
   ▸ Titre a flammes : son contenu anime reste dans sa section (contain: paint) ; les
     etincelles montent de 22 px au plus, la marge du haut en fait 35 a 43.
   ▸ Sections qui apparaissent au defilement : plus de will-change permanent ; le navigateur
     cree le calque le temps du fondu, puis le libere.
   ▸ Halo de la carte N°1 : boite ramenee a la carte (inset 0 au lieu de -30 %), meme halo
     et meme mouvement (rayons et deplacements recalcules : 34 % x 1,6 = 54,4 %, 16 % x 1,6
     = 25,6 %, 8 % x 1,6 = 12,8 %).
   ▸ Degrade anime du titre du haut : en pause pendant le defilement (repeint a chaque
     image sinon), reprise 200 ms apres l'arret.
   ▸ Bandeau des cookies : fond deja opaque (section 12), flou d'arriere-plan inutile retire.
   --------------------------------------------------------------------- */
.du-clair .tc-etoiles {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    display: block;
    pointer-events: none;
    opacity: 0;
    transition: opacity .6s ease;
}
.du-clair .tc-etoiles.est-pret { opacity: 1; }
.du-clair .tc-une-tete { contain: paint; }
.du-clair.js-anim .reveal { will-change: auto; }
.du-clair .tc-une__carte::after {
    inset: 0;
    background: radial-gradient(54.4% 54.4% at 50% 50%, rgba(34, 184, 224, .22), transparent 70%);
    animation-name: tc-n1-halo-carte;
}
@keyframes tc-n1-halo-carte {
    from { transform: translate(-25.6%, 12.8%) scale(1); opacity: .55; }
    to   { transform: translate(25.6%, -12.8%) scale(1.22); opacity: 1; }
}
.du-clair .landing-space--hero.tc-defile .tc-titre-degrade { animation-play-state: paused; }
.du-clair #cookie-banner { -webkit-backdrop-filter: none !important; backdrop-filter: none !important; }
