/* ==========================================================================
   SharpHeberg — templates/hostim/css/custom.css
   Date : 2026-08-31

   OBJET
   Modernisation de l'apparence du portail client (theme hostim / ThemeTags,
   WHMCS 8.12.1) SANS redesign structurel : hierarchie typographique plus
   nette, rythme d'espacement coherent, composants plus soignes, lisibilite
   amelioree en mode clair ET en mode sombre.

   REVERSIBILITE
   Ce fichier est le SEUL fichier modifie. Il est charge en DERNIER par
   includes/head.tpl. VIDER CE FICHIER (ou le remplacer par un fichier vide)
   RESTAURE INTEGRALEMENT L'APPARENCE D'ORIGINE DU SITE, sans aucune autre
   intervention : aucun .tpl, aucun .js, aucune autre feuille de style n'a
   ete touche.

   REGLES DE CASCADE VALABLES POUR TOUTE LA FEUILLE
   1. custom.css est charge apres theme.min.css et hostim.css : a specificite
      egale, nous gagnons. Le prefixe "html body" ne sert que quand la regle
      d'origine est plus specifique.
   2. EXCEPTION cart.php : /templates/orderforms/themetags_cart/css/all.min.css
      et son custom.css y sont injectes APRES nous (verifie dans le HTML
      rendu). Toute regle visant #order-standard_cart passe donc par la
      specificite (prefixe "html body").
   3. !important : uniquement en reponse a un !important deja present dans le
      theme, qu'aucune specificite ne peut battre. Chacun est justifie sur
      place.
   4. Aucun display:none, aucune visibility:hidden, aucun changement de
      position qui sorte un element du flux (la seule regle de position REMET
      au contraire un element dans le flux : section 7.5).
   ========================================================================== */


/* ==========================================================================
   1. JETONS
   Additifs : aucun jeton existant de variables.css n'est ecrase, sauf
   --body-color en mode sombre (section 1.9), argumente sur place.
   ========================================================================== */

