/* =========================================================================
   Dégaine Ton Style, refonte 2026
   Feuille de style du thème enfant, écrite à partir du README de handoff,
   qui fait foi sur toutes les valeurs.
   Les polices sont déclarées dans assets/css/fonts.css, chargée avant.
   ========================================================================= */

/* ------------------------------------------------------------------ */
/* Jetons                                                             */
/* ------------------------------------------------------------------ */

:root {
  /* La règle vermillon est stricte :
     --vermillon        aplats, bandeaux, filets, et titres de plus de 24 px
     --vermillon-fonce  vermillon en TEXTE COURANT sur fond clair   5,06:1
     --vermillon-clair  vermillon en TEXTE sur fond encre           7,37:1
     Ne jamais poser --vermillon en texte de moins de 24 px. */
  --encre:            #111111;
  --encre-doux:       #1A1A1A;
  --vermillon:        #D93A21;
  --vermillon-fonce:  #C0301A;
  --vermillon-clair:  #FF7A5E;
  --creme:            #F5F1E8;
  --creme-bloc:       #EFE9DC;
  --blanc:            #FFFFFF;
  --gris-texte:       #5A544A;
  --gris-legende:     #6E6555;
  --texte-long:       #3D3831;
  --fond-depliant:    #FFFDF7;
  --desactive:        #B5AE9E;

  --filet-clair:       rgba(17,17,17,.14);
  --filet-clair-fort:  rgba(17,17,17,.20);
  --separateur:        rgba(17,17,17,.08);
  --filet-sombre:      rgba(245,241,232,.25);
  --filet-sombre-fort: rgba(245,241,232,.33);

  --titre: "Anton", "Arial Narrow", Impact, sans-serif;
  --texte: "DM Sans", "Segoe UI", system-ui, -apple-system, sans-serif;

  --r-xs: 6px;
  --r-sm: 12px;
  --r-md: 14px;
  --r-lg: 18px;
  --r-pilule: 999px;

  --pad-section: 64px 48px;
}

/* ------------------------------------------------------------------ */
/* Base                                                               */
/* ------------------------------------------------------------------ */

.dts * { box-sizing: border-box; }

/* ⚠️ LE BUG QUI CASSAIT TOUTES LES PAGES BOUTIQUE.
   WooCommerce pose une classe « columns-3 » sur le <body> des archives
   produit, et une regle du site la traduit en « column-count: 3 ». Le corps
   entier de la page partait alors en trois colonnes de journal : les filtres
   dans la premiere, les produits dans la deuxieme, le PIED DE PAGE dans la
   troisieme. Aucune de mes grilles n'y pouvait quoi que ce soit : le
   decoupage etait impose au-dessus d'elles.
   Un corps de page n'est jamais multi-colonnes. On le neutralise ici. */
body.dts-refonte { column-count: auto; columns: auto; }