:root {

  /* --- 1.1 Echelle typographique -------------------------------------
     Le theme melange 10/11/12/13/14/14.4/15/16/18/20/22/28/35 px sans
     logique. Les titres Bootstrap, eux, suivent deja un ratio 1.2 propre
     (16/20/24/28/32/40) : on ne les touche pas, on prolonge l'echelle
     vers le bas, la ou tout part en vrille. */
  --tt-fs-micro:  0.75rem;    /* 12px — badges, meta de cellule            */
  --tt-fs-meta:   0.8125rem;  /* 13px — cellules de tableau, metadonnees   */
  --tt-fs-label:  0.875rem;   /* 14px — libelles, pied de page, erreurs    */
  --tt-fs-body:   0.9375rem;  /* 15px — corps de texte                     */
  --tt-fs-lead:   1.0625rem;  /* 17px — chapo, sous-titre de banniere      */
  --tt-fs-title:  1.5rem;     /* 24px — titre de page en flux              */
  --tt-fs-banner: 1.875rem;   /* 30px — titre de banniere de page          */

  /* Interlignes SANS UNITE : chaque composant recalcule son plomb a partir
     de sa propre taille (voir section 2.1). */
  --tt-lh-tight: 1.2;
  --tt-lh-snug:  1.35;
  --tt-lh-base:  1.6;
  --tt-lh-prose: 1.7;

  /* --- 1.2 Echelle d'espacement, base 4px -----------------------------
     Le theme melange 100/60/50/40/35/30/25/20/15/12/10/8/5px. On recale
     les seules valeurs structurantes : les ecarts sont d'au plus 4px,
     invisibles a l'oeil, mais toutes les distances deviennent coherentes. */
  --sp-1: 0.25rem;
  --sp-2: 0.5rem;
  --sp-3: 0.75rem;
  --sp-4: 1rem;
  --sp-5: 1.5rem;
  --sp-6: 2rem;
  --sp-7: 3rem;
  --sp-8: 4rem;
  --sh-section-y: var(--sp-8);   /* rythme des grandes sections */

  /* --- 1.3 Rayons ------------------------------------------------------
     --custom-radius (.75rem) est defini dans variables.css et utilise par
     .tt-rounded / .popover-user-notifications / le menu deroulant, mais
     JAMAIS par .card ni par .alert, restees au 0.25rem de Bootstrap. */
  --sh-radius:       var(--custom-radius);
  --sh-radius-inner: calc(var(--custom-radius) - 1px);
  --sh-radius-sm:    0.5rem;
  --sh-radius-pill:  999px;

  /* --- 1.4 Elevations --------------------------------------------------
     Deux couches (contact net + diffusion douce) et surtout AUCUN decalage
     horizontal : le theme avait 4px 10px 9px 3px (menu deroulant) et
     2px 0 20px (barre collante), qui projetaient l'ombre de biais. */
  --sh-shadow-sm: 0 1px 2px rgba(16, 24, 40, .04), 0 2px 6px -2px rgba(16, 24, 40, .07);
  --sh-shadow-md: 0 2px 4px -2px rgba(16, 24, 40, .06), 0 12px 28px -10px rgba(16, 24, 40, .14);

  /* --- 1.5 Surfaces, filets, texte secondaire -------------------------- */
  --sh-muted:          #5c6672;   /* 5.7:1 sur blanc — remplace #6c757d (4.3:1) */
  --sh-divider:        var(--border-color);
  --sh-surface-subtle: #f7f8fa;
  --sh-row-hover:      #eef2fe;   /* survol de ligne, plus doux que #D1DCFE */
  --sh-tint:           #edf1fe;   /* fond d'accent leger */
  --sh-tint-fg:        var(--primary);
  --sh-surface-accent:  var(--primary-light);   /* usages « fond » de --primary-light */
  --sh-surface-success: var(--success-light);
  --sh-surface-danger:  var(--danger-light);

  /* --- 1.6 Interaction --------------------------------------------------
     Le theme n'expose AUCUN jeton d'etat : ni lien, ni focus, ni bordure de
     champ. On les nomme, chacun avec son pendant sombre (section 1.9). */
  --sh-link:          var(--primary);
  --sh-link-hover:    var(--primary-dark);
  --sh-focus:         var(--primary);
  --sh-focus-shadow:  rgba(28, 64, 242, .20);
  /* Bordure de champ au repos. La valeur est calibree sur le fond REEL des
     champs de la page de connexion et de l'inscription, qui n'est pas blanc
     mais --gray-light #f5f5f5 (hostim.css:1430) : #767f8c y donne 3.72:1
     (4.05:1 sur blanc), au-dessus du seuil de 3:1 de WCAG 1.4.11.
     --border-color (#e9eaec) donnait 1.20:1 : la limite du champ etait
     litteralement invisible. */
  --sh-input-border:  #767f8c;
  --sh-danger-text:   #d0311f;    /* 4.8:1 sur blanc. On NE redefinit PAS
                                     --danger (#FF4838), couleur de marque
                                     consommee par des fonds et des degrades :
                                     on ne corrige que les usages TEXTE. */
  --sh-danger-shadow: rgba(208, 49, 31, .22);

  /* --- 1.7 Pastilles de statut ------------------------------------------
     .label impose color:#fff (theme.css:9492). Les fonds Bootstrap 3 du
     theme donnaient 1.95:1 (.status-suspended), 2.48:1 (.status-active,
     .status-paid), 3.13:1 (.status-closed) — sous le seuil AA sur les
     statuts les plus frequents des listes de services et de factures.
     Meme semantique de teinte, luminosite abaissee. Ces valeurs sont
     identiques en clair et en sombre (le texte blanc y garde 5:1 et plus),
     a l'exception de --sh-st-ink, trop proche du fond sombre : la FORME de
     la pastille y disparaissait (voir section 1.9). */
  --sh-st-green:  #15803d;   /* 5.02:1 */
  --sh-st-amber:  #b45309;   /* 5.02:1 */
  --sh-st-red:    #c0392b;   /* 5.44:1 */
  --sh-st-slate:  #5a6672;   /* 5.87:1 */
  --sh-st-teal:   #0e7490;   /* 5.36:1 */
  --sh-st-purple: #6d28d9;   /* 7.10:1 */
  --sh-st-orange: #b94c00;   /* 5.13:1 */
  --sh-st-blue:   #1d4ed8;   /* 6.70:1 */
  --sh-st-ink:    #1f2937;   /* 14.7:1 */

  /* --- 1.8 Alertes -------------------------------------------------------
     Palettes Bootstrap 4 en dur, sans AUCUNE regle en mode sombre : un fond
     pastel #d1ecf1 subsistait tel quel sur une page --dark. On tokenise
     fond / texte / filet d'accent pour les 5 types reellement emis par
     includes/alert.tpl (info, success, warning, danger/error, secondary).
     .alert-primary n'est utilise nulle part : non traite. */
  --sh-al-info-bg: #eaf4fb;  --sh-al-info-fg: #0b4a63;  --sh-al-info-ac: #0e7490;
  --sh-al-succ-bg: #eaf7ee;  --sh-al-succ-fg: #12603a;  --sh-al-succ-ac: #15803d;
  --sh-al-warn-bg: #fdf5e3;  --sh-al-warn-fg: #7a4a06;  --sh-al-warn-ac: #b45309;
  --sh-al-dang-bg: #fdecea;  --sh-al-dang-fg: #8a2620;  --sh-al-dang-ac: #c0392b;
  --sh-al-seco-bg: #f3f5f7;  --sh-al-seco-fg: #3f4a57;  --sh-al-seco-ac: #5a6672;
}


/* --- 1.9 Pendants sombres --------------------------------------------------
   NOTE : variables.css:10 declare --worning (faute de frappe) alors que
   hostim.css:676 lit var(--warning). On ne « repare » PAS ce nom ici :
   publier --warning ecraserait le --warning de Bootstrap (theme.css:32),
   qui sert de border-color a .form-control.is-warning (etat de validation
   WHMCS) et degraderait ce contraste. L'unique consommateur de var(--warning)
   dans le theme est .tt-hero-two h1 mark, sur la page d'accueil publique qui
   n'est pas servie par ce portail : le statu quo est sans consequence.
   -------------------------------------------------------------------------- */
:root[data-bs-theme="dark"] {

  /* Le texte courant etait nettement moins lisible en sombre qu'en clair
     pour le meme contenu : #94a3b8 sur --dark = 6.96:1, contre 10.37:1 en
     clair. #cbd5e1 retablit la parite (12.0:1 sur --dark, 9.9:1 sur les
     cartes --gray-light). Un seul jeton remonte d'un coup la lisibilite des
     tableaux, des menus deroulants et des champs. */
  --body-color: #cbd5e1;

  --sh-shadow-sm: 0 1px 2px rgba(0, 0, 0, .40), 0 2px 8px -2px rgba(0, 0, 0, .50);
  --sh-shadow-md: 0 2px 4px -2px rgba(0, 0, 0, .45), 0 14px 32px -10px rgba(0, 0, 0, .60);

  --sh-muted:          #94a3b8;
  --sh-divider:        var(--gray);          /* #334155 : --border-color vaut
                                                #64748b en sombre, trop clair
                                                pour un filet. */
  --sh-surface-subtle: var(--gray-light);
  --sh-row-hover:      #2b3950;
  --sh-tint:           #1b2a63;
  --sh-tint-fg:        #93aafd;

  /* --primary-light (#D1DCFE) est IDENTIQUE en clair et en sombre alors
     qu'il sert a la fois de FOND (.bg-primary-light, .sidebar .card-header)
     et de TEXTE clair sur bleu nuit (.tt-footer-menu a). On ne peut donc pas
     le basculer : --sh-surface-accent porte les seuls usages « fond ». */
  --sh-surface-accent:  #1b2c5c;
  --sh-surface-success: #12291a;
  --sh-surface-danger:  #341613;

  /* hostim.css:15 pose a{color:var(--primary)} et --primary reste #1C40F2 en
     sombre : 2.61:1 sur le fond de page, 2.14:1 sur une carte. C'est le
     defaut de contraste le plus grave du theme. On ne touche pas a --primary
     lui-meme (il sert de FOND a .btn-primary avec du texte blanc, 6.85:1). */
  --sh-link:          #7d9bff;   /* 6.80:1 sur --dark, 5.58:1 sur les cartes */
  --sh-link-hover:    #a8beff;
  --sh-focus:         #7d9bff;
  --sh-focus-shadow:  rgba(125, 155, 255, .28);
  --sh-input-border:  #64748b;   /* 3.07:1 sur le fond du champ */
  --sh-danger-text:   #ff8a7e;   /* 6.40:1 sur les cartes */
  --sh-danger-shadow: rgba(255, 138, 126, .25);

  /* Seule teinte de statut qui ne survit pas au fond sombre : #1f2937 sur
     --dark (#0f172a) = 1.22:1, la pastille n'avait plus de contour. */
  --sh-st-ink:    #475569;

  --sh-al-info-bg: #102a34;  --sh-al-info-fg: #a8dcec;  --sh-al-info-ac: #2fa8cc;
  --sh-al-succ-bg: #12291d;  --sh-al-succ-fg: #b5e6c6;  --sh-al-succ-ac: #3aa564;
  --sh-al-warn-bg: #2e2411;  --sh-al-warn-fg: #f3d79b;  --sh-al-warn-ac: #c98a1e;
  --sh-al-dang-bg: #2e1614;  --sh-al-dang-fg: #f5b8b2;  --sh-al-dang-ac: #d0483a;
  --sh-al-seco-bg: #1b2431;  --sh-al-seco-fg: #c6cfda;  --sh-al-seco-ac: #64748b;
}


/* ==========================================================================
   2. BASE TYPOGRAPHIQUE
   ========================================================================== */

/* --- 2.1 Le correctif structurant -----------------------------------------
   hostim.css:5-7 declare « font-size: 0.9rem; line-height: 1.65rem ».
   L'interligne est en unite ABSOLUE : il est herite tel quel par tout le
   document. Un texte a 11px se retrouve donc avec 26,4px de plomb (ratio
   2,4) et une cellule a 13px avec 26,4px aussi. C'est la cause racine du
   rythme vertical flottant partout ailleurs. Une seule regle repare les
   badges, les cycles de facturation, les cellules et les mentions legales.
   0.9rem = 14,4px (sous-pixel, rendu flou) devient 15px pile : +4%, aucun
   risque de reflow, et le corps se cale enfin sous h6 dans l'echelle.

   AUCUN EFFET SUR LES BOITES DES CONTROLES : verifie dans theme.min.css,
   Bootstrap declare explicitement line-height:1.5 sur .btn, .form-control
   ET .custom-select, et ces trois regles fixent aussi leur font-size (14px
   via hostim.css:130/132). Les boutons et les champs n'heritent donc ni de
   la taille ni de l'interligne du body : leur hauteur ne bouge pas d'un
   pixel, y compris sur cart.php et /login.
   -------------------------------------------------------------------------- */
html body {
  font-size: var(--tt-fs-body);
  line-height: var(--tt-lh-base);
}

/* Pied de page aligne sur le cran 14px, comme ses propres liens de menu
   (hostim.css:1009 fixe deja .tt-footer-menu li a a 14px). */
html body footer.footer {
  font-size: var(--tt-fs-label);
}

/* --- 2.2 Hierarchie des titres --------------------------------------------
   theme.css:362-367 applique line-height:1.2 et margin-bottom:0.5rem a TOUS
   les niveaux. A 40px, 8px de marge basse ne separe rien ; a 16px, 1.2 est
   trop serre des que le titre passe sur deux lignes.
   Les TAILLES restent inchangees : elles forment deja un ratio 1.2 correct,
   et retrecir des titres deja en production serait une regression.
   -------------------------------------------------------------------------- */
h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 {
  line-height: var(--tt-lh-snug);
  margin-bottom: 0.45em;          /* em : le rythme suit la taille du titre */
}
h1, .h1, h2, .h2 {
  line-height: var(--tt-lh-tight);
  letter-spacing: -0.015em;       /* correction optique aux grands corps */
}
h3, .h3, h4, .h4 {
  letter-spacing: -0.01em;
}
/* h6 a 16px/500 ne se detachait plus d'un corps a 15px/400 (ecart 1,07x).
   700 est un poids reellement charge pour Roboto (variables.css importe
   400;500;700) ; 600 serait synthetise. */
h6, .h6 {
  font-weight: 700;
}

/* --- 2.3 Titres de page et de section -------------------------------------
   hostim.css:168-174 ramene .primary-content .card-title a 18px, aussi bien
   pour un titre de PAGE que pour un titre de SECTION dans une carte : la
   hierarchie s'effondre a 18px contre 15px de corps.
   PORTEE REELLE de la premiere regle : le seul gabarit qui emette un
   h2.card-title en enfant DIRECT de .primary-content est announcements.tpl:1
   (configuressl-stepone/steptwo placent le leur dans un .card-body, ils ne
   sont donc pas atteints). Les autres titres de page sont des h3.card-title,
   volontairement laisses a 18px : les elargir n'a pas pu etre valide sur un
   rendu authentifie.
   -------------------------------------------------------------------------- */
html body .primary-content > h2.card-title {
  font-size: var(--tt-fs-title);   /* 24px : palier net au-dessus du corps */
  line-height: 1.25;
  letter-spacing: -0.01em;
  margin: 0 0 var(--sp-5) 0;
}
/* Titre de section dans une carte : taille conservee (18px), on ne corrige
   que l'interligne (herite a 1.2) et la marge. */
html body .primary-content .card-body > .card-title,
html body .primary-content .card-header .card-title {
  line-height: var(--tt-lh-snug);
  margin: 0 0 var(--sp-4) 0;
}

/* --- 2.4 Banniere de page --------------------------------------------------
   Le <h1> est neutralise dans le markup par la classe utilitaire .h3 (28px) :
   on la surclasse par specificite (0,1,2 contre 0,1,0), sans modifier le
   .tpl. La section porte py-5, la place existe. Le fil d'Ariane est en
   position:absolute (hostim.css:614) : il ne bouge pas.
   Le sous-titre n'avait aucune taille propre — il passait pour du corps de
   texte perdu sur le degrade.
   -------------------------------------------------------------------------- */
html body .tt-page-header-info h1 {
  font-size: var(--tt-fs-banner);
  line-height: var(--tt-lh-tight);
  letter-spacing: -0.015em;
}
html body .tt-page-header-info p {
  font-size: var(--tt-fs-lead);
  line-height: 1.5;
  max-width: 52ch;
  margin-bottom: 0;
}

/* --- 2.5 Textes secondaires ------------------------------------------------ */

/* hostim.css:24 met .small/small a 90% (13,5px sous-pixel) sans interligne. */
html body small,
html body .small {
  font-size: var(--tt-fs-meta);
  line-height: var(--tt-lh-snug);
}

/* .text-sm est UTILISE dans le markup (knowledgebasearticle.tpl:24 — seule
   occurrence du token autonome ; text-sm-left / text-sm-right et
   info-text-sm sont des classes DIFFERENTES, non ciblees) mais n'est defini
   NULLE PART : seules les variantes responsive existent. La meta s'affichait
   donc a la taille du corps. Regle purement additive. */
html body .text-sm {
  font-size: var(--tt-fs-meta);
  line-height: var(--tt-lh-snug);
}

/* .lead : 20px en graisse 300, tres date et peu contraste (theme.css:393).
   Poids 300 non charge pour Open Sans via variables.css. */
html body .lead {
  font-size: var(--tt-fs-lead);
  font-weight: 400;
  line-height: var(--tt-lh-prose);
}

/* --- 2.6 Texte de lecture : longueur de ligne et rythme --------------------
   .tt-new-content (viewannouncement.tpl:25) et les <article>
   (announcements.tpl:25, knowledgebasearticle.tpl:29) n'ont aucun style
   typographique : sur une colonne de 800 a 1100px, cela donne 110 a 150
   caracteres par ligne, plus du double de la longueur confortable.
   IMPORTANT : la contrainte de largeur est posee sur les PARAGRAPHES, pas
   sur le conteneur — tableaux, images et blocs de code gardent toute la
   largeur disponible, et rien n'est sorti du flux.
   -------------------------------------------------------------------------- */
html body .tt-new-content,
html body .tt-news-wrap .tt-news-single article,
html body .primary-content .card-body > article {
  line-height: var(--tt-lh-prose);
}
html body .tt-new-content p,
html body .tt-new-content ul,
html body .tt-new-content ol,
html body .tt-news-wrap .tt-news-single article p,
html body .primary-content .card-body > article p,
html body .primary-content .card-body > article ul,
html body .primary-content .card-body > article ol {
  max-width: 68ch;
  margin-bottom: 1.15em;
}
/* theme.css:83 impose margin-top:0 a tous les titres : dans un article, un
   sous-titre se retrouve colle au paragraphe precedent. */
html body .tt-new-content h2,
html body .tt-new-content h3,
html body .tt-new-content h4,
html body .tt-new-content h5,
html body .primary-content .card-body > article h2,
html body .primary-content .card-body > article h3,
html body .primary-content .card-body > article h4,
html body .primary-content .card-body > article h5 {
  margin-top: 1.6em;
}
html body .tt-new-content > :first-child,
html body .primary-content .card-body > article > :first-child {
  margin-top: 0;
}
html body .tt-new-content > :last-child,
html body .tt-news-wrap .tt-news-single article > :last-child,
html body .primary-content .card-body > article > :last-child {
  margin-bottom: 0;
}

/* --- 2.7 Texte secondaire : couleur ---------------------------------------
   .text-muted vaut #6c757d, sans equivalent sombre : 3.81:1 sur le fond de
   page sombre (echec AA) et 4.30:1 en clair des qu'il est pose sur
   --gray-light. 14 occurrences dans le HTML rendu, dont l'accroche et
   « Forgot Password ? » de /login et les cycles de facturation du panier.
   !important assume : Bootstrap ecrit .text-muted{color:#6c757d!important},
   qu'aucune specificite ne peut battre.
   -------------------------------------------------------------------------- */
html body .text-muted {
  color: var(--sh-muted) !important;
}
html body .form-control::placeholder {
  color: var(--sh-muted);
  opacity: 1;
}


/* ==========================================================================
   3. MISE EN PAGE ET ESPACEMENT
   ========================================================================== */

/* --- 3.1 Rythme vertical du corps de page ---------------------------------
   hostim.css:650 -> section#main-body{padding:60px 0}. 64px pour rester sur
   l'echelle. .tt-auth-wrap est exclu (traite en 3.6). Specificite (1,1,1) >
   (1,0,1). La page d'accueil garde son .ptb-100, declare en !important par
   hostim.css:55.

   MOBILE — CONTRAINTE IMPERATIVE : .tt-breadcrumb est en position:absolute
   avec bottom:-48px, ancre sur .tt-page-header (hostim.css:610-620) : il
   DEBORDE de 48px A L'INTERIEUR de #main-body, et aucune media query du
   theme ne le repositionne. Le padding-top de #main-body est donc la seule
   garde qui empeche le fil d'Ariane de chevaucher le contenu. On ne descend
   JAMAIS ce padding-top sous 48px : seul le padding-bas est reduit en
   mobile. (Concerne announcements, knowledgebase, contact ET cart.php.)
   -------------------------------------------------------------------------- */
section#main-body:not(.tt-auth-wrap) {
  padding-top: var(--sh-section-y);
  padding-bottom: var(--sh-section-y);
}
@media (max-width: 767.98px) {
  section#main-body:not(.tt-auth-wrap) {
    padding-top: 3.75rem;          /* 60px, valeur d'origine : >= 48px       */
    padding-bottom: var(--sp-6);   /* 32px : l'aeration mobile visee en bas  */
  }
}

/* --- 3.2 Alignement du contenu sans barre laterale -------------------------
   header.tpl:32 : quand il n'y a pas de sidebar, le markup est
   .container > .col-12.primary-content, SANS .row parent (verifie dans
   cart.php.html, contact.php.html, cart.php_a_view.html). Le padding de 15px
   de la colonne n'est donc annule par aucune marge negative et s'ajoute aux
   15px du conteneur : le bord du contenu saute de 15px quand on navigue
   entre une page a sidebar et une page sans.
   Specificite (1,2,0) : gagne meme sur cart.php.
   Sous 576px on restitue la gouttiere : l'alignement inter-pages n'y a plus
   d'interet et le tunnel de commande ne doit pas se rapprocher du bord.
   -------------------------------------------------------------------------- */
#main-body > .container > .primary-content.col-12 {
  padding-left: 0;
  padding-right: 0;
}
@media (max-width: 575.98px) {
  #main-body > .container > .primary-content.col-12 {
    padding-left: 15px;
    padding-right: 15px;
  }
}

/* --- 3.3 Rythme des cartes de contenu -------------------------------------
   hostim.css:1661 -> margin-bottom:20px, seule valeur hors echelle du flux
   principal.
   -------------------------------------------------------------------------- */
.primary-content .card {
  margin-bottom: var(--sp-5);
}

/* --- 3.4 Largeur de conteneur sur grand ecran -----------------------------
   Bootstrap 4.5 s'arrete a 1140px et n'a pas de palier xxl : sur un 1440p,
   les tableaux de l'espace client se compriment pour rien. Palier modere
   (+140px), applique uniformement a l'en-tete, au corps et au pied — rien ne
   se desaligne. Rien ne change sous 1400px. Le tunnel de commande ne
   redefinit pas .container (verifie par grep sur all.min.css).
   -------------------------------------------------------------------------- */
@media (min-width: 1400px) {
  .container { max-width: 1280px; }
}

/* --- 3.5 Page contact : padding vertical en double -------------------------
   contact.tpl:3 pose .ptb-60 sur le formulaire alors que #main-body applique
   deja son propre rythme : 120px de vide au-dessus du premier champ.
   !important INEVITABLE : hostim.css:58 declare .ptb-60 en !important.
   Portee la plus etroite possible.
   -------------------------------------------------------------------------- */
html body section#main-body .tt-contact-form.ptb-60 {
  padding-top: 0 !important;
  padding-bottom: 0 !important;
}
/* Les 60px du bas servaient accidentellement de separateur quand les deux
   colonnes col-lg-6 s'empilent : on le remplace par une marge explicite. */
@media (max-width: 991.98px) {
  #main-body .tt-contact-form { margin-bottom: var(--sp-7); }
}
/* Sous 768px, « Nom » et « Email » (col-12 col-md-6) s'empilent et se
   touchent : .form-group ne pose sa marge que sur la ligne, pas sur les
   colonnes. Volontairement limite a .tt-contact-form : ailleurs le motif
   form-group.row est « label + champ », ou une marge serait une regression. */
@media (max-width: 767.98px) {
  .tt-contact-form .form-group.row > [class*="col-"] + [class*="col-"] {
    margin-top: var(--sp-4);
  }
}

/* --- 3.6 Page de connexion : hauteur -------------------------------------
   ZONE CRITIQUE — intervention volontairement minimale.
   hostim.css:1379 -> .tt-auth-wrap{min-height:100vh !important}, alors que
   l'en-tete (~120px) et le pied de page complet s'ajoutent au-dessus et en
   dessous (footer.tpl emet <footer> hors du {if} d'exclusion). La page fait
   donc toujours 100vh + en-tete + pied : defilement garanti, formulaire pas
   reellement centre. On retranche l'allocation d'en-tete ; le centrage, le
   fond et la composition sont inchanges.
   !important obligatoire (la regle source l'utilise).
   -------------------------------------------------------------------------- */
html body section#main-body.tt-auth-wrap {
  min-height: calc(100vh - 8rem) !important;
  padding-top: var(--sp-7);
  padding-bottom: var(--sp-7);
}
/* Le panneau conservait 50px de padding interieur jusqu'a 480px, ce qui
   ampute une largeur de 360px de 100px. hostim.css:1416 a la meme
   specificite, mais custom.css est charge apres : pas de !important. */
@media (max-width: 767.98px) {
  .tt-form-wrap .tt-form-container .tt-form-content {
    padding: var(--sp-6);
  }
}

/* --- 3.7 Tuiles du tableau de bord client ---------------------------------
   clientareahome.tpl:2 -> 4 tuiles col-6 col-xl-3. Sous 1200px elles forment
   deux lignes de deux SANS gouttiere verticale : les bordures (hostim.css:
   1606, 1px dashed !important) se collent. La .row etire deja les colonnes a
   hauteur egale, mais la tuile ne remplissait pas sa colonne.
   -------------------------------------------------------------------------- */
.tiles .row > [class*="col-"] > .tile {
  height: 100%;
}
@media (max-width: 1199.98px) {
  /* marge negative sur la ligne : la gouttiere ne gonfle pas l'espace sous
     le bloc, le .mb-4 du template reste seul actif */
  .tiles .row { margin-bottom: calc(var(--sp-4) * -1); }
  .tiles .row > [class*="col-"] { margin-bottom: var(--sp-4); }
}

/* --- 3.8 Pied de page : widgets -------------------------------------------
   footer.tpl -> 4x .col-lg-3.col-md-6 > .tt-footer-widget. La classe
   .tt-footer-widget n'est definie NULLE PART (verifie par grep sur
   hostim.css et theme.css) : aucune marge basse, donc les widgets se
   chevauchent des qu'ils passent a la ligne (2x2 entre 768 et 991px).
   -------------------------------------------------------------------------- */
@media (max-width: 991.98px) {
  .tt-footer-top .tt-footer-widget { margin-bottom: var(--sp-6); }
  .tt-footer-top .row > [class*="col-"]:last-child .tt-footer-widget { margin-bottom: 0; }
  /* empiles, copyright et selecteur de langue se touchaient */
  .tt-footer-bottom .row > .col-lg-4 { margin-top: var(--sp-2); }
}
/* Le pied porte .ptb-60 : 60px haut/bas meme sur un telephone, au-dessus
   d'un empilement deja long. !important assume, meme raison qu'en 3.5. */
@media (max-width: 767.98px) {
  html body .footer.tt-footer .tt-footer-top.ptb-60 {
    padding-top: var(--sp-6) !important;
    padding-bottom: var(--sp-6) !important;
  }
}