body.dts-refonte {
  margin: 0;
  background: var(--creme);
  color: var(--encre);
  font-family: var(--texte);
  font-size: 16px;
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

.dts h1, .dts h2, .dts h3 { font-family: var(--titre); font-weight: 400; text-transform: uppercase; margin: 0; }

/* ⚠️ Astra pose une couleur EXPLICITE sur ses titres, et une déclaration
   explicite l'emporte toujours sur une couleur héritée du parent. Sans les
   règles ci-dessous, le H1 du hero sort en noir sur fond noir. Chaque titre
   doit donc porter sa couleur, jamais compter sur l'héritage. */
.dts-hero h1,
.dts-404 h1,
.dts-pied h2,
.dts-pied h3,
.dts-section--sombre h1,
.dts-section--sombre h2,
.dts-section--sombre h3 { color: var(--creme); }

.dts-produit h1,
.dts-boutique-tete h1,
.dts-themes h2,
.dts-vide h1,
.dts-vide h2,
.dts-carte h2,
.dts-carte h3 { color: var(--encre); }

.dts-section--sombre .dts-carte h2,
.dts-section--sombre .dts-carte h3 { color: var(--creme); }
.dts p { margin: 0; }
/* :where() met la spécificité à zéro. Sans lui, « .dts a » (0,1,1) écrase
   « .dts-btn--encre » (0,1,0) et le bouton de l'en-tête se retrouve en texte
   noir sur fond noir. C'est la collision de spécificité classique. */
:where(.dts) a { color: inherit; text-decoration: none; }
.dts img { max-width: 100%; display: block; }
.dts ol, .dts ul { margin: 0; padding: 0; list-style: none; }

.dts-icone { width: 24px; height: 24px; flex: 0 0 auto; stroke: currentColor; fill: none;
  stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }

.dts-invisible {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
.dts-invisible:focus {
  position: static; width: auto; height: auto; margin: 0; clip: auto;
  padding: 12px 20px; background: var(--encre); color: var(--creme); display: inline-block;
}

.dts-surtitre {
  font-size: 13px; letter-spacing: .2em; text-transform: uppercase;
  font-weight: 700; color: var(--vermillon-fonce); margin: 0 0 8px;
}
.dts-surtitre--sombre { color: var(--vermillon-clair); }

.dts-section { padding: var(--pad-section); }
.dts-section--sombre { background: var(--encre); color: var(--creme); }
.dts-section--doux { background: var(--encre-doux); }
.dts-section--voisins { padding-top: 16px; padding-bottom: 0; }

.dts-tete-section {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: 24px; flex-wrap: wrap; margin-bottom: 20px;
}
.dts-tete-section h2 { font-size: 52px; line-height: 1; }
.dts-fleches { display: flex; gap: 12px; }

/* Le focus doit rester visible : c'est la seule façon de naviguer au clavier. */
.dts a:focus-visible, .dts button:focus-visible,
.dts input:focus-visible, .dts summary:focus-visible {
  outline: 3px solid var(--vermillon); outline-offset: 3px; border-radius: var(--r-xs);
}
.dts-section--sombre a:focus-visible, .dts-section--sombre button:focus-visible,
.dts-404 a:focus-visible, .dts-404 input:focus-visible { outline-color: var(--vermillon-clair); }

/* ---- Boutons ---- */
.dts-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 10px;
  font-family: var(--titre); text-transform: uppercase; letter-spacing: .08em;
  border-radius: var(--r-pilule); border: 1px solid transparent;
  cursor: pointer; text-align: center; min-height: 44px;
  transition: background-color .15s ease, color .15s ease, border-color .15s ease;
}
.dts-btn--primaire { background: var(--vermillon); color: #fff; font-size: 19px; padding: 19px 34px; }
.dts-btn--primaire:hover { background: var(--creme); color: var(--encre); }
.dts-btn--encre { background: var(--encre); color: var(--creme); font-size: 15px; padding: 12px 20px; }
.dts-btn--encre:hover { background: var(--vermillon); color: #fff; }
.dts-btn--fantome {
  background: transparent; border-color: var(--filet-sombre-fort); color: var(--creme);
  font-family: var(--texte); font-weight: 500; text-transform: none; letter-spacing: 0;
  font-size: 17px; padding: 18px 28px;
}
.dts-btn--fantome:hover { border-color: var(--creme); }
.dts-btn--contour {
  background: transparent; border-color: var(--filet-clair-fort); color: var(--encre);
  font-family: var(--texte); font-weight: 500; text-transform: none; letter-spacing: 0;
  font-size: 17px; padding: 16px 26px;
}
.dts-btn--contour:hover { background: var(--encre); color: var(--creme); border-color: var(--encre); }

.dts-rond {
  width: 48px; height: 48px; min-height: 48px; border-radius: var(--r-pilule);
  border: 1px solid var(--filet-clair-fort); background: transparent; color: var(--encre);
  display: inline-flex; align-items: center; justify-content: center; cursor: pointer;
  transition: background-color .15s ease, color .15s ease;
}
.dts-rond:hover { background: var(--encre); color: var(--creme); }

/* ------------------------------------------------------------------ */
/* En-tête                                                            */
/* ------------------------------------------------------------------ */

.dts-entete {
  display: flex; align-items: center; justify-content: space-between; gap: 24px;
  padding: 20px 48px; background: var(--creme);
  border-bottom: 1px solid var(--separateur);
}
.dts-logo { display: inline-flex; align-items: center; gap: 12px; }
.dts-logo img { height: 52px; width: auto; }
.dts-logo-mot { font-family: var(--titre); font-size: 17px; line-height: .92; letter-spacing: .01em; text-transform: uppercase; }
.dts-logo-mot span { display: block; }
.dts-logo-mot .l2 { color: var(--vermillon-fonce); }

.dts-nav { display: flex; gap: 34px; font-size: 16px; font-weight: 500; }
.dts-nav a { padding: 4px 0; border-bottom: 2px solid transparent; transition: border-color .15s ease; }
.dts-nav a:hover, .dts-nav a[aria-current="page"] { border-bottom-color: var(--vermillon); }

.dts-recherche-pilule {
  display: flex; align-items: center; gap: 8px;
  border: 1px solid var(--filet-clair); border-radius: var(--r-pilule);
  padding: 9px 16px; color: var(--gris-legende); font-size: 15px; background: transparent;
  min-height: 44px;
}
.dts-recherche-pilule input {
  border: 0; background: transparent; font: inherit; color: var(--encre); width: 168px; padding: 0;
}
/* ⚠️ Ce « outline: none » annulait le contour de focus du thème sur le champ de
   recherche, sans rien mettre à la place : plus aucun repère au clavier.
   Relevé au dixième audit. On le garde, parce qu'un contour AUTOUR DU CHAMP
   dans une pilule est laid, mais on déplace le repère sur la pilule entière
   grâce à :focus-within. L'information reste, l'esthétique aussi. */
.dts-recherche-pilule input:focus { outline: none; }
.dts-recherche-pilule:focus-within { outline: 3px solid var(--vermillon); outline-offset: 3px; }
.dts-entete .dts-recherche-pilule:focus-within { outline-color: var(--encre); }
.dts-recherche-pilule--large { max-width: 420px; margin-top: 20px; }
.dts-recherche-pilule--large input { width: 100%; }
.dts-entete-actions { display: flex; align-items: center; gap: 16px; }

/* ------------------------------------------------------------------ */
/* Hero                                                               */
/* ------------------------------------------------------------------ */

.dts-hero { display: grid; grid-template-columns: 1.05fr 1fr; background: var(--encre); color: var(--creme); }
.dts-hero-texte { padding: 76px 56px 68px; display: flex; flex-direction: column; justify-content: center; gap: 28px; }
.dts-hero-texte .dts-surtitre { font-size: 14px; letter-spacing: .22em; color: var(--vermillon-clair); margin: 0; }
.dts-hero h1 { font-size: clamp(46px, 6.2vw, 88px); line-height: .9; letter-spacing: -.01em; text-wrap: balance; }
.dts-hero h1 .accent { color: var(--vermillon); display: block; }
.dts-hero-chapo { font-size: 19px; line-height: 1.55; color: rgba(245,241,232,.8); max-width: 460px; }
.dts-hero-actions { display: flex; gap: 16px; flex-wrap: wrap; }
.dts-hero-mention { font-size: 14px; color: rgba(245,241,232,.6); }

.dts-hero-visuels { background: var(--encre-doux); display: grid; grid-template-columns: 1fr 1fr; gap: 2px; }
.dts-hero-visuels a { display: block; height: 100%; }
.dts-hero-visuels img { width: 100%; height: 100%; object-fit: cover; }
.dts-hero-visuels > *:first-child { grid-row: span 2; }

/* ------------------------------------------------------------------ */
/* Bandeau défilant                                                   */
/* ------------------------------------------------------------------ */

.dts-bandeau { background: var(--vermillon); color: #fff; padding: 14px 0; overflow: hidden; }
.dts-bandeau-piste {
  display: flex; gap: 44px; width: max-content;
  font-family: var(--titre); font-size: 17px; letter-spacing: .14em; text-transform: uppercase;
  animation: dts-defile 26s linear infinite;
}
.dts-bandeau-piste span { white-space: nowrap; }
@keyframes dts-defile { from { transform: translateX(0); } to { transform: translateX(-50%); } }

@media (prefers-reduced-motion: reduce) {
  .dts-bandeau-piste { animation: none; flex-wrap: wrap; width: auto; justify-content: center; padding: 0 24px; }
  .dts-rail { scroll-behavior: auto; }
}

/* ------------------------------------------------------------------ */
/* Rails et cartes produit                                            */
/* ------------------------------------------------------------------ */

.dts-rail {
  display: flex; gap: 22px; overflow-x: auto; scroll-behavior: smooth;
  padding: 24px 48px 56px; margin: 0 -48px; scrollbar-width: thin;
}
.dts-rail::-webkit-scrollbar { height: 6px; }
.dts-rail::-webkit-scrollbar-thumb { background: var(--filet-clair-fort); border-radius: 3px; }
.dts-rail > .dts-carte { flex: 0 0 300px; }

.dts-carte { display: flex; flex-direction: column; gap: 14px; }
.dts-carte-visuel { position: relative; }
.dts-carte-visuel img, .dts-carte-vide {
  aspect-ratio: 1; width: 100%; object-fit: cover;
  border-radius: var(--r-lg); background: var(--blanc);
}
.dts-carte h2, .dts-carte h3 {
  font-family: var(--texte); font-weight: 700; text-transform: none;
  font-size: 18px; line-height: 1.3; color: var(--encre);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden; min-height: 44px;
}
.dts-carte-lien { font-size: 15px; color: var(--gris-legende); }
.dts-carte-lien strong { color: var(--vermillon-fonce); font-weight: 700; }
.dts-carte:hover .dts-carte-lien strong { text-decoration: underline; }

.dts-badge {
  position: absolute; top: 14px; left: 14px;
  background: var(--encre); color: var(--creme);
  font-family: var(--titre); font-size: 12px; letter-spacing: .14em; text-transform: uppercase;
  padding: 6px 10px; border-radius: var(--r-pilule);
}

.dts-grille-3 { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 26px; }
.dts-grille-4 { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 32px 24px; }

.dts-section--sombre .dts-tete-section h2 { color: var(--creme); }
.dts-section--sombre .dts-carte h2, .dts-section--sombre .dts-carte h3 { color: var(--creme); font-size: 19px; }
.dts-section--sombre .dts-carte-visuel img { background: var(--encre-doux); }

/* Sur fond sombre, le cartouche « visuel bientôt disponible » doit rester
   lisible : en reprenant le fond encre, il devenait une case noire muette,
   c'est-à-dire exactement ce qu'il est censé éviter. */
.dts-section--sombre .dts-carte-vide { background: var(--encre-doux); border-color: var(--filet-sombre); }
.dts-section--sombre .dts-carte-vide strong { color: var(--vermillon-clair); }
.dts-section--sombre .dts-carte-vide span { color: rgba(245,241,232,.6); }
.dts-section--sombre .dts-carte-lien { color: rgba(245,241,232,.6); }
.dts-section--sombre .dts-carte-lien strong { color: var(--vermillon-clair); }

.dts-lien-souligne { font-size: 16px; font-weight: 500; padding-bottom: 4px; border-bottom: 1px solid var(--filet-sombre-fort); }
.dts-lien-souligne:hover { border-bottom-color: var(--creme); }

/* ------------------------------------------------------------------ */
/* Trouve ton thème                                                   */
/* ------------------------------------------------------------------ */

.dts-themes { display: grid; grid-template-columns: 1fr 1fr; gap: 56px; align-items: center; }
.dts-themes h2 { font-size: 40px; line-height: 1.05; }
.dts-themes p { font-size: 17px; line-height: 1.6; color: var(--gris-texte); max-width: 420px; margin-top: 16px; }
.dts-pilules { display: flex; flex-wrap: wrap; gap: 10px; }
.dts-pilules--centrees { justify-content: center; margin-top: 28px; }
.dts-pilule {
  border: 1px solid var(--filet-clair-fort); border-radius: var(--r-pilule);
  padding: 12px 20px; font-size: 16px; font-weight: 500; min-height: 44px;
  display: inline-flex; align-items: center;
  transition: background-color .15s ease, color .15s ease, border-color .15s ease;
}
.dts-pilule:hover { background: var(--encre); color: var(--creme); border-color: var(--encre); }
.dts-pilule--pleine { background: var(--vermillon); color: #fff; border-color: var(--vermillon); font-weight: 700; }
.dts-pilule--pleine:hover { background: var(--encre); border-color: var(--encre); }

/* ------------------------------------------------------------------ */
/* Pied de page                                                       */
/* ------------------------------------------------------------------ */

.dts-pied { background: var(--encre); color: var(--creme); padding: 56px 48px 40px; }
.dts-pied-grille { display: grid; grid-template-columns: 1.4fr 1fr 1fr; gap: 48px; }
/* h2 depuis le 12/08/2026 : le h3 sautait un niveau sur les pages sans h2. */
.dts-pied h2,
.dts-pied h3 { font-size: 28px; }
.dts-pied-chapo { font-size: 16px; color: rgba(245,241,232,.67); margin-top: 12px; }
.dts-pied-titre {
  font-family: var(--texte); font-size: 14px; letter-spacing: .16em; text-transform: uppercase;
  color: rgba(245,241,232,.7); font-weight: 500;
}
.dts-pied-liens { display: flex; flex-direction: column; gap: 10px; margin-top: 16px; font-size: 15px; }
.dts-pied-liens a:hover { color: var(--vermillon-clair); }
.dts-reseaux { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; }
.dts-reseaux a {
  border: 1px solid var(--filet-sombre); border-radius: var(--r-pilule);
  padding: 9px 16px; font-size: 14px; min-height: 44px; display: inline-flex; align-items: center;
}
.dts-reseaux a:hover { border-color: var(--creme); }
.dts-copyright { font-size: 13px; color: rgba(245,241,232,.6); margin-top: 16px; }

/* ------------------------------------------------------------------ */
/* Fiche produit                                                      */
/* ------------------------------------------------------------------ */

.dts-fil { font-size: 14px; color: var(--gris-legende); padding: 20px 48px 0; }
.dts-fil ol { display: flex; flex-wrap: wrap; gap: 8px; }
/* 12/08/2026 : les barres obliques étaient des <li aria-hidden>. Un lecteur
   d'écran annonçait donc « liste de 5 éléments » pour un fil de 3 étapes.
   Elles sont désormais dessinées par le CSS, qui n'est jamais lu à voix haute.
   L'espacement reste identique : 8px de gap, la barre, 8px de marge. */
.dts-fil li + li::before { content: "/"; margin-right: 8px; }
.dts-fil a:hover { color: var(--encre); text-decoration: underline; }
.dts-fil [aria-current="page"] { color: var(--encre); }

.dts-produit { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1fr); gap: 56px; padding: var(--pad-section); }
.dts-produit-visuel img { border-radius: var(--r-lg); aspect-ratio: 1; object-fit: cover; width: 100%; }

/* ---- Agrandissement du visuel, sur la balise native <dialog> ---- */

.dts-zoom-declencheur {
  display: block; width: 100%; padding: 0; border: 0; background: none;
  position: relative; cursor: zoom-in; border-radius: var(--r-lg);
}
.dts-zoom-loupe {
  position: absolute; right: 14px; bottom: 14px;
  width: 44px; height: 44px; border-radius: 50%;
  background: var(--encre); color: var(--creme);
  display: flex; align-items: center; justify-content: center;
  transition: background-color .15s ease;
}
.dts-zoom-declencheur:hover .dts-zoom-loupe { background: var(--vermillon); }

.dts-zoom {
  border: 0; padding: 0; background: none; max-width: 96vw; max-height: 96vh;
  overflow: visible;

  /* CENTRAGE.
     Le navigateur centre un <dialog> modal par « margin: auto », mais la
     remise a zero des marges du theme l'ecrase et la fenetre se colle en haut
     a gauche. On le repose explicitement : mesure, 0 px a gauche et 597 px a
     droite avant, marges egales apres. */
  margin: auto;

  /* La fenetre se dimensionne sur son image, jamais sur la place disponible :
     sans quoi le bouton de fermeture, ancre sur le coin, flotte dans le vide. */
  width: fit-content; height: fit-content;
}
.dts-zoom::backdrop { background: rgba(17,17,17,.86); }
.dts-zoom img {
  display: block; max-width: 92vw; max-height: 92vh;
  width: auto; height: auto; border-radius: var(--r-md);
}
.dts-zoom-fermer {
  /* Ancre DANS le cadre, pas sur le coin exterieur : a 96 vh de hauteur, un
     bouton depassant de 14 px sortait de l'ecran et devenait inatteignable. */
  position: absolute; top: 12px; right: 12px; z-index: 2;

  /* width et padding sont imposes : la regle generale des boutons du theme
     etirait celui-ci a 80 px de large au lieu de 44. */
  width: 44px; height: 44px; padding: 0; box-sizing: border-box;
  border-radius: 50%; border: 0; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  background: var(--creme); color: var(--encre);
  font-size: 26px; line-height: 1; font-family: var(--texte);
  box-shadow: 0 2px 12px rgba(17, 17, 17, .5);
}
.dts-zoom-fermer:hover { background: var(--vermillon); color: #fff; }

/* ⚠️ FLÈCHES DE L'AGRANDISSEMENT, REVUES APRÈS REMARQUE D'AURÉLIEN.
   Première version, écartée : des pastilles opaques posées PAR-DESSUS l'image,
   au milieu de ses côtés. Elles cachaient précisément ce qu'on venait
   regarder, et elles étaient laides.

   Trois corrections : sur le BORD de l'image et non par-dessus, transparentes,
   et visibles seulement au survol.

   Aucun conteneur n'a été ajouté pour cela. Le <dialog> se dimensionne déjà
   sur son image, « width: fit-content » plus haut, et un dialogue modal est
   positionné : se placer par rapport à LUI, c'est se placer par rapport au bord
   de l'image. « overflow: visible » le laisse déborder de moitié. */
.dts-zoom-nav {
  position: absolute; top: 0; bottom: 0; z-index: 2;
  width: 84px; padding: 0 14px; box-sizing: border-box;
  border: 0; cursor: pointer;
  display: flex; align-items: center;
  color: var(--creme);
  opacity: 0; transition: opacity .18s ease;
}
.dts-zoom-nav--prec {
  left: 0; justify-content: flex-start;
  background: linear-gradient(to right, rgba(17, 17, 17, .58), rgba(17, 17, 17, 0));
}
.dts-zoom-nav--suiv {
  right: 0; justify-content: flex-end;
  background: linear-gradient(to left, rgba(17, 17, 17, .58), rgba(17, 17, 17, 0));
}
.dts-zoom-nav .dts-icone { width: 30px; height: 30px; filter: drop-shadow(0 1px 3px rgba(17, 17, 17, .8)); }

/* ⚠️ CORRECTION D'UNE EXPLICATION FAUSSE, écrite ici la veille.
   J'avais noté que la révélation au survol « ne fonctionnait pas sans que je
   sache pourquoi », et j'avais changé la conception pour la contourner.

   La vraie cause : le navigateur qui me servait à mesurer n'affichait pas sa
   fenêtre, donc ne produisait aucune image, donc n'exécutait AUCUNE transition
   ni aucun défilement doux. L'opacité restait à sa valeur de départ. La règle
   était juste depuis le début. Le même artefact m'avait fait croire, dix
   minutes plus tôt, que le carrousel de l'accueil ne défilait pas.

   La leçon vaut d'être gardée : quand une règle CSS correcte semble sans effet,
   soupçonner l'instrument avant la feuille de style. */
.dts-zoom:hover .dts-zoom-nav,
.dts-zoom-nav:focus-visible { opacity: 1; }

.dts-zoom-nav--prec:hover { background: linear-gradient(to right, rgba(17, 17, 17, .74), rgba(17, 17, 17, 0)); }
.dts-zoom-nav--suiv:hover { background: linear-gradient(to left, rgba(17, 17, 17, .74), rgba(17, 17, 17, 0)); }

/* Sur un écran tactile il n'y a AUCUN survol : les flèches ne paraîtraient
   jamais. On les laisse discrètement visibles, ramenées à l'intérieur pour
   qu'elles ne sortent pas de l'écran, et le glissement du doigt fait
   l'essentiel du travail. */
/* Sur un écran tactile il n'y a AUCUN survol : les bandeaux ne paraîtraient
   jamais. On les laisse visibles, plus étroits pour moins masquer l'image, et
   c'est surtout le glissement du doigt qui sert. */
@media (hover: none) {
  .dts-zoom-nav { opacity: .9; width: 56px; padding: 0 10px; }
  .dts-zoom-nav .dts-icone { width: 26px; height: 26px; }
}

@media (max-width: 767px) {
  /* ⚠️ Ce bloc masquait la loupe et neutralisait le curseur, ce qui donnait à
     croire que l'agrandissement était coupé sur téléphone. Il ne l'était pas :
     le bouton restait actif et une tape ouvrait le dialogue. Relevé au second
     audit du 12 août 2026.
     C'est le défaut des vignettes de galerie à l'envers, un comportement vivant
     sans aucune affordance. Sur une boutique de t-shirts, voir le détail de
     l'impression compte : on garde donc l'agrandissement, et on rend la loupe
     de nouveau visible, simplement plus discrète. */
  .dts-zoom-loupe { width: 34px; height: 34px; }
  .dts-zoom-fermer { top: 8px; right: 8px; }
}

/* --------------------------------------------------------------------------
   PAGE DE THÈME : la grille ne doit pas rester coincée dans la colonne
   de filtres.

   Le gabarit retire volontairement l'<aside> des filtres sur une page de
   catégorie : on est déjà DANS un filtre. Mais .dts-boutique restait une
   grille à deux colonnes, « filtres | contenu ». Sans aside, l'unique enfant
   se plaçait automatiquement dans la PREMIÈRE colonne, celle de 248 px,
   et les cartes tombaient à 65 px de large.

   On règle la cause, pas le symptôme : quand la colonne de filtres est
   absente, la grille n'a plus qu'une colonne. :has() lit le contenu réel du
   bloc, donc la règle reste juste le jour où l'on décidera d'afficher des
   filtres sur les pages de thème.
   -------------------------------------------------------------------------- */

.dts-boutique:not(:has(.dts-filtres)) {
  grid-template-columns: minmax(0, 1fr);
}

/* --------------------------------------------------------------------------
   CARTE DE THÈME ENTIÈREMENT CLIQUABLE

   Le lien existant est étiré à toute la carte par un pseudo-élément, plutôt
   que d'envelopper la carte dans un second <a>. Deux raisons :

   1. Un seul lien dans le balisage. Deux liens vers la même page se lisent
      deux fois dans la liste des liens d'un lecteur d'écran.
   2. Le libellé reste celui du lien, « Humour → », donc rien n'est perdu au
      clavier ni pour les moteurs.

   La vignette est en position: relative pour son ::before de trame, mais elle
   n'est pas positionnée dans le flux : le ::after de lien passe donc bien
   par-dessus.
   -------------------------------------------------------------------------- */

.dts-theme-card { position: relative; }

.dts-theme-card:hover { border-color: rgba(17, 17, 17, .28); }

.dts-theme-card__link::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
}

/* Le focus clavier doit rester visible sur la carte entière, pas seulement
   sur les quelques mots du lien. */
.dts-theme-card:focus-within {
  outline: 3px solid var(--vermillon);
  outline-offset: 3px;
}
.dts-theme-card__link:focus-visible { outline: none; }
.dts-vignettes { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 12px; margin-top: 12px; }
.dts-vignettes img { aspect-ratio: 1; object-fit: cover; border-radius: var(--r-sm); border: 1px solid var(--filet-clair); }
/* 12/08/2026 : la sélection est portée par aria-pressed, plus par une classe.
   Deux états à tenir en parallèle finissent toujours par diverger, et celui que
   voit un lecteur d'écran doit être celui que voit l'œil. */
.dts-vignettes [aria-pressed="true"] img { border: 2px solid var(--encre); }

/* Les visuels produit sont tous dans la page, un seul sans « hidden ».
   « display: contents » fait disparaître le span de la mise en page : l'image
   se comporte exactement comme si elle était seule, sans conteneur. */
.dts-produit-visuel .dts-vue { display: contents; }
.dts-produit-visuel .dts-vue[hidden] { display: none; }
/* 12/08/2026 : les vignettes sont devenues des boutons, ce sont donc eux qui
   occupent la case de la grille. L'image garde son propre style, la règle
   .dts-vignettes img étant un sélecteur de descendance. */
.dts-vignettes .dts-vignette-btn { display: block; width: 100%; padding: 0; border: 0; background: none; cursor: pointer; }
.dts-vignettes .dts-vignette-btn img { width: 100%; display: block; }
.dts-vignettes .dts-vignette-btn:focus-visible { outline: 2px solid var(--encre); outline-offset: 2px; }

.dts-produit-infos { display: flex; flex-direction: column; gap: 24px; }
.dts-produit h1 { font-size: clamp(30px, 3.4vw, 44px); line-height: 1.05; }
.dts-produit-achat { display: flex; flex-direction: column; gap: 10px; align-items: flex-start; }
.dts-produit-mention { font-size: 14px; color: var(--gris-legende); }

.dts-accroche-1 { font-family: var(--titre); font-size: 28px; line-height: 1.1; text-transform: uppercase; color: var(--encre); }
.dts-accroche-2 { font-size: 20px; font-weight: 700; color: var(--vermillon-fonce); }
.dts-description { font-size: 17px; line-height: 1.65; color: var(--texte-long); }
.dts-description p { margin-bottom: 14px; }

.dts-depliant { border: 1px solid var(--filet-clair); border-radius: var(--r-md); background: var(--fond-depliant); }
.dts-depliant summary {
  list-style: none; cursor: pointer; padding: 18px 20px; font-weight: 700;
  display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 44px;
}
.dts-depliant summary::-webkit-details-marker { display: none; }
.dts-depliant summary::after { content: "+"; font-family: var(--titre); font-size: 24px; line-height: 1; }
.dts-depliant[open] summary::after { content: "\2013"; }
.dts-depliant-corps { padding: 0 20px 20px; font-size: 16px; line-height: 1.6; color: var(--texte-long); }
.dts-depliant-corps p + p { margin-top: 12px; }

/* ------------------------------------------------------------------ */
/* Écrans boutique                                                    */
/* ------------------------------------------------------------------ */

.dts-boutique { display: grid; grid-template-columns: 248px minmax(0,1fr); gap: 44px; padding: var(--pad-section); }
.dts-filtres { position: sticky; top: 24px; align-self: start; display: flex; flex-direction: column; gap: 28px; }
.dts-filtres-groupe h2 { font-family: var(--texte); font-size: 14px; letter-spacing: .16em; color: var(--gris-legende); font-weight: 700; }
.dts-filtres-liste { display: flex; flex-direction: column; gap: 4px; margin-top: 12px; }
.dts-filtres-liste a {
  display: flex; justify-content: space-between; gap: 12px; align-items: center;
  padding: 10px 12px; border-radius: var(--r-xs); font-size: 15px; min-height: 44px;
}
.dts-filtres-liste a:hover { background: var(--creme-bloc); }
.dts-filtres-compte { color: var(--gris-legende); font-size: 13px; font-variant-numeric: tabular-nums; }

.dts-boutique-tete { padding: 24px 48px 0; }
.dts-boutique-tete h1 { font-size: clamp(36px, 4.6vw, 64px); line-height: 1; }
.dts-chapo { font-size: 17px; color: var(--gris-texte); max-width: 62ch; margin-top: 12px; }

.dts-pagination { display: flex; align-items: center; justify-content: space-between; gap: 24px; flex-wrap: wrap; margin-top: 48px; }
.dts-pagination-compte { font-size: 15px; color: var(--gris-legende); font-variant-numeric: tabular-nums; }
.dts-pagination-liste ul { display: flex; gap: 8px; flex-wrap: wrap; }
.dts-pagination-liste a, .dts-pagination-liste span {
  min-width: 44px; min-height: 44px; padding: 0 12px;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--filet-clair-fort); border-radius: var(--r-xs);
  font-variant-numeric: tabular-nums; font-size: 15px;
}
.dts-pagination-liste a:hover { background: var(--encre); color: var(--creme); border-color: var(--encre); }
.dts-pagination-liste .current { background: var(--encre); color: var(--creme); border-color: var(--encre); }
.dts-pagination-liste .dots { border-color: transparent; }

.dts-themes-voisins { display: flex; gap: 10px; overflow-x: auto; padding: 4px 0 12px; }
.dts-themes-voisins .dts-pilule { white-space: nowrap; }

/* ------------------------------------------------------------------ */
/* États limites                                                      */
/* ------------------------------------------------------------------ */

/* Produit sans image : jamais de case blanche ni d'icône cassée. */
.dts-carte-vide {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
  background: var(--creme-bloc); border: 1px dashed var(--filet-clair-fort); text-align: center; padding: 16px;
}
.dts-carte-vide strong { font-family: var(--titre); font-size: 22px; color: var(--vermillon-fonce); text-transform: uppercase; }
.dts-carte-vide span { font-size: 13px; color: var(--gris-legende); }

/* Catégorie vide et recherche sans résultat : une sortie de secours. */
.dts-vide { text-align: center; max-width: 60ch; margin: 0 auto; padding: 72px 24px; }
.dts-vide h1, .dts-vide h2 { font-size: clamp(32px, 4vw, 52px); line-height: 1.05; }
.dts-vide p { font-size: 17px; color: var(--gris-texte); margin-top: 16px; }
.dts-vide-actions { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; margin-top: 28px; }

.dts-404 { background: var(--encre); color: var(--creme); padding: 96px 48px; text-align: center;
  display: flex; flex-direction: column; align-items: center; }
.dts-404 h1 { font-size: clamp(44px, 8vw, 88px); line-height: .95; }
.dts-404 h1 .accent { color: var(--vermillon); display: block; }
.dts-404 p { color: rgba(245,241,232,.8); font-size: 18px; margin-top: 20px; max-width: 52ch; }
.dts-404 .dts-recherche-pilule { margin-top: 28px; width: 100%; max-width: 420px; border-color: var(--filet-sombre); }
.dts-404 .dts-recherche-pilule input { color: var(--creme); width: 100%; }

/* ------------------------------------------------------------------ */
/* Pages simples, articles, formulaires                               */
/*                                                                    */
/* Ces gabarits manquaient a la premiere livraison : les pages Contact */
/* et Guides tombaient sur ceux d'Astra, que cette feuille habillait a */
/* moitie. Resultat : illisible. Ils existent maintenant.             */
/* ------------------------------------------------------------------ */

.dts-page { padding: var(--pad-section); max-width: 1180px; margin: 0 auto; }
.dts-page-tete { margin-bottom: 36px; }
.dts-page-tete h1 { font-size: clamp(36px, 5vw, 64px); line-height: 1; color: var(--encre); }
.dts-page-tete .dts-chapo { margin-top: 14px; }

/* Contenu riche venu de l'editeur WordPress. Mesure de lecture limitee :
   au dela de 70 caracteres par ligne, l'oeil perd le debut de la ligne. */
.dts-riche { font-size: 17px; line-height: 1.7; color: var(--texte-long); max-width: 70ch; }
.dts-riche > * + * { margin-top: 20px; }
.dts-riche h2 { font-size: clamp(26px, 3vw, 36px); line-height: 1.1; color: var(--encre); margin-top: 44px; }
.dts-riche h3 { font-size: 22px; line-height: 1.2; color: var(--encre); margin-top: 32px; }
.dts-riche a { color: var(--vermillon-fonce); text-decoration: underline; text-underline-offset: 3px; }
.dts-riche a:hover { color: var(--encre); }
.dts-riche ul, .dts-riche ol { padding-left: 22px; list-style: revert; }
.dts-riche li + li { margin-top: 8px; }
.dts-riche img { border-radius: var(--r-md); height: auto; }
.dts-riche blockquote {
  border-left: 3px solid var(--vermillon); padding-left: 20px; font-size: 19px; color: var(--encre);
}
.dts-riche table { width: 100%; border-collapse: collapse; display: block; overflow-x: auto; }
.dts-riche th, .dts-riche td { border: 1px solid var(--filet-clair); padding: 10px 12px; text-align: left; }

/* Les blocs « groupe » de l'editeur qui portent un fond ou une bordure.
   Sur la page Contact, ce bloc arrivait avec une bordure de 1 px et un
   rembourrage a ZERO : le cadre collait au texte. On lui donne l'air qui lui
   manquait plutot que de retirer la bordure, qui structure la page. */
.dts-riche .wp-block-group.has-background,
.dts-riche .wp-block-group[style*="border"] {
  padding: 44px 48px;
  border-radius: var(--r-lg);
  border: 1px solid var(--filet-clair);
  box-shadow: 0 10px 30px rgba(17,17,17,.05);
  margin-top: 8px;
}
.dts-riche .wp-block-group > *:first-child { margin-top: 0; }
.dts-riche .wp-block-group > h2:first-child { font-size: clamp(24px, 2.6vw, 32px); }

/* Le formulaire respire : chaque champ est separe, et la mesure de lecture
   du chapeau reste confortable. */
.dts-riche .wpforms-container { margin-top: 32px; }
.dts-riche .wp-block-group > p { max-width: 62ch; }

/* Formulaires. Le site utilise WPForms : on habille par type de champ plutot
   que par classe d'extension, pour rester valable si l'extension change. */
.dts-riche label, .dts-page label { font-weight: 700; font-size: 15px; color: var(--encre); display: block; margin-bottom: 6px; }
.dts-page input[type="text"], .dts-page input[type="email"], .dts-page input[type="tel"],
.dts-page input[type="url"], .dts-page input[type="search"], .dts-page textarea, .dts-page select {
  width: 100%; max-width: 520px; font: inherit; font-size: 16px; color: var(--encre);
  background: var(--blanc); border: 1px solid var(--filet-clair-fort); border-radius: var(--r-xs);
  padding: 12px 14px; min-height: 48px;
}
.dts-page textarea { min-height: 150px; resize: vertical; }
.dts-page input:focus, .dts-page textarea:focus, .dts-page select:focus {
  outline: 3px solid var(--vermillon); outline-offset: 2px; border-color: var(--encre);
}
.dts-page input[type="submit"], .dts-page button[type="submit"] {
  width: auto; min-width: 0; background: var(--vermillon); color: #fff; border: 0;
  font-family: var(--titre); font-size: 18px; letter-spacing: .08em; text-transform: uppercase;
  padding: 16px 32px; border-radius: var(--r-pilule); cursor: pointer; min-height: 48px;
}
.dts-page input[type="submit"]:hover, .dts-page button[type="submit"]:hover { background: var(--encre); }
/* Une case a cocher doit rester une case : sans dimensions explicites, la
   regle de largeur des champs texte l'ecrase en un simple trait. */
.dts-page input[type="checkbox"], .dts-page input[type="radio"] {
  width: 20px; height: 20px; min-width: 20px; min-height: 20px; max-width: none;
  margin-right: 10px; padding: 0; accent-color: var(--vermillon); vertical-align: -3px;
}
.dts-page .wpforms-field-checkbox label, .dts-page .wpforms-field-radio label,
.dts-page ul li label { font-weight: 400; display: inline; }
.dts-page .wpforms-field { margin-bottom: 28px; }
/* ⚠️ Seul endroit du thème où !important est justifié.
   WPForms écrit son CSS avec un sélecteur d'IDENTIFIANT (#wpforms-1234 …),
   qui l'emporte sur n'importe quelle classe, quelle qu'en soit la longueur.
   Sans cela, Prénom et Nom restent empilés en flottants pleine largeur. */
.dts-page .wpforms-field-row { display: flex !important; gap: 20px; flex-wrap: wrap; }
.dts-page .wpforms-field-row::after { content: none !important; }
/* La rangée est bridée en largeur par la classe de taille de WPForms
   (« wpforms-field-medium »). On la libère, sinon les deux blocs ne tiennent
   pas côte à côte et repassent à la ligne. */
.dts-page .wpforms-field-medium,
.dts-page .wpforms-field-row.wpforms-field-medium { max-width: 100% !important; }
.dts-page .wpforms-field-row-block {
  float: none !important; width: auto !important; padding: 0 !important;
  flex: 1 1 0; min-width: 0;
}
.dts-page .wpforms-field-row-block input { width: 100% !important; max-width: none !important; }
.dts-page .wpforms-field-row-block input { max-width: none; }
.dts-page .wpforms-submit-container { margin-top: 34px; }
.dts-page .wpforms-field-label { font-size: 15px; margin-bottom: 8px; }
.dts-page .wpforms-required-label { color: var(--vermillon-fonce); }
.dts-page .wpforms-field-sublabel { font-weight: 400; font-size: 13px; color: var(--gris-legende); margin-top: 4px; }

/* Grille du blog. Ce sont des vignettes, pas une liste de liens : sans image
   un article de guide ne donne aucune envie d'etre ouvert. */
.dts-articles { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 34px 26px; }
.dts-article {
  display: flex; flex-direction: column; background: var(--blanc);
  border: 1px solid var(--filet-clair); border-radius: var(--r-lg); overflow: hidden;
  transition: transform .18s ease, box-shadow .18s ease;
}
.dts-article:hover { transform: translateY(-3px); box-shadow: 0 12px 28px rgba(17,17,17,.10); }
.dts-article-visuel img, .dts-article-vide { aspect-ratio: 16 / 10; width: 100%; object-fit: cover; display: block; }
.dts-article-vide { background: var(--creme-bloc); display: flex; align-items: center; justify-content: center; }
.dts-article-vide strong { font-family: var(--titre); font-size: 26px; color: var(--vermillon-fonce); text-transform: uppercase; }
.dts-article-corps { padding: 22px 24px 26px; display: flex; flex-direction: column; gap: 10px; flex: 1 1 auto; }
.dts-article h2 {
  font-family: var(--texte); font-weight: 700; text-transform: none;
  font-size: 20px; line-height: 1.25; color: var(--encre);
}
.dts-article p { font-size: 15px; line-height: 1.6; color: var(--gris-texte); flex: 1 1 auto; }
.dts-article-lire { font-size: 15px; font-weight: 700; color: var(--vermillon-fonce); }
.dts-article:hover .dts-article-lire { text-decoration: underline; }

/* Page « Tous les thèmes ». Des cartes avec visuel, pas des étiquettes nues :
   une liste de mots ne donne aucune envie de cliquer. */
.dts-page--large { max-width: 1320px; }

.dts-themes-grille { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 30px 24px; }
.dts-theme-carte {
  display: flex; flex-direction: column; background: var(--blanc);
  border: 1px solid var(--filet-clair); border-radius: var(--r-lg); overflow: hidden;
  transition: transform .18s ease, box-shadow .18s ease;
}
.dts-theme-carte:hover { transform: translateY(-3px); box-shadow: 0 12px 28px rgba(17,17,17,.10); }
.dts-theme-visuel { position: relative; }
.dts-theme-visuel img, .dts-theme-visuel .dts-article-vide {
  aspect-ratio: 4 / 3; width: 100%; object-fit: cover; display: block;
}

/* ------------------------------------------------------------------ */
/* Vignettes de thème dessinées par le thème lui-même                  */
/*                                                                    */
/* ⚠️ POURQUOI CE N'EST PLUS UNE IMAGE.                               */
/* Les anciennes vignettes étaient des fichiers Photoshop. Quand la    */
/* catégorie Astrologie a été créée, le fichier source était perdu :   */
/* la vignette n'a jamais été faite. Une vignette qui dépend d'un      */
/* fichier et d'un logiciel finit toujours par manquer.                */
/*                                                                    */
/* Ici, la vignette est du TEXTE dessiné en CSS. Toute catégorie créée */
/* en reçoit une automatiquement, dans la bonne police et les bonnes   */
/* couleurs, sans que personne n'ouvre quoi que ce soit.               */
/* ------------------------------------------------------------------ */

.dts-vignette {
  aspect-ratio: 4 / 3; position: relative; overflow: hidden;
  display: grid; place-items: center; padding: 18px;
}
.dts-vignette-mot {
  font-family: var(--titre); text-transform: uppercase; text-align: center;
  line-height: .88; letter-spacing: .01em; position: relative; z-index: 2;
  text-wrap: balance; max-width: 100%; overflow-wrap: break-word;
}

/* La taille suit la LONGUEUR DU NOM, posée en PHP. « Chat » et « Occasions
   Noël, Halloween, Anniversaires… » ne peuvent pas s'afficher dans le même
   corps : sans cela, le nom long déborde ou devient illisible. */
.dts-vignette-mot--xl { font-size: clamp(30px, 3.6vw, 52px); }
.dts-vignette-mot--l  { font-size: clamp(26px, 3.0vw, 42px); }
.dts-vignette-mot--m  { font-size: clamp(20px, 2.2vw, 30px); }
.dts-vignette-mot--s  { font-size: clamp(15px, 1.6vw, 21px); line-height: 1.1; letter-spacing: .02em; }

/* ---- Traitement 1 : PLEIN CADRE.
   Le mot occupe toute la tuile et déborde légèrement, comme une affiche
   sérigraphiée mal calée. Le débordement est volontaire. ---- */
.dts-vignette--plein { background: var(--encre); }
.dts-vignette--plein .dts-vignette-mot { color: var(--creme); }
.dts-vignette--plein::after {
  content: ""; position: absolute; inset: auto 0 0 0; height: 6px; background: var(--vermillon);
}

/* ---- Traitement 2 : LA CIBLE.
   Le twist : « des designs qui visent juste », alors chaque thème est une
   cible touchée. Le réticule est décalé, jamais centré : on vient de tirer. ---- */
.dts-vignette--cible { background: var(--creme-bloc); }
.dts-vignette--cible .dts-vignette-mot { color: var(--encre); }
.dts-vignette--cible::before {
  content: ""; position: absolute; z-index: 1;
  width: 62%; aspect-ratio: 1; right: -12%; top: -16%;
  border-radius: 50%;
  background:
    radial-gradient(circle, var(--vermillon) 0 6%, transparent 6.5%),
    radial-gradient(circle, transparent 0 26%, rgba(217,58,33,.55) 26% 28%, transparent 28.5%),
    radial-gradient(circle, transparent 0 46%, rgba(217,58,33,.35) 46% 48%, transparent 48.5%);
}
.dts-vignette--cible::after {
  content: ""; position: absolute; z-index: 1; left: -8%; bottom: -14%;
  width: 44%; aspect-ratio: 1; border-radius: 50%;
  border: 2px solid rgba(17,17,17,.10);
}

/* ---- Traitement 3 : LE BANDEAU.
   Le nom répété en diagonale derrière, comme la trame d'une sérigraphie,
   et le nom net par-dessus. Rappelle le bandeau défilant de l'accueil. ---- */
/* ---- Motifs qui disent quelque chose du thème ----
   Ils remplacent l'alternance aveugle de la première version, où « Animaux »
   recevait une cible. Le motif est choisi par le SENS, en PHP. ---- */

/* PATTES, pour les animaux, le chat et le chien.
   Une patte = quatre coussinets en arc et un plus gros en dessous. */
.dts-vignette--pattes { background: var(--creme-bloc); }
.dts-vignette--pattes .dts-vignette-mot { color: var(--encre); }
.dts-vignette--pattes::before,
.dts-vignette--pattes::after {
  content: ""; position: absolute; z-index: 1; width: 84px; height: 96px; opacity: .55;
  background:
    radial-gradient(ellipse 34% 24% at 50% 78%, rgba(17,17,17,.22) 99%, transparent 100%),
    radial-gradient(circle at 18% 34%, rgba(17,17,17,.22) 9%, transparent 10%),
    radial-gradient(circle at 40% 20%, rgba(17,17,17,.22) 9%, transparent 10%),
    radial-gradient(circle at 62% 20%, rgba(17,17,17,.22) 9%, transparent 10%),
    radial-gradient(circle at 84% 34%, rgba(17,17,17,.22) 9%, transparent 10%);
}
.dts-vignette--pattes::before { left: 5%;  top: 8%;    transform: rotate(-18deg); }
.dts-vignette--pattes::after  { right: 5%; bottom: 6%; transform: rotate(14deg); }

/* ÉTOILES, pour l'astrologie et les occasions. */
.dts-vignette--etoiles { background: var(--encre); }
.dts-vignette--etoiles .dts-vignette-mot { color: var(--creme); }
.dts-vignette--etoiles::before {
  content: ""; position: absolute; inset: 0; z-index: 1;
  background:
    radial-gradient(circle at 14% 22%, rgba(255,122,94,.95) 2px, transparent 2.4px),
    radial-gradient(circle at 82% 18%, rgba(245,241,232,.9) 2.6px, transparent 3px),
    radial-gradient(circle at 68% 76%, rgba(255,122,94,.75) 1.8px, transparent 2.2px),
    radial-gradient(circle at 24% 82%, rgba(245,241,232,.75) 2.2px, transparent 2.6px),
    radial-gradient(circle at 46% 10%, rgba(245,241,232,.55) 1.6px, transparent 2px),
    radial-gradient(circle at 90% 54%, rgba(245,241,232,.55) 1.8px, transparent 2.2px),
    radial-gradient(circle at 8% 58%, rgba(255,122,94,.5) 1.6px, transparent 2px);
}

/* CŒUR, pour amour et couple. Deux disques et un carré pivoté : la forme se
   dessine sans image. */
.dts-vignette--coeur { background: var(--creme-bloc); }
.dts-vignette--coeur .dts-vignette-mot { color: var(--encre); }
/* Le cœur est le CARACTÈRE typographique, pas une géométrie CSS.
   Une première version le construisait avec deux ombres portées et un carré
   pivoté : il sortait en losange. Un caractère se dessine toujours juste. */
.dts-vignette--coeur::before {
  content: "\2665"; position: absolute; z-index: 1; right: 4%; top: -14%;
  font-size: 130px; line-height: 1; color: var(--vermillon); opacity: .22;
  transform: rotate(12deg);
}
.dts-vignette--coeur::after {
  content: "\2665"; position: absolute; z-index: 1; left: 5%; bottom: -6%;
  font-size: 62px; line-height: 1; color: var(--encre); opacity: .12;
  transform: rotate(-16deg);
}

/* GUILLEMETS, pour les citations et messages. */
.dts-vignette--guillemets { background: var(--creme-bloc); }
.dts-vignette--guillemets .dts-vignette-mot { color: var(--encre); }
.dts-vignette--guillemets::before,
.dts-vignette--guillemets::after {
  position: absolute; z-index: 1; font-family: var(--titre);
  font-size: 140px; line-height: .62; color: var(--vermillon); opacity: .20;
}
.dts-vignette--guillemets::before { content: "\00AB"; left: 3%;  top: -4%; }
.dts-vignette--guillemets::after  { content: "\00BB"; right: 3%; bottom: -18%; }

/* PIXELS, pour le gaming. */
.dts-vignette--pixels { background: var(--encre); }
.dts-vignette--pixels .dts-vignette-mot { color: var(--creme); }
.dts-vignette--pixels::before {
  content: ""; position: absolute; inset: 0; z-index: 1; opacity: .18;
  background-image:
    linear-gradient(rgba(245,241,232,.6) 1px, transparent 1px),
    linear-gradient(90deg, rgba(245,241,232,.6) 1px, transparent 1px);
  background-size: 18px 18px;
}
.dts-vignette--pixels::after {
  content: ""; position: absolute; z-index: 1; right: 12%; top: 14%;
  width: 16px; height: 16px; background: var(--vermillon);
  box-shadow: 16px 16px 0 var(--vermillon), -16px 16px 0 rgba(255,122,94,.6), 0 32px 0 rgba(255,122,94,.4);
}

/* RELIEF, pour nature et aventure. */
.dts-vignette--relief { background: var(--creme-bloc); }
.dts-vignette--relief .dts-vignette-mot { color: var(--encre); }
.dts-vignette--relief::before {
  content: ""; position: absolute; inset: auto 0 0 0; z-index: 1; height: 44%;
  background: rgba(17,17,17,.15);
  clip-path: polygon(0 100%, 16% 44%, 30% 70%, 48% 20%, 66% 64%, 82% 38%, 100% 100%);
}
.dts-vignette--relief::after {
  content: ""; position: absolute; z-index: 1; left: 14%; top: 16%;
  width: 28px; aspect-ratio: 1; border-radius: 50%; background: var(--vermillon); opacity: .45;
}

/* VITESSE, pour la moto. */
.dts-vignette--vitesse { background: var(--vermillon); }
.dts-vignette--vitesse .dts-vignette-mot { color: #fff; }
.dts-vignette--vitesse::before {
  content: ""; position: absolute; inset: -20%; z-index: 1; opacity: .20;
  background: repeating-linear-gradient(-16deg, #fff 0 3px, transparent 3px 26px);
}

.dts-vignette--bandeau { background: var(--vermillon); }
.dts-vignette--bandeau .dts-vignette-mot { color: #fff; }
.dts-vignette--bandeau .dts-vignette-trame {
  position: absolute; inset: -30%; z-index: 1;
  display: flex; flex-direction: column; gap: 6px; justify-content: center;
  transform: rotate(-14deg); opacity: .18; pointer-events: none;
}
.dts-vignette--bandeau .dts-vignette-trame span {
  font-family: var(--titre); font-size: 20px; letter-spacing: .18em;
  text-transform: uppercase; color: #fff; white-space: nowrap; text-align: center;
}

.dts-theme-compte { z-index: 3; }
.dts-theme-compte {
  position: absolute; bottom: 12px; left: 12px;
  background: var(--encre); color: var(--creme);
  font-family: var(--titre); font-size: 12px; letter-spacing: .1em; text-transform: uppercase;
  padding: 6px 12px; border-radius: var(--r-pilule);
}
.dts-theme-corps { padding: 20px 22px 24px; display: flex; flex-direction: column; gap: 8px; flex: 1 1 auto; }
.dts-theme-carte h2 {
  font-family: var(--titre); font-size: 24px; line-height: 1.05;
  text-transform: uppercase; color: var(--encre);
}
.dts-theme-carte p { font-size: 14.5px; line-height: 1.55; color: var(--gris-texte); flex: 1 1 auto; }

.dts-types { margin-top: 64px; padding-top: 40px; border-top: 1px solid var(--filet-clair); }
.dts-types h2 { font-size: 30px; color: var(--encre); margin-bottom: 18px; }
.dts-types .dts-pilule { gap: 10px; }
.dts-types .dts-filtres-compte { color: var(--gris-legende); }
.dts-types .dts-pilule:hover .dts-filtres-compte { color: rgba(245,241,232,.7); }

/* Article seul */
.dts-article-solo { max-width: 760px; margin: 0 auto; padding: var(--pad-section); }
.dts-article-solo h1 { font-size: clamp(32px, 4.4vw, 54px); line-height: 1.05; color: var(--encre); }
.dts-article-solo .dts-couverture { margin: 28px 0; }
.dts-article-solo .dts-couverture img { width: 100%; border-radius: var(--r-lg); height: auto; }

/* ------------------------------------------------------------------ */
/* Mobile                                                             */
/* ------------------------------------------------------------------ */

@media (max-width: 1024px) {
  .dts-grille-4 { grid-template-columns: repeat(2, minmax(0,1fr)); }
  .dts-articles { grid-template-columns: repeat(2, minmax(0,1fr)); }
  .dts-themes-grille { grid-template-columns: repeat(2, minmax(0,1fr)); }
  .dts-boutique { grid-template-columns: 1fr; gap: 24px; }
  .dts-filtres { position: static; }
  .dts-produit { grid-template-columns: 1fr; gap: 32px; }
}

@media (max-width: 767px) {
  :root { --pad-section: 30px 22px; }

  /* Garde-fou contre le débordement horizontal, interdit par la charte qualité.
     Un seul élément trop large décale toute la page et coupe le contenu. */
  html, body.dts-refonte { max-width: 100%; overflow-x: hidden; }
  .dts-hero, .dts-section, .dts-entete, .dts-pied, .dts-boutique, .dts-produit { max-width: 100vw; }

  /* En-tête mobile conforme à la maquette : logo et recherche, pas le gros
     bouton d'achat, qui à lui seul faisait déborder la ligne. */
  .dts-entete { position: sticky; top: 0; z-index: 20; padding: 14px 18px; gap: 12px; }
  /* ⚠️ LA NAVIGATION MOBILE AVAIT PUREMENT DISPARU.
     Cette règle masquait la navigation ET le bouton d'achat en dessous de
     768 px, sans rien mettre à la place : aucun menu, aucun bouton. Sur
     téléphone, le seul élément atteignable de l'en-tête était le champ de
     recherche. Ni Thèmes, ni Produits, ni Guides, ni Contact, et le pied de
     page ne rattrapait rien puisqu'il ne porte que les pages légales.
     Relevé au dixième audit. C'est le défaut le plus coûteux de tout l'audit,
     sur le format d'écran probablement majoritaire.

     La navigation revient donc sur une deuxième ligne. AUCUN JavaScript : pas
     de bouton à ouvrir, pas d'état à tenir, rien qui puisse tomber en panne.

     Le bouton d'achat reste masqué, lui : « Produits » mène au même endroit,
     et la place est comptée.

     ⚠️ ELLE PASSE À LA LIGNE, ELLE NE DÉFILE PLUS, ET C'EST UNE MESURE.
     La première version défilait à l'horizontale avec la barre masquée. Sur
     375 px les quatre entrées tenaient dans 339 px, tout allait bien. Sur
     320 px, l'iPhone SE, « Contact » sortait de 37 px : la seule façon de
     l'atteindre était de faire glisser une zone dont RIEN n'indiquait qu'elle
     glissait, puisque la barre était cachée. Une entrée qu'on ne voit pas et
     dont on ignore l'existence n'existe pas.

     Le retour à la ligne coûte quelques pixels de hauteur et ne cache jamais
     rien, à n'importe quelle largeur. */
  .dts-entete { flex-wrap: wrap; }

  .dts-entete .dts-nav {
    display: flex; order: 3; flex: 1 0 100%;
    flex-wrap: wrap;
    /* Écart horizontal resserré à 14 px : les quatre entrées tiennent alors sur
       UNE ligne dès 360 px, et l'en-tête reste compact. Il n'y a que sur les
       écrans de 320 px que la quatrième passe à la ligne, ce qui est
       exactement le comportement voulu. */
    gap: 4px 14px; font-size: 14px; margin-top: 6px;
  }
  /* ⚠️ MON COMMENTAIRE ANNONÇAIT 44 px, LA MESURE EN DONNAIT 36.
     Relevé par audit externe le 14 août 2026. J'avais posé 6 px de rembourrage
     en écrivant « environ 44 px » sans remesurer : 14 px de police, 24 px
     d'interligne, plus 12 px, cela fait 36. Le chiffre était une intention,
     pas un constat.

     Le rembourrage passe à 10 px, ce qui donne les 44 px réellement
     recommandés pour une cible tactile. Le coût est de 8 px de hauteur
     d'en-tête, à peser contre un lien qu'on rate du doigt. */
  /* ⚠️ ET 10 px DE REMBOURRAGE DONNAIENT 43,3 px, PAS 44.
     Relevé au second audit du 14 août 2026, qui mesurait au dixième là où
     j'arrondissais. L'interligne vaut 23,3 px et non 24 : le compte tombait
     juste sur le papier et faux à l'écran. Deuxième fois que ce chiffre est
     écrit sans être mesuré.

     On cesse donc de calculer une hauteur à partir d'un rembourrage, et on la
     DEMANDE. min-height s'applique parce que ces liens sont des éléments
     flexibles de la navigation, donc traités comme des blocs. */
  .dts-entete .dts-nav a {
    white-space: nowrap; padding: 10px 0;
    display: flex; align-items: center; min-height: 44px;
  }

  .dts-entete .dts-btn--encre { display: none; }
  .dts-entete .dts-recherche-pilule { padding: 8px 12px; min-width: 0; flex: 1 1 auto; }
  .dts-entete .dts-recherche-pilule input { width: 100%; min-width: 0; font-size: 14px; }
  .dts-entete-actions { flex: 1 1 auto; min-width: 0; }
  .dts-logo { flex: 0 0 auto; }
  .dts-logo img { height: 38px; }

  /* Les titres Anton ne doivent jamais dépasser leur colonne. */
  .dts h1, .dts h2, .dts h3 { overflow-wrap: break-word; }

  .dts-hero { grid-template-columns: 1fr; }
  .dts-hero-texte { padding: 30px 22px 26px; gap: 20px; }
  .dts-hero h1 { font-size: 44px; line-height: .92; }
  .dts-hero-chapo { font-size: 16px; }
  .dts-hero-actions { flex-direction: column; align-items: stretch; }
  .dts-hero-visuels { grid-template-columns: 1fr 1fr; gap: 8px; padding: 0 22px 26px; background: var(--encre); }
  .dts-hero-visuels img { border-radius: var(--r-sm); }
  .dts-hero-visuels > *:first-child { grid-row: auto; }
  .dts-hero-visuels > *:nth-child(3) { display: none; }

  .dts-bandeau-piste { font-size: 13px; gap: 28px; animation-duration: 20s; }

  .dts-rail { padding: 20px 22px 32px; margin: 0 -22px; gap: 14px; }
  .dts-rail > .dts-carte { flex: 0 0 190px; }
  .dts-carte h2, .dts-carte h3 { font-size: 15px; min-height: 40px; }
  .dts-tete-section h2 { font-size: 32px; }
  .dts-fleches { display: none; }

  .dts-grille-3, .dts-grille-4 { grid-template-columns: repeat(2, minmax(0,1fr)); gap: 20px 16px; }
  .dts-articles, .dts-themes-grille { grid-template-columns: 1fr; gap: 20px; }
  .dts-riche .wp-block-group.has-background,
  .dts-riche .wp-block-group[style*="border"] { padding: 26px 22px; }
  .dts-page { padding: 26px 20px 40px; }

  .dts-themes { grid-template-columns: 1fr; gap: 24px; }
  .dts-themes h2 { font-size: 32px; }

  .dts-pied { padding: 40px 22px 32px; }
  .dts-pied-grille { grid-template-columns: 1fr; gap: 32px; }

  .dts-fil { padding: 16px 22px 0; }
  .dts-boutique-tete { padding: 20px 22px 0; }
  .dts-vignettes { display: flex; overflow-x: auto; gap: 10px; }
  .dts-vignettes .dts-vignette-btn { flex: 0 0 68px; }
  .dts-vignettes img { flex: 0 0 68px; }

  .dts-pagination { justify-content: center; }
  .dts-404 { padding: 56px 22px; }
}

/* -------------------------------------------------------------------------
   L'EN-TÊTE DE BUREAU NE TENAIT PAS ENTRE 768 ET ENVIRON 840 px

   ⚠️ Relevé par audit externe le 14 août 2026, puis mesuré. À 768 px, première
   largeur où la mise en page de bureau s'applique, l'en-tête débordait de
   41 px. À 900 px il tient avec 63 px de marge. Le débordement ne se voyait
   pas parce qu'un overflow-x: hidden posé ailleurs le masquait : il coupait le
   bord du bouton d'achat au lieu de le montrer.

   LA CAUSE. Un élément flexible a min-width: auto par défaut, ce qui l'empêche
   de descendre en dessous de la largeur de son contenu. Le bloc de recherche
   et le bouton d'achat refusaient donc de rétrécir et poussaient dehors.

   min-width: 0 leur rend le droit de rétrécir. On ne touche PAS à flex-grow :
   sans quoi le champ de recherche s'étirerait sur les grands écrans et le
   rendu large changerait, ce qui n'est pas demandé.

   Le rembourrage latéral de 48 px, soit 96 px sur 768, se resserre en dessous
   de 900 px, où la place est comptée. */
@media (min-width: 768px) {
  .dts-entete-actions,
  .dts-entete .dts-recherche-pilule { min-width: 0; }
  .dts-entete .dts-recherche-pilule input { min-width: 0; }
}

/* ⚠️ LE CORRECTIF PRÉCÉDENT AVAIT DÉPLACÉ LE PROBLÈME, PAS RÉSOLU.
   Relevé au second audit du 14 août 2026 : en rendant les blocs compressibles,
   l'en-tête ne débordait plus, mais le champ de recherche tombait à 34 px de
   large à 768 px et 58 px à 800. Un champ de 34 px n'est pas un champ, c'est
   un défaut déguisé en correctif.

   La place manquante est celle du bouton d'achat, 124 px. On le masque donc
   entre 768 et 899 px, exactement comme en mobile, et pour la même raison :
   « Produits » dans la navigation mène au même endroit, il n'y a rien de
   perdu. Au-dessus de 900 px, la place existe et le bouton revient. */
/* ⚠️ BORNES FRACTIONNAIRES, ET C'EST MESURÉ, PAS UNE PRÉCAUTION DE STYLE.
   Fenêtre demandée à 899 px : innerWidth vaut 899, mais
   matchMedia('(max-width: 899px)') répond FAUX. La largeur réelle est
   fractionnaire, 899,x, et une borne en nombre entier la rate. Le bouton
   restait donc visible et le champ retombait à 91 px, très exactement le
   défaut qu'on croyait corrigé.

   Le même effet expliquait le débordement d'environ 1 px relevé à 767 px par
   l'audit : ni la feuille mobile, qui s'arrête à 767, ni la feuille de bureau,
   qui commençait à 768, ne s'appliquaient dans cet intervalle.

   La borne basse descend donc à 767 px, ce qui recouvre le trou sans rien
   changer en mobile, où le bouton est déjà masqué. La borne haute prend la
   décimale, seule forme qui attrape 899,x. */
/* La bande monte jusqu'à 1024 px, et non 900, parce que la mesure le demande :
   avec le bouton, le champ fait 92 px à 900 px, soit une dizaine de caractères
   visibles, ce qui ne se lit pas pendant la frappe. Il retrouve 139 px à
   1024 px, où le bouton peut donc revenir. */
@media (min-width: 767px) and (max-width: 1023.98px) {
  .dts-entete { padding-left: 24px; padding-right: 24px; }
  .dts-entete .dts-btn--encre { display: none; }
}