/* --- 3.9 Tunnel de commande : espacement en tablette -----------------------
   ZONE CRITIQUE — une seule marge, aucun changement de flux.
   Sous 992px la feuille du tunnel passe .secondary-cart-body en pleine
   largeur et fait descendre .secondary-cart-sidebar dessous, mais
   .order-summary n'a qu'une marge basse : le recapitulatif colle a la liste
   des articles. « html body » -> (1,1,2) contre (1,1,0) : l'ordre de
   chargement (all.min.css apres custom.css) devient sans effet.
   -------------------------------------------------------------------------- */
@media (max-width: 991.98px) {
  html body #order-standard_cart .secondary-cart-sidebar {
    margin-top: var(--sp-5);
  }
}


/* ==========================================================================
   4. CARTES
   ========================================================================== */

/* theme.css:4133 impose border-radius:0.25rem a .card alors que
   --custom-radius (.75rem) est bien utilise ailleurs dans le theme, et
   theme.css:4123 ne pose aucune ombre. */
.card {
  border-radius: var(--sh-radius);
  box-shadow: var(--sh-shadow-sm);
}
/* Les coins internes doivent suivre le nouveau rayon, sinon l'en-tete colore
   et la derniere ligne de liste debordent des angles arrondis. Le
   combinateur enfant suffit a passer devant Bootstrap. */
.card > .card-header:first-child {
  border-radius: var(--sh-radius-inner) var(--sh-radius-inner) 0 0;
}
.card > .card-footer:last-child {
  border-radius: 0 0 var(--sh-radius-inner) var(--sh-radius-inner);
}
/* Deux variantes de markup coexistent pour la sidebar :
   announcements.html -> .collapsable-card-body > .list-group
   cart.php_a_view.html -> .list-group.collapsable-card-body */
.card > .collapsable-card-body > .list-group > .list-group-item:last-child,
.card > .list-group.collapsable-card-body > .list-group-item:last-child {
  border-bottom-left-radius: var(--sh-radius-inner);
  border-bottom-right-radius: var(--sh-radius-inner);
}

/* theme.css:4185 peint l'en-tete en rgba(0,0,0,.03) / rgba(0,0,0,.125),
   valeurs en dur sans equivalent sombre. Specificite laissee volontairement
   a (0,1,0) : .sidebar .card-header (hostim.css:1102, --primary-light) garde
   ainsi la priorite et l'identite du theme en clair ne bouge pas.
   Le filet bas est SEPARE et reserve aux en-tetes reellement neutres : les
   variantes du theme (.card-sidebar, .panel) reglent leur bordure elles-
   memes et ne doivent pas heriter d'un trait gris supplementaire. */
.card-header {
  background-color: var(--sh-surface-subtle);
  padding: 0.875rem 1.25rem;
}
.card:not(.card-sidebar):not(.panel) > .card-header {
  border-bottom: 1px solid var(--sh-divider);
}
.card-header .card-title {
  line-height: var(--tt-lh-snug);
}
/* Le chevron de repli doit se lire comme une commande, pas comme du decor.
   Opacite au repos calee a .75 : en sombre le chevron herite de --sh-link,
   et .55 le faisait tomber a 2.71:1 — sous le seuil de 3:1 exige d'un
   indicateur d'etat (c'est le seul temoin plie/deplie). */
.card-header .card-minimise {
  font-size: var(--tt-fs-micro);
  opacity: .75;
  transition: opacity .2s ease-in-out;
}
.card-header:hover .card-minimise {
  opacity: 1;
}

/* hostim.css:1090 : ombre a une seule couche sur la carte de sidebar. */
.card.card-sidebar {
  box-shadow: var(--sh-shadow-md);
}


/* ==========================================================================
   5. NAVIGATION
   ========================================================================== */

/* --- 5.1 Barre principale --------------------------------------------------
   hostim.css:217 ne prevoit qu'un changement de couleur au survol : aucun
   reperage de zone. Le soulignement n'a de sens que sur la barre horizontale :
   sous 1200px (navbar-expand-xl) le menu devient un offcanvas vertical ou
   hostim.css:404 passe les liens en display:block.
   On utilise ::before : ::after est deja pris par le caret de
   .dropdown-toggle. Le parent a deja position:relative (hostim.css:208).
   -------------------------------------------------------------------------- */
@media (min-width: 1200px) {
  .tt-header .tt-main-header ul#nav > li > a.pr-4 {
    font-weight: 500;
  }
  .tt-header .tt-main-header ul#nav > li > a.pr-4::before {
    content: "";
    position: absolute;
    left: 0;
    right: 1rem;                /* s'arrete avant le padding de .pr-4 */
    bottom: -0.4rem;
    height: 2px;
    border-radius: 2px;
    background-color: var(--sh-link);
    transform: scaleX(0);
    transform-origin: left center;
    transition: transform .22s ease-in-out;
  }
  .tt-header .tt-main-header ul#nav > li > a.pr-4:hover::before,
  .tt-header .tt-main-header ul#nav > li > a.pr-4:focus::before,
  .tt-header .tt-main-header ul#nav > li.show > a.pr-4::before {
    transform: scaleX(1);
  }

  /* Ombre recentree et respiration. Cadre dans la media query car
     hostim.css:398 met volontairement box-shadow:none en offcanvas.
     Le mega-menu Store garde son padding de 15px (regle a ID, plus
     specifique) : la coherence est conservee. */
  html body .tt-main-header .dropdown-menu {
    box-shadow: var(--sh-shadow-md);
    border-color: var(--sh-divider);
    padding: var(--sp-2);
  }
  html body .tt-main-header .dropdown-menu li.dropdown-item {
    padding: 0.45rem 1rem;      /* horizontal inchange : le chevron ::before
                                   du mega-menu est a left:-10px */
    border-radius: var(--sh-radius-sm);
  }
}

/* Retablit un survol lisible, annule par hostim.css:237
   (background-color:transparent). La couleur de texte du theme est en
   !important : on ne la touche pas, seul le fond est repris. */
html body .tt-main-header .dropdown-menu li.dropdown-item {
  transition: background-color .15s ease-in-out;
}
html body .tt-main-header .dropdown-menu li.dropdown-item:hover,
html body .tt-main-header .dropdown-menu li.dropdown-item:focus-within {
  background-color: var(--sh-row-hover);
}
html body .tt-main-header .dropdown-menu .dropdown-divider {
  border-top-color: var(--sh-divider);
  margin: 0.375rem 0.25rem;
}

/* Barre collante : l'ombre avait un offset horizontal de 2px et aucun offset
   vertical (hostim.css:200). */
html body .tt-header.affix {
  box-shadow: var(--sh-shadow-sm);
  border-bottom-color: var(--sh-divider);
}

/* Fil d'Ariane : rayon 4px isole (hostim.css:619), aligne sur le jeton. Le
   coin haut-gauche reste droit, .tt-triangle-right vient s'y appuyer en
   biseau (hostim.css:634). */
html body .tt-breadcrumb {
  border-radius: 0 var(--sh-radius) 0 0;
}
html body .tt-breadcrumb .breadcrumb-item + .breadcrumb-item::before {
  color: var(--sh-muted);
}

/* --- 5.2 Navigation laterale ----------------------------------------------
   hostim.css:1133 pose « border: 1px dashed » sur tous les .list-group-item,
   hostim.css:1121 remet le survol a transparent, et hostim.css:1115 ne donne
   a l'item courant qu'un filet gauche de 2px sur fond transparent : rien ne
   distingue une entree survolee d'une entree au repos.
   Le padding vertical reste a 0.75rem (valeur Bootstrap d'origine) : c'est
   la cible tactile la plus sollicitee de l'espace client, elle ne doit pas
   descendre sous ~44px de hauteur.
   -------------------------------------------------------------------------- */
html body .sidebar .list-group-item {
  border-style: solid;
  border-color: var(--sh-divider);
  border-left-width: 3px;        /* pose sur TOUS les items : l'etat actif ne
                                    decale plus le libelle d'un pixel */
  padding: 0.75rem 1rem 0.75rem 0.875rem;
  transition: background-color .2s ease-in-out, border-color .2s ease-in-out;
}
html body .sidebar .list-group-item-action:hover,
html body .sidebar .list-group-item-action:focus {
  background-color: var(--sh-row-hover);
}
html body .sidebar .list-group-item.active,
html body .sidebar .list-group-item.active:hover,
html body .sidebar .list-group-item.active:focus {
  background-color: var(--sh-tint);
  border-left-color: var(--sh-link);
  font-weight: 500;
}
/* Icones neutres au repos, primaires sur l'item courant ou survole : c'est
   la hierarchie qui manquait entre les entrees du menu. */
html body .sidebar .list-group-item .sidebar-menu-item-icon {
  color: var(--sh-muted);
  transition: color .2s ease-in-out;
}
html body .sidebar .list-group-item:hover .sidebar-menu-item-icon,
html body .sidebar .list-group-item.active .sidebar-menu-item-icon {
  color: var(--sh-link);
}
html body .sidebar .sidebar-menu-item-label {
  line-height: 1.45;
}

/* Compteur de la sidebar : theme.css:10432 lui donne un fond BLANC sur une
   carte blanche. Invisible. La largeur fixe de 28px devient un min-width,
   pour accepter deux chiffres. (Le pendant sombre, qui doit battre une regle
   a (0,4,0) en !important, est traite en section 8.2.) */
html body .sidebar .list-group-item .badge {
  width: auto;
  min-width: 1.75rem;
  background-color: var(--sh-tint);
  color: var(--sh-tint-fg);
}


/* ==========================================================================
   6. TABLEAUX, PASTILLES, BADGES, ALERTES, LISTE D'ANNONCES
   ========================================================================== */

/* --- 6.1 Tableaux ----------------------------------------------------------
   Deux systemes coexistent : les tableaux Bootstrap generiques, dont les
   en-tetes n'ont aucune distinction typographique declaree, et les tableaux
   DataTables .table-list (hostim.css:1219, 13px/500, border-bottom:0 — rien
   ne separe l'en-tete du corps).
   .dataTables_wrapper est genere au runtime par DataTables ; les tables
   concernees sont initialisees dans clientareainvoices/domains/quotes/
   emails/supportticketslist.tpl.
   -------------------------------------------------------------------------- */
html body .table th,
html body .table td {
  line-height: 1.5;     /* remplace les 26,4px herites, cf. section 2.1 */
}
/* En-tete generique. Open Sans charge bien un 600
   (assets/fonts/css/open-sans-family.css : 300/400/600). */
html body .table thead th {
  font-size: var(--tt-fs-meta);
  font-weight: 600;
  letter-spacing: 0.02em;
  line-height: 1.4;
  color: var(--sh-muted);
}
/* En-tete DataTables : famille Roboto, dont le 600 n'est PAS charge — on
   reste a 500 (pas de gras synthetique) et on cree la distinction par les
   capitales espacees et le filet bas retabli. 12px et non 11px : on ne
   descend pas sous le plancher de lisibilite. */
html body .dataTables_wrapper table.table-list thead th {
  font-size: var(--tt-fs-micro);
  letter-spacing: 0.05em;
  text-transform: uppercase;
  line-height: 1.4;
  color: var(--sh-muted);
  padding-top: var(--sp-3);
  padding-bottom: var(--sp-3);
  border-bottom: 1px solid var(--sh-divider);
  white-space: nowrap;
}
/* Corps : rythme plus aere, chiffres alignes en colonne, filets au jeton
   (ils etaient a #dee2e6 en dur, theme.css:1480). */
html body table.table-list > tbody > tr > td {
  padding-top: 0.8125rem;
  padding-bottom: 0.8125rem;
  line-height: 1.5;
  vertical-align: middle;
  border-top-color: var(--sh-divider);
  font-variant-numeric: tabular-nums;
}
/* hostim.css:1213 : 11px, line-height:initial et opacity:.9. Sous le plancher
   de lisibilite, colle a la ligne principale, et l'opacite ternit la couleur
   au lieu de la hierarchiser. */
html body table.table-list tbody td small {
  font-size: var(--tt-fs-micro);
  line-height: var(--tt-lh-snug);
  opacity: 1;
  color: var(--sh-muted);
  margin-top: 0.125rem;
}
/* Les lignes declenchent une navigation au clic (tr[onclick] dans
   clientareaproducts/invoices/domains/supportticketslist.tpl) mais aucun
   « cursor » n'existe dans le CSS du theme. L'attribut cible uniquement les
   lignes reellement cliquables : pas de fausse affordance ailleurs. */
html body .table-container table.table-list > tbody > tr[onclick] {
  cursor: pointer;
}
html body .table-list > tbody > tr:hover > td {
  background-color: var(--sh-row-hover);
}

/* --- 6.2 Pastilles de statut ----------------------------------------------
   theme.css:9486 met .label en « display:inline » : le padding vertical et
   le margin-bottom:5px declares n'ont AUCUN effet de mise en page, la
   pastille chevauche les lignes voisines dans une cellule.
   Le padding horizontal reste a .6em, identique a l'existant : .div-service-
   status .label est contraint a width:3rem avec ellipsis (theme.css:10721),
   on ne sur-tronque pas.
   -------------------------------------------------------------------------- */
html body .label {
  display: inline-block;
  padding: 0.3em 0.6em;
  line-height: 1.3;
  border-radius: var(--sh-radius-pill);
  font-weight: 500;              /* Roboto : 500 charge, 600 ne l'est pas */
  margin-bottom: 0;              /* le 5px etait deja inoperant en inline */
  vertical-align: middle;
}
/* L'agrandissement est reserve aux tableaux : ailleurs la pastille est
   enfermee dans une largeur fixe de 3rem. */
html body table.table-list .label.status {
  font-size: var(--tt-fs-micro);
  letter-spacing: 0.02em;
}

html body .status-active,
html body .status-open,
html body .status-completed,
html body .status-paid,
html body .status-accepted             { background-color: var(--sh-st-green); }

html body .status-suspended,
html body .status-pending-transfer,
html body .status-refunded             { background-color: var(--sh-st-amber); }

html body .status-pending,
html body .status-unpaid,
html body .status-inprogress           { background-color: var(--sh-st-red); }

html body .status-closed,
html body .status-cancelled,
html body .status-terminated           { background-color: var(--sh-st-slate); }

html body .status-expired,
html body .status-transferred-away     { background-color: var(--sh-st-teal); }

html body .status-answered             { background-color: var(--sh-st-purple); }

html body .status-customer-reply,
html body .status-pending-registration,
html body .status-redemption,
html body .status-grace                { background-color: var(--sh-st-orange); }

html body .status-onhold,
html body .status-payment-pending,
html body .status-delivered            { background-color: var(--sh-st-blue); }

html body .status-fraud,
html body .status-collections,
html body .status-lost,
html body .status-dead                 { background-color: var(--sh-st-ink); }
/* .status-custom (supportticketslist.tpl:43) tire son fond d'un style inline :
   volontairement non cible, il conserve son fond arbitraire. */

/* --- 6.3 Badges ------------------------------------------------------------
   theme.css:4464 les met a 75% (11,25px sous-pixel) et hostim.css:36 leur
   retire leur graisse (700 -> 400) : des etiquettes minuscules et molles.
   On NE touche PAS a line-height:1 : .tt-featured-badge du tunnel a une
   hauteur fixe qu'un changement d'interligne deformerait, et .tt-cart-badge
   est un cercle cale sur son propre interligne.
   Le padding de hostim.css:36 (.35rem .5rem) est conserve.
   -------------------------------------------------------------------------- */
html body .badge {
  font-size: var(--tt-fs-micro);
  font-weight: 500;              /* Roboto */
  letter-spacing: 0.01em;
  border-radius: var(--sh-radius-pill);
}
/* Les filtres de TLD sont des badges-boutons (domain-pricing.tpl:44) : forme
   pilule, transition, et une hauteur de cible utilisable au doigt (elle
   n'etait que d'environ 23px). Ni la police ni la position ne changent. */
html body .tld-filters a.badge-secondary {
  display: inline-flex;
  align-items: center;
  min-height: 2.25rem;
  transition: background-color .15s ease-in-out, color .15s ease-in-out;
}

/* --- 6.4 Alertes -----------------------------------------------------------
   Palettes Bootstrap 4 par defaut, rayon hors jeton, et aucun pendant sombre.
   Le filet gauche de 3px permet de lire la severite sans dependre du seul
   aplat de fond. includes/alert.tpl emet un <h2> pour $title et un <ul> pour
   $errorshtml. La regle « .alert a » couvre aussi .alert-link, utilise par 9
   gabarits dont deux du tunnel de commande.
   -------------------------------------------------------------------------- */
html body .alert {
  border-radius: var(--sh-radius);
  border-width: 1px;
  border-left-width: 3px;
  padding: 0.875rem 1.125rem;
  line-height: var(--tt-lh-base);
}
html body .alert h2 {
  font-size: 1rem;
  font-weight: 600;
  margin-bottom: 0.35rem;
  color: inherit;
}
html body .alert ul {
  margin-bottom: 0;
  padding-left: 1.15rem;
}
html body .alert a {
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 2px;
}

html body .alert-info {
  color: var(--sh-al-info-fg);
  background-color: var(--sh-al-info-bg);
  border-color: var(--sh-al-info-bg);
  border-left-color: var(--sh-al-info-ac);
}
html body .alert-success {
  color: var(--sh-al-succ-fg);
  background-color: var(--sh-al-succ-bg);
  border-color: var(--sh-al-succ-bg);
  border-left-color: var(--sh-al-succ-ac);
}
html body .alert-warning {
  color: var(--sh-al-warn-fg);
  background-color: var(--sh-al-warn-bg);
  border-color: var(--sh-al-warn-bg);
  border-left-color: var(--sh-al-warn-ac);
}
html body .alert-danger {
  color: var(--sh-al-dang-fg);
  background-color: var(--sh-al-dang-bg);
  border-color: var(--sh-al-dang-bg);
  border-left-color: var(--sh-al-dang-ac);
}
html body .alert-secondary {
  color: var(--sh-al-seco-fg);
  background-color: var(--sh-al-seco-bg);
  border-color: var(--sh-al-seco-bg);
  border-left-color: var(--sh-al-seco-ac);
}

/* --- 6.5 Liste des annonces ------------------------------------------------
   announcements.tpl:3 -> « announcements tt-news-wrap bg-white rounded mb-3 ».
   Le bloc principal de la page est donc fige a 4px par l'utilitaire .rounded,
   a angles quasi droits au milieu de cartes a .75rem.
   !important : .rounded de Bootstrap est lui-meme en !important. C'est
   exactement le motif deja employe par le theme dans .tt-rounded
   (hostim.css:83).
   PAS d'overflow:hidden ici : il rognerait l'anneau de focus clavier des
   liens d'annonce (section 7.4). Les coins sont portes par les enfants
   extremes, ce qui donne le meme rendu au survol sans rien couper.
   -------------------------------------------------------------------------- */
html body .tt-news-wrap {
  border-radius: var(--sh-radius) !important;
  border-color: var(--sh-divider);
  box-shadow: var(--sh-shadow-sm);
}
html body .tt-news-wrap .tt-news-single:first-of-type {
  border-top-left-radius: var(--sh-radius-inner);
  border-top-right-radius: var(--sh-radius-inner);
}
html body .tt-news-wrap .tt-news-single:last-of-type {
  border-bottom-left-radius: var(--sh-radius-inner);
  border-bottom-right-radius: var(--sh-radius-inner);
}
/* hostim.css:1152 met un filet gauche de 2px au survol : on l'aligne sur les
   3px de la sidebar pour un vocabulaire d'accent unique. */
html body .tt-news-wrap .tt-news-single,
html body .tt-news-wrap .tt-news-single:hover {
  border-left-width: 3px;
}
html body .tt-news-single:not(:last-of-type) {
  border-bottom-color: var(--sh-divider);
}
/* L'alerte « aucune annonce » est encastree dans .tt-news-wrap, qui lui
   retire deja sa bordure (hostim.css:1143) : on neutralise le filet d'accent
   et on aligne son rayon sur celui du bloc. */
html body .tt-news-wrap .alert {
  border-left-width: 0;
  border-radius: var(--sh-radius-inner);
}


/* ==========================================================================
   7. FORMULAIRES, BOUTONS ET CHAMPS DE SAISIE
   ========================================================================== */

/* --- 7.1 Libelles ----------------------------------------------------------
   Trois traitements coexistaient : Roboto 500 a taille heritee dans les
   conteneurs de hostim.css:1423, rien du tout sur .form-control-label
   (login.tpl:14) et .col-form-label (clientareadetails.tpl, user-profile.tpl),
   et 13px/300/#666 dans le tunnel (traite en 7.12).
   ATTENTION : la regle a ID du tunnel (all.css:94) ne declare NI font-family
   NI margin-bottom ; ces deux proprietes fuiraient donc jusqu'aux libelles
   du panier. Elles y sont explicitement remises a l'identique juste apres.
   -------------------------------------------------------------------------- */
html body .form-group > label:not(.form-check):not(.form-check-label):not(.checkbox-inline):not(.radio-inline),
html body .form-control-label,
html body .col-form-label {
  font-family: var(--font-family-monospace);
  font-size: var(--tt-fs-label);
  font-weight: 500;
  line-height: 1.4;
  color: var(--heading-color);
  margin-bottom: 0.375rem;
}
/* Sanctuarisation du tunnel : on restitue la famille heritee (Open Sans) et
   la marge basse Bootstrap d'origine (0.5rem). ZONE CRITIQUE : aucun
   deplacement de boite. */
html body #order-standard_cart .form-group > label {
  font-family: inherit;
  margin-bottom: 0.5rem;
}

/* --- 7.2 Bordure des champs au repos --------------------------------------
   En clair, --border-color (#e9eaec) donne 1.20:1 avec le blanc et 1.12:1
   avec le fond reel des champs de connexion (--gray-light #f5f5f5) : la
   limite du champ est invisible (WCAG 1.4.11 demande 3:1). En sombre,
   hostim.css:1963 impose au .form-control une bordure var(--gray-light),
   exactement la couleur de son propre fond : 1.00:1 (traite en 8.4).
   -------------------------------------------------------------------------- */
html body .form-control,
html body .custom-select,
html body .input-group-text,
html body .tt-form-content .input-group-text,
html body .tt-form-content .btn-reveal-pw,
html body .btn-default {
  border-color: var(--sh-input-border);
}

/* --- 7.3 Focus des champs --------------------------------------------------
   hostim.css:1434 repeint la bordure de focus du formulaire de connexion
   avec la couleur de REPOS : aucun retour visuel. theme.min.css a par
   ailleurs annule le box-shadow de focus, et theme.css:12140 impose
   box-shadow:none sur #registration.
   On passe par box-shadow, que le theme ne surcharge nulle part en
   !important. Les variantes a ID sont necessaires pour reprendre
   #registration et pour passer devant la feuille du tunnel.
   -------------------------------------------------------------------------- */
html body .form-control:focus,
html body .custom-select:focus,
html body .tt-form-content .form-group .form-control:focus,
html body #registration .form-control:focus,
html body #registration .field:focus,
html body #order-standard_cart .form-control:focus,
html body #order-standard_cart .field:focus {
  border-color: var(--sh-focus);
  box-shadow: 0 0 0 0.2rem var(--sh-focus-shadow);
  outline: 0;
}
/* Groupe « merge » du login : l'anneau entoure l'ensemble icone + champ +
   bouton oeil plutot que le seul champ, et on evite le double anneau. */
html body .input-group-merge {
  border-radius: 0.25rem;
  transition: box-shadow .15s ease-in-out;
}
html body .input-group-merge:focus-within {
  box-shadow: 0 0 0 0.2rem var(--sh-focus-shadow);
}
html body .input-group-merge:focus-within .input-group-text,
html body .input-group-merge:focus-within .btn-reveal-pw {
  border-color: var(--sh-focus);
}
html body .input-group-merge .form-control:focus {
  box-shadow: none;
}

/* --- 7.4 Focus clavier -----------------------------------------------------
   hostim.css:137 fait « .btn:focus{outline:none!important;box-shadow:none
   !important} » : AUCUN bouton du site n'est reperable au clavier, y compris
   « Se connecter » et « Commander » (38 occurrences de .btn-primary dans le
   HTML rendu). On ne retablit l'indicateur que sur :focus-visible, qui ne se
   declenche PAS au clic souris : zero changement visuel pour l'usage courant,
   et l'outline ne prend pas de place dans le flux.
   Les selecteurs de TYPE (select, textarea, [tabindex]) rendent la couverture
   independante du markup : un champ sans .form-control reste couvert.
   !important inevitable : on reprend un « outline:none !important ».
   -------------------------------------------------------------------------- */
html body .btn:focus-visible,
html body button:focus-visible,
html body a:focus-visible,
html body select:focus-visible,
html body textarea:focus-visible,
html body [tabindex]:not([tabindex="-1"]):focus-visible,
html body .form-control:focus-visible,
html body .custom-select:focus-visible,
html body .list-group-item-action:focus-visible,
html body .dropdown-item:focus-visible,
html body input[type="checkbox"]:focus-visible,
html body input[type="radio"]:focus-visible {
  outline: 2px solid var(--sh-focus) !important;
  outline-offset: 2px;
}
/* Le pied de page est peint en --primary-darker (#051074) par hostim.css:94 :
   un anneau --primary y tomberait a 2.30:1, c'est-a-dire invisible, alors
   qu'il est le SEUL indicateur de focus des 14 liens du pied. --primary-light
   donne 11.5:1 en clair et 10.8:1 en sombre : une seule declaration suffit.
   La longhand outline-color, plus specifique, passe devant le raccourci
   !important ci-dessus sans ajouter de !important. */
html body .footer.tt-footer a:focus-visible,
html body .footer.tt-footer button:focus-visible {
  outline-color: var(--primary-light);
}

/* --- 7.5 Case « Remember Me » de la page de connexion ----------------------
   login.tpl:50 place un .form-check-input dans un <label class="mb-0">
   DEPOURVU du conteneur .form-check attendu : Bootstrap (theme.css:1940) le
   passe en position:absolute avec margin-left:-1.25rem, il se decale de 20px
   vers la gauche et chevauche la zone du bouton Login.
   On le REMET dans le flux — l'inverse de l'interdit — et on rend tout le
   libelle cliquable (la zone de clic augmente).
   Portee limitee au SEUL libelle concerne, identifie par sa classe .mb-0 :
   les deux autres <label class="form-control-label"> du meme formulaire
   (Email, Mot de passe) ne sont pas atteints. La hauteur minimale de 44px
   reste inferieure a celle du bouton Login voisin : aucun decalage.
   -------------------------------------------------------------------------- */
html body .login-form label.mb-0:not(.form-check) > .form-check-input {
  position: static;
  margin: 0 0.5rem 0 0;
}
html body .login-form label.mb-0:not(.form-check) {
  display: inline-flex;
  align-items: center;
  min-height: 2.75rem;
  padding: 0.375rem 0;
  cursor: pointer;
}

/* --- 7.6 Coches et boutons radio natifs -----------------------------------
   Aucun accent-color dans le theme : CGV du checkout, choix du compte et du
   mode de paiement, CGV de l'inscription, « Remember Me ».
   accent-color ne fait que colorer le controle natif : aucune incidence sur
   sa taille, sa position ou sa zone de clic — indispensable sur le tunnel.
   -------------------------------------------------------------------------- */
html body input[type="checkbox"],
html body input[type="radio"] {
  accent-color: var(--sh-link);
}
html body input[type="checkbox"]:not([disabled]),
html body input[type="radio"]:not([disabled]) {
  cursor: pointer;
}

/* --- 7.7 Champ captcha, bouton « afficher le mot de passe », selects -------- */

/* hostim.css:1513 ecrase #inputCaptcha a 30px alors que la police et le
   padding herites de .form-control en demandent 47 : le texte saisi est
   rogne et le champ ne s'aligne pas avec l'image du captcha
   (login.tpl et contact.php). La hauteur ne fait qu'AUGMENTER.
   AUCUN letter-spacing ici : theme.css:10915 fige la largeur du champ a
   100px via un selecteur a deux ID (2,0,0) que l'on ne peut pas reprendre ;
   tout tracage supplementaire ferait defiler la saisie de 6 caracteres. */
html body #inputCaptcha.form-control {
  height: auto;
  min-height: 47px;
  padding: var(--sp-3) var(--sp-4);
}

/* .btn-reveal-pw n'a pas la classe .btn : les regles d'arrondi de groupe de
   Bootstrap (theme.css:3259) ne l'atteignent pas, d'ou des angles droits
   contre un champ arrondi, et il garde le padding par defaut du navigateur.
   Le padding augmente => cible de clic plus grande. */
html body .input-group > .input-group-append > .btn-reveal-pw {
  border-top-right-radius: 0.25rem;
  border-bottom-right-radius: 0.25rem;
  padding: 0 0.875rem;
  transition: background-color .15s ease-in-out, border-color .15s ease-in-out;
}

/* hostim.css:130 (.form-control{padding:.75rem 1rem}) est chargee apres
   theme.css:3404 et ecrase le padding-right de 1.75rem prevu par
   .custom-select : le texte des options longues passe SOUS le chevron
   (selects du panier). On restitue la gouttiere et on remplace le chevron
   4x5px d'origine. Seul background-image est redefini (longhand) : le fond
   blanc du raccourci de theme.css:3414 reste intact. */
html body .custom-select {
  padding-right: 2.5rem;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='none' stroke='%23404040' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round' d='M1.5 2 6 6.5 10.5 2'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 1rem center;
  background-size: 12px 8px;
}

/* --- 7.8 Etats des boutons -------------------------------------------------
   hostim.css:137 neutralise aussi le :active (aucun retour a l'appui) et
   theme.css:2239 laisse un bouton desactive a 0.65 d'opacite sans curseur
   d'interdiction — le bouton « Checkout » demarre desactive.
   Les toggles de menus deroulants sont exclus de la transformation : un
   transform creerait un bloc conteneur sous un menu ouvert.
   -------------------------------------------------------------------------- */
html body .btn:not(:disabled):not(.disabled):not(.dropdown-toggle):active {
  transform: translateY(1px);
}
html body .btn.disabled,
html body .btn:disabled {
  opacity: 0.6;
  cursor: not-allowed;
  transform: none;
}

/* --- 7.9 Etats d'erreur ----------------------------------------------------
   theme.css:9273 ne colore les champs en erreur que dans
   form[data-role=json-form] ; ailleurs (paiement carte et virement, moyens
   de paiement, store/ox) la classe .has-error est bien posee par le JS mais
   aucun champ ne rougit.
   Le message d'erreur est en 0.85em / #cc0000 en dur (theme.css:9418), plus
   petit que le corps et sans pendant sombre. Il est remonte a 14px : c'est
   le texte le plus critique d'un formulaire, il ne doit pas etre le plus
   petit. On ne touche PAS a « display » : il reste masque tant que la
   validation ne le declenche pas.
   -------------------------------------------------------------------------- */
html body .form-group.has-error .form-control,
html body .form-group.has-error .field,
html body .form-group.has-error .custom-select {
  border-color: var(--sh-danger-text);
}
html body .form-group.has-error .form-control:focus,
html body .form-group.has-error .field:focus,
html body .form-group.has-error .custom-select:focus {
  border-color: var(--sh-danger-text);
  box-shadow: 0 0 0 0.2rem var(--sh-danger-shadow);
}
html body .form-group .field-error-msg {
  font-size: var(--tt-fs-label);
  font-weight: 500;
  line-height: 1.45;
  color: var(--sh-danger-text);
  margin-top: 0.375rem;
}

/* --- 7.10 Texte rouge ------------------------------------------------------
   .text-danger de Bootstrap (#dc3545) : 4.53:1 sur blanc (limite) et 3.94:1
   sur le fond sombre. Utilise 4 fois dans cart.php?a=view.
   !important assume : .text-danger{color:#dc3545!important}.
   -------------------------------------------------------------------------- */
html body .text-danger {
  color: var(--sh-danger-text) !important;
}

/* --- 7.11 Remplissage automatique du navigateur ---------------------------
   Sans cela Chrome peint un fond jaune fixe sur les champs pre-remplis, qui
   ecrase le gris du formulaire et devient illisible en mode sombre.
   Cible sur .tt-form-content (login / inscription), dont le fond de champ est
   --gray-light (hostim.css:1430).
   -------------------------------------------------------------------------- */
html body .tt-form-content .form-control:-webkit-autofill,
html body .tt-form-content .form-control:-webkit-autofill:hover,
html body .tt-form-content .form-control:-webkit-autofill:focus {
  -webkit-box-shadow: 0 0 0 1000px var(--gray-light) inset;
  -webkit-text-fill-color: var(--body-color);
  caret-color: var(--body-color);
}

/* --- 7.12 Tunnel de commande : intervention minimale -----------------------
   ZONE CRITIQUE. On ne touche ici NI aux tailles NI aux boites : uniquement
   graisse, couleur et interligne.
   orderforms/themetags_cart/css/all.css:94 pose « font-weight:300; color:#666 »
   sur TOUS les libelles du tunnel : le texte le plus fonctionnel du site est
   le plus fantomatique, et #666 n'a aucun pendant sombre.
   Rappel : cette feuille est chargee APRES custom.css sur cart.php — c'est le
   prefixe « html body » (1,0,3 contre 1,0,1) qui rend la surcharge effective.
   -------------------------------------------------------------------------- */
html body #order-standard_cart label,
html body #order-standard_cart p.domain-renewal-desc {
  font-weight: 500;
  color: var(--body-color);
  line-height: 1.5;
}
/* Titres d'etape : taille CONSERVEE (22px / 30px, .font-size-22 /
   .font-size-30). On ne corrige que l'interligne et la marge, absents. */
html body #order-standard_cart .font-size-22 {
  line-height: 1.3;
  letter-spacing: -0.01em;
  margin-bottom: var(--sp-5);
}
html body #order-standard_cart .font-size-30 {
  line-height: 1.25;
  letter-spacing: -0.015em;
}
/* Descriptif produit : le contenu est structure par des <br /><br />, donc
   l'interligne pilote directement l'aeration de la fiche. */
html body #order-standard_cart .tt-product-desc {
  line-height: var(--tt-lh-prose);
}


/* ==========================================================================
   8. MODE SOMBRE — surcharges qui ne peuvent pas passer par un jeton
   Le theme pilote le sombre par data-bs-theme="dark" sur <html>. Toutes les
   regles ci-dessous ne concernent QUE le mode sombre ; le mode clair reste
   exactement tel qu'il est defini plus haut.
   ========================================================================== */

/* --- 8.1 Liens de contenu --------------------------------------------------
   hostim.css:15 pose a{color:var(--primary)}. En sombre --primary reste
   #1C40F2 sur un fond #0f172a : 2.61:1. On applique --sh-link au seul
   contenu (#main-body), en excluant .btn qui porte deja sa propre couleur.
   Specificite (1,2,2) : les surcharges qui suivent, a specificite egale ou
   superieure, reprennent la main.
   -------------------------------------------------------------------------- */
html[data-bs-theme="dark"] #main-body a:not(.btn) {
  color: var(--sh-link);
}
html[data-bs-theme="dark"] #main-body a:not(.btn):hover {
  color: var(--sh-link-hover);
}
/* Le texte d'une alerte porte deja sa propre couleur (section 6.4). */
html[data-bs-theme="dark"] #main-body .alert a {
  color: inherit;
}

/* Usages de --primary en couleur de TEXTE ou d'ICONE, tous poses sur --dark
   ou --gray-light en sombre, donc tous entre 2.1 et 2.6:1. */
html[data-bs-theme="dark"] body .tt-form-content .input-group-text i,
html[data-bs-theme="dark"] body .tt-form-content .btn-reveal-pw i,
html[data-bs-theme="dark"] body .sidebar .card-sidebar .card-header .card-title,
html[data-bs-theme="dark"] body .tiles .tile:hover i,
html[data-bs-theme="dark"] body .tiles .tile:hover .stat,
html[data-bs-theme="dark"] body .tt-header .tt-main-header ul li a:hover {
  color: var(--sh-link);
}

/* Ces declarations sont deja en !important dans hostim.css (l.121
   .text-primary, l.1121 .list-group-item-action, l.1912 le groupe du tunnel) :
   seul un !important peut les reprendre. En mode clair --sh-link vaut
   --primary : ces regles ne changent alors STRICTEMENT rien.
   Les items .active sont EXCLUS du survol : la ou Bootstrap leur donne un
   fond --primary, un texte bleu clair serait pire que le blanc qu'ils
   portent au repos ; et dans la sidebar leur fond est clair. On laisse donc
   l'etat actif tel que le theme le definit, sans le degrader. */
html body .text-primary,
html body .list-group-item-action:not(.active):focus,
html body .list-group-item-action:not(.active):hover {
  color: var(--sh-link) !important;
}
html[data-bs-theme="dark"] body #order-standard_cart .cart-sidebar .list-group-item.active,
html[data-bs-theme="dark"] body #order-standard_cart .cart-sidebar .list-group-item.active:focus,
html[data-bs-theme="dark"] body #order-standard_cart .cart-sidebar .list-group-item.active:hover,
html[data-bs-theme="dark"] body .list-group-item.kb-article-item:hover {
  color: var(--sh-link) !important;
}
/* hostim.css:1858 pose « border-color: var(--dark) !important » sur tous les
   .sidebar .list-group-item, ce qui EFFACE au passage le filet gauche qui
   signale la page courante du menu client. */
html[data-bs-theme="dark"] body .sidebar .list-group-item.active,
html[data-bs-theme="dark"] body .sidebar .list-group-item.active:hover,
html[data-bs-theme="dark"] body .sidebar .list-group-item.active:focus {
  border-left-color: var(--sh-link) !important;
}

/* --- 8.2 Surfaces teintees -------------------------------------------------
   Les fonds pales (--primary-light #D1DCFE, --success-light, --danger-light)
   traversent le mode sombre sans etre adaptes, et le texte qui les surmonte
   herite de --body-color : illisible.
   Le PREMIER PLAN est fourni en meme temps que le fond : .bg-success-light et
   .bg-danger-light sont poses sur des BOUTONS (knowledgebasearticle.tpl:39 et
   43, « Cet article vous a-t-il ete utile ? »), et theme.css:2212 fixe
   .btn{color:#212529} en dur — sans cette declaration, les libelles Oui/Non
   tomberaient a 1,2:1 sur le nouveau fond sombre. Specificite (0,2,2) : passe
   devant .btn sans !important, et reste sous la regle a ID des liens
   .tt-support-item de la section 8.1.
   -------------------------------------------------------------------------- */
html[data-bs-theme="dark"] body .bg-primary-light,
html[data-bs-theme="dark"] body .bg-success-light,
html[data-bs-theme="dark"] body .bg-danger-light {
  color: var(--body-color);
}
html[data-bs-theme="dark"] body .bg-primary-light { background-color: var(--sh-surface-accent); }
html[data-bs-theme="dark"] body .bg-success-light { background-color: var(--sh-surface-success); }
html[data-bs-theme="dark"] body .bg-danger-light  { background-color: var(--sh-surface-danger); }

/* L'en-tete des cartes de sidebar restait bleu tres clair (#D1DCFE) sur une
   carte sombre. On le bascule sur --sh-surface-accent — et non sur
   --gray-light, qui est EXACTEMENT la couleur imposee aux entrees de menu
   qu'il surmonte : la bande d'en-tete aurait disparu (1,00:1).
   Specificite (1,2,2) : passe devant hostim.css:1102 sans !important. */
html[data-bs-theme="dark"] body .sidebar .card-header {
  background-color: var(--sh-surface-accent);
  border-bottom: 1px solid var(--sh-divider);
}

/* hostim.css:1832 pose « .table-list>tbody>tr>td{background-color:
   var(--gray-light)!important} », a specificite EGALE a la regle de survol
   de hostim.css:1210 mais avec !important : le survol de ligne disparait
   purement et simplement en sombre, sur des lignes pourtant cliquables.
   Seul un !important peut le reprendre ; portee reduite au seul :hover. */
html[data-bs-theme="dark"] body .table-list > tbody > tr:hover > td {
  background-color: var(--sh-row-hover) !important;
}

/* Meme cas de figure pour la navigation laterale : hostim.css pose
   « [data-bs-theme="dark"] .list-group-item{background-color:
   var(--gray-light)!important} ». Sans reprise, le survol n'a AUCUN retour
   visuel en sombre et l'entree courante n'est plus signalee que par son
   filet gauche. Justification du !important identique a celle ci-dessus. */
html[data-bs-theme="dark"] body .sidebar .list-group-item-action:hover,
html[data-bs-theme="dark"] body .sidebar .list-group-item-action:focus {
  background-color: var(--sh-row-hover) !important;
}
html[data-bs-theme="dark"] body .sidebar .list-group-item.active,
html[data-bs-theme="dark"] body .sidebar .list-group-item.active:hover,
html[data-bs-theme="dark"] body .sidebar .list-group-item.active:focus {
  background-color: var(--sh-tint) !important;
}

/* Compteur de la sidebar en sombre : hostim.css:1802 et 1870 ciblent
   « [data-bs-theme="dark"] .sidebar .list-group-item .badge » — soit (0,4,0)
   en !important (fond --dark sur un item --gray-light : 1,22:1, la pastille
   n'existe pas). Il faut (0,4,2) ET !important pour la reprendre. */
html[data-bs-theme="dark"] body .sidebar .list-group-item .badge {
  background-color: var(--sh-tint) !important;
  color: var(--sh-tint-fg) !important;
}

/* hostim.css:1846 pose « border-color: var(--dark) !important » sur
   .tt-news-wrap et .tt-news-single : le cadre du bloc d'annonces et les
   separateurs entre annonces, bien visibles en clair, disparaissaient
   completement en sombre. On ne reprend QUE la couleur du cadre et du
   separateur bas ; le filet gauche d'accent au survol est repose ensuite. */
html[data-bs-theme="dark"] body .tt-news-wrap {
  border-color: var(--sh-divider) !important;
}
html[data-bs-theme="dark"] body .tt-news-single:not(:last-of-type) {
  border-bottom-color: var(--sh-divider) !important;
}
html[data-bs-theme="dark"] body .tt-news-wrap .tt-news-single:hover {
  border-left-color: var(--sh-link) !important;
}

/* --- 8.3 Alertes ----------------------------------------------------------- */
html[data-bs-theme="dark"] body .alert-info {
  color: var(--sh-al-info-fg);
  background-color: var(--sh-al-info-bg);
  border-color: var(--sh-al-info-bg);
  border-left-color: var(--sh-al-info-ac);
}
html[data-bs-theme="dark"] body .alert-success {
  color: var(--sh-al-succ-fg);
  background-color: var(--sh-al-succ-bg);
  border-color: var(--sh-al-succ-bg);
  border-left-color: var(--sh-al-succ-ac);
}
html[data-bs-theme="dark"] body .alert-warning {
  color: var(--sh-al-warn-fg);
  background-color: var(--sh-al-warn-bg);
  border-color: var(--sh-al-warn-bg);
  border-left-color: var(--sh-al-warn-ac);
}
html[data-bs-theme="dark"] body .alert-danger {
  color: var(--sh-al-dang-fg);
  background-color: var(--sh-al-dang-bg);
  border-color: var(--sh-al-dang-bg);
  border-left-color: var(--sh-al-dang-ac);
}
html[data-bs-theme="dark"] body .alert-secondary {
  color: var(--sh-al-seco-fg);
  background-color: var(--sh-al-seco-bg);
  border-color: var(--sh-al-seco-bg);
  border-left-color: var(--sh-al-seco-ac);
}

/* --- 8.4 Champs de saisie --------------------------------------------------
   hostim.css:1963 met « border-color: var(--gray-light) !important » sur le
   .form-control en sombre — exactement la couleur de son propre fond, 1.00:1.
   hostim.css:1924 met la bordure de FOCUS a --primary-dark (#1e3a8a) : 1.41:1.
   Dans les deux cas le !important existant ne laisse pas le choix.
   -------------------------------------------------------------------------- */
html[data-bs-theme="dark"] body .form-control,
html[data-bs-theme="dark"] body #order-standard_cart .field,
html[data-bs-theme="dark"] body #order-standard_cart .form-control,
html[data-bs-theme="dark"] body #registration .field,
html[data-bs-theme="dark"] body #registration .form-control {
  border-color: var(--sh-input-border) !important;
}
html[data-bs-theme="dark"] body .form-control:focus,
html[data-bs-theme="dark"] body #order-standard_cart .field:focus,
html[data-bs-theme="dark"] body #order-standard_cart .form-control:focus,
html[data-bs-theme="dark"] body #registration .field:focus,
html[data-bs-theme="dark"] body #registration .form-control:focus {
  border-color: var(--sh-focus) !important;
}
/* Chevron clair RESERVE aux selects qui recoivent reellement un fond sombre,
   c'est-a-dire ceux qui portent AUSSI .form-control. Cinq selects du site
   sont des .custom-select NUS (viewinvoice.tpl:123 — passerelle de paiement,
   payment/billing-address.tpl:105, configuressl-stepone.tpl:27 et 140,
   store/order.tpl:104) : aucune regle du theme ne les assombrit, ils restent
   blancs, et un chevron clair y disparaitrait (1,33:1). Ils conservent donc
   le chevron sombre de la section 7.7. */
html[data-bs-theme="dark"] body .custom-select.form-control {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='none' stroke='%23cbd5e1' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round' d='M1.5 2 6 6.5 10.5 2'/%3E%3C/svg%3E");
}
/* theme.css:1825 grise les champs desactives avec #e9ecef et remet
   opacity:1, mais hostim.css:1837 impose le fond sombre en !important : un
   champ desactive devient indiscernable d'un champ actif. On signale l'etat
   par l'opacite et le curseur — pas besoin de surencherir sur un !important.
   Les champs [readonly] gardent leur pleine lisibilite. */
html[data-bs-theme="dark"] body .form-control:disabled,
html[data-bs-theme="dark"] body .custom-select:disabled,
html[data-bs-theme="dark"] body .field[disabled] {
  opacity: 0.6;
  cursor: not-allowed;
}

/* --- 8.5 .btn-default -----------------------------------------------------
   theme.min.css fixe .btn-default{color:#333;background-color:#fff} et
   .btn-default:hover{background-color:#fff!important}. Aucune regle sombre ne
   les reprend : les boutons secondaires (recherche de la base de
   connaissances, boutons du panier, « imprimer ») restent des paves blancs
   dans une interface sombre — et hostim.css:1887 y pose du var(--body-color),
   soit 2.56:1. !important necessaire face au background-color:#fff!important.
   -------------------------------------------------------------------------- */
html[data-bs-theme="dark"] body .btn-default {
  background-color: var(--gray-light) !important;
  border-color: var(--sh-input-border) !important;
  color: var(--body-color) !important;
}
html[data-bs-theme="dark"] body .btn-default:hover,
html[data-bs-theme="dark"] body .btn-default:focus,
html[data-bs-theme="dark"] body .btn-default:active:focus {
  background-color: var(--sh-surface-accent) !important;
  border-color: var(--sh-link) !important;
  color: var(--heading-color) !important;
}

/* --- 8.6 Pied de page ------------------------------------------------------
   Le pied garde volontairement --primary-light : il est pose sur
   --primary-darker (bleu nuit) dans les deux themes, a 11.4:1. On le
   reaffirme pour qu'il echappe a toute regle generale de lien.
   -------------------------------------------------------------------------- */
html[data-bs-theme="dark"] body .tt-footer-menu li a {
  color: var(--primary-light);
}


/* ==========================================================================
   RECAPITULATIF VISUEL — ce qui change pour un visiteur
   --------------------------------------------------------------------------
   • Typographie : corps a 15px pile (au lieu de 14,4px flous), interligne
     proportionnel au lieu d'un plomb fixe de 26,4px, titres re-hierarchises
     et paragraphes d'articles limites a une longueur de ligne confortable.
     Les hauteurs de boutons et de champs sont inchangees.
   • Espacement : rythme vertical unifie sur une echelle de 4px ; comblement
     des trous et des chevauchements en mobile et en tablette (widgets du
     pied de page, formulaire de contact, tuiles du tableau de bord,
     recapitulatif du panier). Le fil d'Ariane ne chevauche plus le contenu.
   • Cartes et blocs : coins arrondis coherents (0,75rem partout), legere
     ombre douce et sans decalage lateral, en-tetes de carte plus calmes.
   • Navigation : soulignement anime au survol du menu principal, menus
     deroulants mieux poses, entree courante et entree survolee de la barre
     laterale enfin distinguables, compteurs de la sidebar redevenus visibles.
   • Tableaux : en-tetes en petites capitales espacees, lignes plus aerees,
     chiffres alignes, curseur « main » sur les lignes cliquables, survol de
     ligne visible dans les deux themes.
   • Pastilles de statut et badges : forme pilule et couleurs assombries pour
     que le texte blanc reste lisible (les statuts « suspendu », « actif » et
     « paye » etaient sous le seuil de contraste).
   • Alertes : palette complete refaite, filet d'accent gauche indiquant la
     severite, et — nouveaute — un rendu adapte au mode sombre.
   • Formulaires : bordures de champ enfin visibles, anneau de focus clair au
     clavier (y compris sur le pied de page sombre), etats d'erreur reellement
     colores, message d'erreur remonte a 14px, case « Se souvenir de moi » de
     la page de connexion remise a sa place et entierement cliquable.
   • Mode sombre : liens, icones, surfaces teintees, selects, boutons
     secondaires et champs desactives corriges ; plus aucun aplat pastel ni
     aucun bouton blanc oublie sur fond sombre.
   • Tunnel de commande et page de connexion : interventions volontairement
     minimales — couleur, graisse et interligne uniquement, aucune boite ni
     aucune taille modifiee.
   ========================================================================== */