/* =============================================================
   TUNNEL — Panier · Checkout · Confirmation
   ============================================================= */

/* Dans la maquette, `.tunnel-page` enveloppe le contenu de la page ; ici c'est
   une classe de <body> (`body_class()`), et le pied de page est dedans. Les
   80 px du portage tombaient donc SOUS le pied de page, où ils peignaient une
   bande blanche — relevé par Anthony le 2026-08-30 sur /panier/ et /paiement/.
   L'écart appartient au contenu : il est reposé sur le <main>. */
.tunnel-page {
  min-height: 60vh;
}

.tunnel-page__main {
  padding-bottom: 80px;
}

/* ---------- Mini progress bar (checkout/confirm) ---------- */
.tunnel-mini-bar {
  padding: 14px 0;
  border-top: 1px solid var(--ag-rule);
  border-bottom: 1px solid var(--ag-rule);
  background: var(--ag-paper);
}

.tunnel-mini-bar-inner {
  display: flex;
  gap: 24px;
  align-items: center;
  justify-content: space-between;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xs);
  color: var(--ag-ink-soft);
  text-transform: uppercase;
  letter-spacing: 0.18em;
}

.tunnel-steps {
  display: flex;
  flex-wrap: wrap;
  gap: 0;
  align-items: center;
}

.tunnel-step {
  display: inline-flex;
  gap: 10px;
  align-items: center;

  padding: 6px 14px;

  color: var(--ag-ink-soft);
}

.tunnel-step .stp-num {
  display: inline-flex;
  align-items: center;
  justify-content: center;

  width: 22px;
  height: 22px;
  border: 1px solid var(--ag-rule-strong);
  border-radius: 50%;

  font-size: var(--ag-text-xxs);
}

.tunnel-step.done {
  color: var(--ag-accent-deep);
}

.tunnel-step.done .stp-num {
  border-color: var(--ag-accent);
  color: #fff;
  background: var(--ag-accent);
}

.tunnel-step.on {
  color: var(--ag-ink);
}

.tunnel-step.on .stp-num {
  border-color: var(--ag-ink);
  color: var(--ag-paper);
  background: var(--ag-ink);
}

.tunnel-step-sep {
  width: 28px;
  height: 1px;
  background: var(--ag-rule);
}

.tunnel-secure {
  display: inline-flex;
  gap: 8px;
  align-items: center;
  color: var(--ag-secondary);
}

/* ---------- Header ---------- */

/* Le filet ne court plus toute la largeur : le titre vit maintenant dans la
   colonne de gauche, et c'est lui qu'il souligne. */
.tunnel-header {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 24px;
  align-items: end;

  margin-bottom: 48px;
  border-bottom: 1px solid var(--ag-rule);
}

/* La graisse est reposée, elle n'est pas un choix esthétique : sans elle un
   <h1> hérite du gras de la feuille du navigateur, et Instrument Serif n'est
   livrée qu'en Regular et Italic — le navigateur fabriquait donc un faux gras
   sur les titres de /panier/ et /paiement/. C'est la recette de `.display`,
   restituée sur la classe qui la portait déjà pour tout le reste. */
.tunnel-title {
  margin: 0;

  font-family: var(--ag-font-display);
  font-size: var(--ag-text-display-l);
  font-weight: var(--ag-weight-normal);
  line-height: 0.98;
  letter-spacing: -0.02em;
}

@media (width <= 720px) {
  .tunnel-header {
    grid-template-columns: 1fr;
  }
}

/* ---------- 2-col layout ---------- */

/* Le titre est passé DANS la colonne de gauche, la grille garde donc une
   seule rangée : le récapitulatif démarre à sa hauteur au lieu de commencer
   sous lui. Un `<header>` posé en troisième élément de grille marchait aussi,
   mais le récapitulatif devait alors enjamber deux rangées — le navigateur
   répartit la hauteur d'un tel élément sur les rangées qu'il traverse, la
   première devenait haute de 870 px, et `align-items: end` y plaquait le
   titre tout en bas. Mesuré avant de choisir. */
.tunnel-layout {
  display: grid;
  grid-template-columns: 1.55fr 1fr;
  gap: 72px;
  padding: 0 0 32px;

  /* Default align-items: stretch is required, not incidental — `.summary`
     is sticky but isn't itself the grid item (`aside` is), so it only gets
     sticky room to move if `aside` is actually stretched to the row's full
     height. `align-items: start` would shrink `aside` to `.summary`'s own
     height and leave it nothing to stick against. */
}

@media (width <= 1024px) {
  .tunnel-layout {
    gap: 40px;
  }
}

@media (width <= 920px) {
  .tunnel-layout {
    grid-template-columns: 1fr;
    gap: 28px;
  }
}

/* =============================================================
   CART ITEM
   ============================================================= */

/* 28 px de part et d'autre, demandé par Anthony le 2026-08-30. La maquette
   pose 44 px (`mockup_refv2/tunnel.css`, `.cart-item`) et ne descend à 28
   qu'en dessous de 600 px : c'est un écart assumé, pas un rattrapage de
   portage. Symétrique, pour que le filet de séparation reste au milieu de
   l'écart entre deux articles — 44 en haut et 28 en bas décalait chaque trait
   vers le bas de son propre interligne. */
.cart-item {
  position: relative;

  display: grid;
  grid-template-columns: 148px 1fr auto;
  gap: 32px;

  padding: 28px 0;
  border-bottom: 1px solid var(--ag-rule);
}

.cart-item:first-child {
  padding-top: 0;
}

.cart-item-thumb {
  aspect-ratio: 4/5;
  border-radius: 2px;
}

.cart-item-body {
  display: flex;
  flex-direction: column;
  gap: 10px;
  justify-content: center;

  min-width: 0;
}

.cart-item-title-row {
  display: flex;
  gap: 20px;
  align-items: baseline;
  justify-content: space-between;
}

.cart-item-name {
  margin: 0;

  font-family: var(--ag-font-display);
  font-size: var(--ag-text-display-s);
  font-weight: 400;
  line-height: 1.05;
  letter-spacing: -0.005em;
}

.cart-item-line {
  margin: 2px 0 0;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-cap);
  color: var(--ag-ink-soft);
  letter-spacing: 0.02em;
}

.cart-item-end {
  display: flex;
  flex-direction: column;
  gap: 12px;
  align-items: center;
  justify-content: center;

  min-width: 64px;
}

.cart-item-price {
  flex-shrink: 0;

  font-family: var(--ag-font-display);
  font-size: var(--ag-text-xl);
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.01em;
  white-space: nowrap;
}

.cart-item-old {
  margin-right: 8px;

  font-family: var(--ag-font-body);
  font-size: var(--ag-text-base);
  color: var(--ag-ink-soft);
  text-decoration: line-through;
}

.cart-item-remove {
  padding: 0;
  border: none;
  border-bottom: 1px solid transparent;

  font-family: var(--ag-font-body);
  font-size: var(--ag-text-sm);
  color: var(--ag-ink-soft);
  text-transform: none;
  letter-spacing: normal;

  background: none;

  transition:
    color 0.15s ease,
    border 0.15s ease;
}

.cart-item-remove:hover {
  border-bottom-color: var(--ag-accent);
  color: var(--ag-accent);
}

/* Compact quantity stepper — same component for digital & physical */
.qty-mini {
  overflow: hidden;
  display: inline-flex;
  align-items: stretch;

  border: 1px solid var(--ag-rule-strong);
  border-radius: var(--ag-radius-md);
}

.qty-mini button {
  cursor: pointer;

  display: flex;
  align-items: center;
  justify-content: center;

  width: 26px;
  height: 26px;
  border: none;

  font-size: var(--ag-text-sm);
  line-height: 1;
  color: var(--ag-ink-soft);

  background: var(--ag-paper);

  transition:
    background 0.15s ease,
    color 0.15s ease;
}

.qty-mini button:hover {
  color: var(--ag-ink);
  background: var(--ag-paper-deep);
}

.qty-mini-val {
  display: flex;
  align-items: center;
  justify-content: center;

  width: 28px;
  height: 26px;
  border-right: 1px solid var(--ag-rule-strong);
  border-left: 1px solid var(--ag-rule-strong);

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-cap);
  font-variant-numeric: tabular-nums;
  color: var(--ag-ink);

  background: var(--ag-paper-deep);
}

@media (width <= 600px) {
  .cart-item {
    grid-template-columns: 90px 1fr;
    gap: 16px;
    padding: 28px 0;
  }

  .cart-item-thumb {
    aspect-ratio: 1;
  }

  .cart-item-name {
    font-size: var(--ag-text-lg);
  }

  .cart-item-title-row {
    flex-wrap: wrap;
  }

  .cart-item-end {
    grid-column: span 2;
    flex-direction: row;
    align-items: center;
    justify-content: flex-end;

    padding-top: 12px;
    border-top: 1px dashed var(--ag-rule);
  }

  .cart-item-price {
    font-size: var(--ag-text-lg);
  }
}

/* =============================================================
   COUPON
   ============================================================= */
.coupon-wrap {
  padding: 28px 0;
  border-bottom: 1px solid var(--ag-rule);
}

.coupon-toggle {
  display: inline-flex;
  gap: 10px;
  align-items: center;

  padding: 4px 0;
  border: none;
  border-bottom: 1px dashed var(--ag-rule-strong);

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xs);
  color: var(--ag-ink-soft);
  text-transform: uppercase;
  letter-spacing: 0.16em;

  background: none;

  transition:
    color 0.15s ease,
    border 0.15s ease;
}

.coupon-toggle:hover {
  border-bottom-color: var(--ag-accent);
  color: var(--ag-accent);
}

/* Un `display` porté par une classe l'emporte sur le `display: none` que la
   feuille du navigateur applique à [hidden] : sans ces règles, masquer par
   l'attribut ne masque rien. Concerne les éléments que le JS bascule et qui
   posent un display explicite. */
.coupon-toggle[hidden],
.summary-row[hidden] {
  display: none;
}

.coupon-row {
  display: flex;
  gap: 8px;
  align-items: stretch;

  max-width: 420px;
  margin-top: 16px;
}

/* Pilule comme tout contrôle du site (DESIGN.md, « Shapes ») : le champ et son
   bouton portaient un rayon de 2px, deux rectangles à angles vifs à côté d'un
   « Passer commande » en pilule, sur la même page. */
.coupon-row input {
  flex: 1;

  padding: 12px 20px;
  border: 1px solid var(--ag-rule-strong);
  border-radius: var(--ag-radius-pill);

  font: inherit;
  font-size: var(--ag-text-sm);
  text-transform: uppercase;
  letter-spacing: 0.06em;

  background: var(--ag-paper);
}

.coupon-row input:focus {
  border-color: var(--ag-ink);
  outline: none;
}

.coupon-row .btn {
  padding: 12px 22px;
}

/* Devenu un <label> : il n'hérite plus du bloc d'un <p>. */
.coupon-eyebrow {
  display: block;
  margin-bottom: 10px;
}

/* Registre mono + accent-deep repris du message de succès de la maquette :
   la maquette n'affiche qu'un texte figé, ici chaque code appliqué porte son
   propre retrait. */
.coupon-applied {
  margin: 12px 0 0;
  padding: 0;
  list-style: none;
}

.coupon-applied li {
  display: flex;
  gap: 10px;
  align-items: baseline;

  margin-top: 8px;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-cap);
  color: var(--ag-accent-deep);
  letter-spacing: var(--ag-tracking-label);
}

.coupon-remove {
  padding: 0;
  border: none;
  border-bottom: 1px solid currentcolor;

  font: inherit;
  color: var(--ag-ink-soft);

  background: none;

  transition: color var(--ag-dur-fast) var(--ag-ease);
}

.coupon-remove:hover {
  color: var(--ag-accent);
}

.coupon-error {
  margin: 12px 0 0;
  font-size: var(--ag-text-sm);
  font-weight: 500;
  color: var(--ag-accent-deep);
}

/* =============================================================
   SUMMARY (sidebar)
   ============================================================= */
.summary {
  position: sticky;

  /* Offset from --ag-header-h, not a bare pixel value — the sticky header's
     own height, so the panel clears it with a visible margin instead of
     sliding partly underneath it. */
  top: calc(var(--ag-header-h) + var(--ag-space-lg));

  padding: 28px;
  border: 1px solid var(--ag-rule);
  border-radius: 4px;

  background: var(--ag-paper-deep);
}

.summary-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;

  margin-bottom: 18px;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--ag-rule);
}

.summary-head h3 {
  margin: 0;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xs);
  font-weight: 500;
  color: var(--ag-ink-soft);
  text-transform: uppercase;
  letter-spacing: 0.2em;
}

.summary-count {
  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xs);
  color: var(--ag-ink-soft);
  text-transform: uppercase;
  letter-spacing: 0.14em;
}

.summary-row {
  display: flex;
  justify-content: space-between;

  padding: 10px 0;

  font-size: var(--ag-text-sm);
  color: var(--ag-ink-soft);
}

.summary-row.discount {
  font-weight: 500;
  color: var(--ag-accent-deep);
}

/* « (estimée) » en retrait : le montant est exact au poids, seule la
   destination reste à confirmer à l'étape paiement. */
.summary-row-hint {
  opacity: 0.6;
}

.summary-row.total {
  align-items: baseline;
  margin-top: 8px;
  padding-top: 16px;
  border-top: 1px solid var(--ag-rule);
}

.summary-row.total .label {
  font-family: var(--ag-font-display);
  font-size: var(--ag-text-lg);
  color: var(--ag-ink);
  letter-spacing: -0.005em;
}

.summary-row.total .val {
  font-family: var(--ag-font-display);
  font-size: var(--ag-text-xxxl);
  font-variant-numeric: tabular-nums;
  color: var(--ag-ink);
  letter-spacing: -0.01em;
}

.summary-tva {
  margin: 4px 0 0;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xxs);
  color: var(--ag-ink-soft);
  letter-spacing: 0.02em;
}

.summary-row .val {
  font-variant-numeric: tabular-nums;
  color: var(--ag-ink);
}

.summary-items {
  display: grid;
  gap: 14px;

  margin-bottom: 6px;
  padding-bottom: 18px;
  border-bottom: 1px solid var(--ag-rule);
}

/* Rien entre la liste et le total : un seul filet, celui du total. Voir
   `paintRecapTotals()` — la classe est posée par lui, sur l'état réellement
   rendu. */
.summary--sans-detail .summary-items {
  padding-bottom: 6px;
  border-bottom: 0;
}

/* Ligne fantôme d'attente du récapitulatif (rendue par templates/tunnel-paiement.php).
   Les lignes produit n'arrivent qu'avec la réponse du panier — 2 s mesurées, plus
   sur une connexion lente. Le squelette dit qu'un contenu charge au lieu de laisser
   un blanc, et tient exactement la hauteur d'une vraie ligne, donc son
   remplacement ne décale rien : pas de min-height à maintenir en parallèle. */
.summary-item-skeleton .skeleton-bar {
  display: block;

  width: 62%;
  height: 10px;
  border-radius: var(--ag-radius-sm);

  background: var(--ag-rule-strong);
}

.summary-item-skeleton .skeleton-bar-meta {
  width: 38%;
  height: 8px;
  margin-top: 8px;
}

/* La vignette emprunte à `.slot` sa géométrie (carré, rayon), pas son fond :
   `.summary .slot` plus bas le pose à `--ag-paper-deep`, la couleur même du
   panneau, si bien que le carré disparaissait et que l'attente se lisait comme
   deux barres flottant à côté d'un trou. Trois classes ici pour passer devant
   ce sélecteur à deux, plutôt que déplacer la règle loin de son bloc. */
.summary .summary-item-skeleton .slot {
  background-color: var(--ag-rule-strong);
  background-image: none;
}

.summary-item-skeleton {
  animation: ag-skeleton-pulse 1.4s ease-in-out infinite;
}

@keyframes ag-skeleton-pulse {
  0%,
  100% {
    opacity: 1;
  }

  50% {
    opacity: 0.45;
  }
}

@media (prefers-reduced-motion: reduce) {
  .summary-item-skeleton {
    animation: none;
  }
}

.summary-item {
  display: grid;
  grid-template-columns: 52px 1fr auto;
  gap: 12px;
  align-items: center;
}

.summary-item .slot {
  aspect-ratio: 1;
  border-radius: 2px;
}

.summary-item-name {
  margin: 0 0 2px;

  font-size: var(--ag-text-sm);
  font-weight: 500;
  line-height: 1.25;
  color: var(--ag-ink);
}

.summary-item-meta {
  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xxs);
  color: var(--ag-ink-soft);
  text-transform: uppercase;
  letter-spacing: 0.14em;
}

.summary-item-price {
  font-size: var(--ag-text-sm);
  font-variant-numeric: tabular-nums;
  color: var(--ag-ink);
}

.reassure {
  display: grid;
  gap: 10px;

  margin: 22px 0 0;
  padding: 0;

  font-size: var(--ag-text-sm);
  color: var(--ag-ink-soft);
  list-style: none;
}

.reassure li {
  display: grid;
  grid-template-columns: 16px 1fr;
  gap: 10px;
  align-items: baseline;

  line-height: 1.45;
}

.reassure li::before {
  content: "✓";
  font-size: var(--ag-text-sm);
  font-weight: 700;
  color: var(--ag-accent);
}

/* =============================================================
   MOBILE STICKY CTA
   ============================================================= */
.mobile-sticky-cta {
  display: none;
}

@media (width <= 920px) {
  .mobile-sticky-cta {
    position: sticky;
    z-index: 30;
    bottom: 0;

    display: block;

    margin-bottom: -1px;
    padding: 12px 22px env(safe-area-inset-bottom);
    border-top: 1px solid var(--ag-rule);

    background: var(--ag-paper);
    box-shadow: 0 -10px 30px -12px rgb(20 32 51 / 12%);
  }

  .mobile-sticky-cta-row {
    display: flex;
    gap: 14px;
    align-items: center;
    justify-content: space-between;
  }

  .mobile-sticky-cta-total {
    display: flex;
    flex-direction: column;
    gap: 2px;
  }

  .mobile-sticky-cta-total .lbl {
    font-family: var(--ag-font-mono);
    font-size: var(--ag-text-xxs);
    color: var(--ag-ink-soft);
    text-transform: uppercase;
    letter-spacing: 0.16em;
  }

  .mobile-sticky-cta-total .val {
    font-family: var(--ag-font-display);
    font-size: var(--ag-text-xxl);
    line-height: 1;
    letter-spacing: -0.01em;
  }

  .mobile-sticky-cta .btn {
    padding: 14px 22px;
  }

  .summary {
    position: static;
  }
}

/* =============================================================
   CHECKOUT
   ============================================================= */
.tunnel-section {
  padding: 36px 0;
  border-bottom: 1px solid var(--ag-rule);
}

.tunnel-section:first-child {
  padding-top: 8px;
}

.tunnel-section:last-child {
  border-bottom: none;
}

.tunnel-section-head {
  display: flex;
  gap: 18px;
  align-items: baseline;
  margin-bottom: 8px;
}

.tunnel-section-head h2 {
  margin: 0;

  font-family: var(--ag-font-display);
  font-size: var(--ag-text-display-s);
  font-weight: 400;
  letter-spacing: -0.005em;
}

.tunnel-step-num {
  padding: 6px 10px;
  border-radius: 999px;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-cap);
  color: var(--ag-accent);
  letter-spacing: 0.18em;

  background: rgb(208 0 139 / 8%);
}

.tunnel-section-sub {
  margin: 0 0 24px;
  font-size: var(--ag-text-sm);
  line-height: 1.5;
  color: var(--ag-ink-soft);
}

.field {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-bottom: 16px;
}

.field label {
  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xxs);
  color: var(--ag-ink);
  text-transform: uppercase;
  letter-spacing: 0.16em;
}

.field label .req {
  margin-left: 4px;
  color: var(--ag-accent);
}

.field label .opt {
  margin-left: 8px;

  font-family: var(--ag-font-body);
  font-size: var(--ag-text-xs);
  font-weight: 400;
  color: var(--ag-ink-soft);
  text-transform: none;
  letter-spacing: 0.02em;
}

.field input,
.field select,
.field textarea {
  padding: 16px 18px;
  border: 1px solid var(--ag-rule-strong);
  border-radius: 2px;

  font: inherit;
  font-size: var(--ag-text-base); /* prevents iOS zoom */
  color: var(--ag-ink);

  background: var(--ag-paper);

  transition:
    border 0.15s ease,
    box-shadow 0.15s ease;
}

.field input:focus,
.field select:focus,
.field textarea:focus {
  border-color: var(--ag-ink);
  outline: none;
  box-shadow: 0 0 0 3px rgb(20 32 51 / 6%);
}

.field input::placeholder,
.field select::placeholder,
.field textarea::placeholder {
  color: var(--ag-ink-soft);
}

.field-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 14px;
}

.field-row.three {
  grid-template-columns: 1fr 1fr 1fr;
}

.field-row.tri-1-2 {
  grid-template-columns: 1fr 2fr;
}

/* Le grid de .field-row écrase le flex column de .field : sans ceci, label et
   input redeviennent des éléments en ligne et se posent côte à côte. */
.field-row > div {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

@media (width <= 540px) {
  .field-row,
  .field-row.three,
  .field-row.tri-1-2 {
    grid-template-columns: 1fr;
  }
}

.login-link-discreet {
  align-self: flex-end;

  margin-top: 2px;
  border-bottom: 1px solid transparent;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xs);
  color: var(--ag-ink-soft);
  letter-spacing: 0.06em;

  transition:
    color 0.15s ease,
    border-color 0.15s ease;
}

.login-link-discreet:hover {
  border-bottom-color: var(--ag-accent-deep);
  color: var(--ag-accent-deep);
}

.login-link-inline {
  margin: -8px 0 24px;
  font-size: var(--ag-text-sm);
  color: var(--ag-ink-soft);
}

.login-link-inline a {
  border-bottom: 1px solid var(--ag-accent-deep);
  color: var(--ag-accent-deep);
}

.field-compact {
  max-width: 240px;
}

.tunnel-reassure-line {
  display: flex;
  gap: 8px;
  align-items: baseline;

  margin: 0;

  font-size: var(--ag-text-sm);
  color: var(--ag-ink-soft);
}

.tunnel-fineprint.tunnel-fineprint-normal {
  font-family: var(--ag-font-body);
  font-size: var(--ag-text-cap);
  text-transform: none;
  letter-spacing: 0.01em;
}

.summary-subtitle {
  margin: -10px 0 16px;
  font-size: var(--ag-text-sm);
  color: var(--ag-ink-soft);
}

.summary-item-meta-stack {
  display: flex;
  flex-direction: column;
  gap: 2px;

  font-family: var(--ag-font-body);
  font-size: var(--ag-text-cap);
  color: var(--ag-ink-soft);
  text-transform: none;
  letter-spacing: normal;
}

.summary-contact {
  margin: 18px 0 0;
  padding-top: 16px;
  border-top: 1px solid var(--ag-rule);

  font-size: var(--ag-text-sm);
  line-height: 1.6;
  color: var(--ag-ink-soft);
}

.summary-contact a {
  border-bottom: 1px solid var(--ag-accent-deep);
  color: var(--ag-accent-deep);
}

/* Account benefit pill */
.account-pill {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 18px;
  align-items: center;

  margin: 0 0 28px;
  padding: 20px 22px;
  border: 1px solid rgb(20 32 51 / 10%);
  border-radius: 4px;

  background: var(--ag-blue-ice);
}

.account-pill-eyebrow {
  margin: 0 0 6px;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xxs);
  color: var(--ag-accent-deep);
  text-transform: uppercase;
  letter-spacing: 0.18em;
}

.account-pill h4 {
  margin: 0 0 4px;

  font-family: var(--ag-font-display);
  font-size: var(--ag-text-lg);
  font-weight: 400;
  letter-spacing: -0.005em;
}

.account-pill p {
  margin: 0;
  font-size: var(--ag-text-sm);
  line-height: 1.45;
  color: var(--ag-ink-soft);
}

.account-pill button {
  padding: 10px 16px;
  border: 1px solid var(--ag-ink);
  border-radius: 999px;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xs);
  color: var(--ag-ink);
  text-transform: uppercase;
  letter-spacing: 0.14em;
  white-space: nowrap;

  background: var(--ag-paper);

  transition: all 0.15s ease;
}

.account-pill button:hover {
  border-color: var(--ag-ink);
  color: var(--ag-paper);
  background: var(--ag-ink);
}

@media (width <= 720px) {
  .account-pill {
    grid-template-columns: 1fr;
  }
}

/* Shipping options */
.ship-options {
  display: grid;
  gap: 8px;
}

.ship-option {
  cursor: pointer;

  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: 18px;
  align-items: center;

  padding: 18px 20px;
  border: 1px solid var(--ag-rule);
  border-radius: 4px;

  background: var(--ag-paper);

  transition:
    border 0.15s ease,
    background 0.15s ease;
}

.ship-option:hover {
  border-color: var(--ag-ink-soft);
}

.ship-option.on {
  border-color: var(--ag-ink);
  background: var(--ag-paper-deep);
}

.ship-radio {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  justify-content: center;

  width: 18px;
  height: 18px;
  border: 1.5px solid var(--ag-rule-strong);
  border-radius: 50%;

  background: var(--ag-paper);
}

.ship-option.on .ship-radio {
  border-color: var(--ag-accent);
}

.ship-option.on .ship-radio::after {
  content: "";

  width: 9px;
  height: 9px;
  border-radius: 50%;

  background: var(--ag-accent);
}

.ship-option-body h4 {
  margin: 0 0 4px;
  font-size: var(--ag-text-base);
  font-weight: 600;
  color: var(--ag-ink);
}

.ship-option-body p {
  margin: 0;
  font-size: var(--ag-text-sm);
  color: var(--ag-ink-soft);
}

.ship-option-price {
  font-family: var(--ag-font-display);
  font-size: var(--ag-text-lg);
  font-variant-numeric: tabular-nums;
}

.ship-option-free {
  font-weight: 500;
  color: var(--ag-secondary);
}

/* Payment */

/* Une colonne, et non les trois de la maquette : elle en dessinait trois
   (carte, PayPal, Apple Pay) en cartes centrées ; il en reste deux, rendues en
   lignes pleine largeur pour que le corps de l'option cochée se déplie dessous. */
.pay-methods {
  display: grid;
  grid-template-columns: 1fr;
  gap: 12px;
  margin-bottom: 18px;
}

.pay-method {
  cursor: pointer;

  display: flex;
  flex-direction: column;
  gap: 8px;
  align-items: center;

  padding: 18px 14px;
  border: 1px solid var(--ag-rule);
  border-radius: 4px;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xs);
  color: var(--ag-ink-soft);
  text-align: center;
  text-transform: uppercase;
  letter-spacing: 0.12em;

  background: var(--ag-paper);

  transition: all 0.15s ease;
}

.pay-method:hover {
  border-color: var(--ag-ink-soft);
}

.pay-method.on {
  border-color: var(--ag-ink);
  color: var(--ag-ink);
  background: var(--ag-paper-deep);
}

.pay-method-glyph {
  font-family: var(--ag-font-display);
  font-size: var(--ag-text-lg);
  color: var(--ag-ink);
  letter-spacing: -0.02em;
}

.pay-cb-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 14px;
}

/* Final CTA */
.tunnel-final {
  padding: 32px 0;
}

.tunnel-cta-row {
  display: flex;
  flex-direction: column;
  gap: 14px;
  align-items: stretch;
}

.tunnel-cta-row .btn-accent {
  justify-content: space-between;
  padding: 20px 28px;
  border-radius: 999px;
  font-size: var(--ag-text-base);
}

.tunnel-cta-row .btn-accent .price-stamp {
  font-family: var(--ag-font-display);
  font-size: var(--ag-text-lg);
  letter-spacing: -0.01em;
}

.tunnel-fineprint {
  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xxs);
  line-height: 1.7;
  color: var(--ag-ink-soft);
  text-align: center;
  text-transform: uppercase;
  letter-spacing: 0.12em;
}

.tunnel-fineprint a {
  border-bottom: 1px solid var(--ag-rule-strong);
  color: var(--ag-ink-soft);
}

/* =============================================================
   CONFIRMATION
   ============================================================= */
.confirm-hero {
  padding: 80px 0 48px;
  border-bottom: 1px solid var(--ag-rule);
  text-align: center;
}

.confirm-check {
  position: relative;

  display: flex;
  align-items: center;
  justify-content: center;

  width: 84px;
  height: 84px;
  margin: 0 auto 32px;
  border-radius: 50%;

  color: #fff;

  background: var(--ag-accent);
}

.confirm-check::before {
  content: "";

  position: absolute;
  inset: -10px;

  border: 1px solid var(--ag-accent);
  border-radius: 50%;

  opacity: 0.4;
}

.confirm-check svg {
  width: 38px;
  height: 38px;
  stroke: currentcolor;
}

.confirm-title {
  margin: 0 0 18px;

  font-family: var(--ag-font-display);
  font-size: var(--ag-text-display-l);
  line-height: 0.98;
  letter-spacing: -0.02em;

  transition: opacity var(--ag-dur-slow) var(--ag-ease);
}

.confirm-sub {
  max-width: 56ch;
  margin: 0 auto;

  font-size: var(--ag-text-md);
  line-height: 1.55;
  color: var(--ag-ink-soft);

  transition: opacity var(--ag-dur-slow) var(--ag-ease);
}

.confirm-meta {
  display: inline-flex;
  flex-wrap: wrap;
  gap: 18px;
  align-items: center;

  margin-top: 36px;
  padding: 16px 28px;
  border: 1px solid var(--ag-rule);
  border-radius: 999px;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xs);
  color: var(--ag-ink-soft);
  text-transform: uppercase;
  letter-spacing: 0.16em;

  background: var(--ag-paper);

  transition: opacity var(--ag-dur-slow) var(--ag-ease);
}

.confirm-meta strong {
  font-weight: 600;
  color: var(--ag-ink);
}

.confirm-meta .sep {
  opacity: 0.4;
}

/*
 * La pastille est une étiquette, d'où ses capitales — mais une adresse
 * e-mail est un identifiant littéral, pas une étiquette : en capitales elle
 * se lit comme une autre adresse (et la partie locale d'un e-mail est
 * sensible à la casse). Le numéro de commande et le montant, eux, n'ont que
 * des chiffres : les capitales ne les touchent pas.
 */
.confirm-meta-email {
  text-transform: none;
}

/*
 * État « commande introuvable » (`main[data-order-hydrated="notfound"]`) :
 * pas de coche, donc le hero perd son ancre visuelle haute — la paire de
 * boutons la remplace.
 */
.confirm-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  justify-content: center;

  margin-top: 32px;
}

/*
 * Le hero n'a plus d'état provisoire : `ag_tunnel_merci_hero()` compose le
 * titre, le sous-titre et la ligne de confirmation au rendu, depuis la
 * commande. Le pouls qui signalait ici du texte « en attente » n'avait plus
 * rien à signaler — il faisait clignoter une phrase déjà juste.
 */

/* Download primary block */
.confirm-downloads {
  padding: 56px 0 28px;
}

.confirm-downloads-head {
  display: flex;
  flex-wrap: wrap;
  gap: 24px;
  align-items: baseline;
  justify-content: space-between;

  margin-bottom: 24px;
  padding-bottom: 22px;
  border-bottom: 1px solid var(--ag-rule);
}

.confirm-downloads-head h2 {
  margin: 0;

  font-family: var(--ag-font-display);
  font-size: var(--ag-text-display-m);
  font-weight: 400;
  line-height: 1;
  letter-spacing: -0.01em;
}

.dl-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 16px;
}

.dl-card {
  display: grid;
  grid-template-columns: 110px 1fr;
  gap: 24px;
  align-items: start;

  padding: 28px;
  border: 1px solid var(--ag-rule);
  border-radius: 4px;

  background: var(--ag-paper);

  transition:
    border-color 0.2s ease,
    transform 0.2s ease;
}

.dl-card:hover {
  transform: translateY(-2px);
  border-color: var(--ag-ink);
}

.dl-card .slot {
  aspect-ratio: 4/5;
  border-radius: 2px;
}

.dl-card-body h4 {
  margin: 0 0 6px;

  font-family: var(--ag-font-display);
  font-size: var(--ag-text-xxl);
  font-weight: 400;
  line-height: 1.05;
  letter-spacing: -0.005em;
}

.dl-card-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: center;

  margin-bottom: 18px;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xxs);
  color: var(--ag-ink-soft);
  text-transform: uppercase;
  letter-spacing: 0.14em;
}

.dl-card-meta .sep {
  opacity: 0.4;
}

.dl-card-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}

.dl-btn {
  display: inline-flex;
  gap: 10px;
  align-items: center;

  padding: 12px 18px;
  border: 1px solid var(--ag-accent);
  border-radius: 999px;

  font-family: var(--ag-font-body);
  font-size: var(--ag-text-sm);
  font-weight: 500;
  color: var(--ag-paper);
  letter-spacing: 0.02em;

  background: var(--ag-accent);

  transition:
    background 0.15s ease,
    border-color 0.15s ease,
    color 0.15s ease;
}

.dl-btn:hover {
  border-color: var(--ag-accent-deep);
  background: var(--ag-accent-deep);
}

/* Le clic est parti — voir bindDownloadFeedback() dans assets/js/tunnel.js. */
.dl-btn.is-downloading {
  opacity: 0.72;
}

/* Le bouton de commande pendant la soumission.
   Il était déjà `disabled` — sans aucune règle pour le montrer, alors que
   l'attente carte dure trois à quatre secondes. Même opacité que
   `.dl-btn.is-downloading` juste au-dessus : c'est le même état, il n'a pas à
   se dire de deux façons. Pas de nouvelle couleur — DESIGN.md verrouille trois
   recettes de bouton, et un état occupé n'en est pas une quatrième. */
.tunnel-cta.is-busy {
  cursor: not-allowed;
  opacity: 0.72;
}

/* Action secondaire de la même carte : son survol virait au contour rose,
   seul bouton du site à le faire. Il rejoint le secondaire du thème. */
.dl-btn-ghost {
  border-color: var(--ag-ink);
  color: var(--ag-ink);
  background: var(--ag-paper);
}

.dl-btn-ghost:hover {
  border-color: var(--ag-ink);
  color: var(--ag-paper);
  background: var(--ag-ink);
}

.dl-card-shipping {
  display: flex;
  grid-column: 1 / -1;
  gap: 14px;
  align-items: flex-start;

  margin-top: 18px;
  padding: 14px 18px;
  border-radius: 4px;

  font-size: var(--ag-text-sm);
  line-height: 1.5;
  color: var(--ag-secondary);

  background: var(--ag-mint);
}

.dl-card-shipping strong {
  display: block;
  margin-bottom: 2px;
  color: var(--ag-ink);
}

@media (width <= 720px) {
  .dl-grid {
    grid-template-columns: 1fr;
  }

  .dl-card {
    grid-template-columns: 88px 1fr;
    gap: 16px;
    padding: 20px;
  }

  .dl-card-body h4 {
    font-size: var(--ag-text-lg);
  }
}

/* Quick actions row */
.quick-actions {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 12px;
  margin: 8px 0 48px;
}

.quick-action {
  display: flex;
  gap: 14px;
  align-items: center;

  padding: 22px 24px;
  border: 1px solid var(--ag-rule);
  border-radius: 4px;

  background: var(--ag-paper);

  transition:
    border-color 0.15s ease,
    background 0.15s ease;
}

.quick-action:hover {
  border-color: var(--ag-ink);
  background: var(--ag-paper-deep);
}

.quick-action-num {
  font-family: var(--ag-font-display);
  font-size: var(--ag-text-xl);
  font-style: italic;
  line-height: 1;
  color: var(--ag-accent);
}

.quick-action-body {
  flex: 1;
  min-width: 0;
}

.quick-action-body strong {
  display: block;

  margin-bottom: 2px;

  font-family: var(--ag-font-body);
  font-size: var(--ag-text-sm);
  font-weight: 600;
  color: var(--ag-ink);
}

.quick-action-body span {
  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xxs);
  color: var(--ag-ink-soft);
  text-transform: uppercase;
  letter-spacing: 0.14em;
}

.quick-action-arrow {
  font-family: var(--ag-font-mono);
  color: var(--ag-ink-soft);
  transition: transform 0.15s ease;
}

.quick-action:hover .quick-action-arrow {
  transform: translateX(4px);
  color: var(--ag-accent);
}

@media (width <= 720px) {
  .quick-actions {
    grid-template-columns: 1fr;
  }
}

/* Next steps */
.next-steps-band {
  padding: 80px 0;
  border-top: 1px solid var(--ag-rule);
  background: var(--ag-paper-deep);
}

.next-steps-head {
  display: flex;
  flex-wrap: wrap;
  gap: 32px;
  align-items: end;
  justify-content: space-between;

  margin-bottom: 36px;
  padding-bottom: 20px;
  border-bottom: 1px solid var(--ag-rule);
}

.next-steps-head h2 {
  max-width: 14ch;
  margin: 0;

  font-family: var(--ag-font-display);
  font-size: var(--ag-text-display-m);
  font-weight: 400;
  line-height: 1;
  letter-spacing: -0.015em;
}

.next-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 14px;
}

.next-card {
  position: relative;

  display: flex;
  flex-direction: column;
  gap: 12px;

  min-height: 240px;
  padding: 28px;
  border: 1px solid var(--ag-rule);
  border-radius: 4px;

  background: var(--ag-paper);

  transition:
    transform 0.2s ease,
    border-color 0.2s ease;
}

.next-card:hover {
  transform: translateY(-3px);
  border-color: var(--ag-ink);
}

.next-card .step-mark {
  margin-bottom: 4px;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xs);
  color: var(--ag-accent-deep);
  letter-spacing: 0.18em;
}

.next-card h4 {
  margin: 0;

  font-family: var(--ag-font-display);
  font-size: var(--ag-text-xxl);
  font-weight: 400;
  line-height: 1.1;
  letter-spacing: -0.005em;
}

.next-card p {
  flex: 1;

  margin: 0;

  font-size: var(--ag-text-sm);
  line-height: 1.5;
  color: var(--ag-ink-soft);
}

.next-card .arrow {
  margin-top: 6px;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xs);
  color: var(--ag-accent-deep);
  text-transform: uppercase;
  letter-spacing: 0.18em;
}

.next-card:hover .arrow {
  color: var(--ag-accent);
}

@media (width <= 920px) {
  .next-grid {
    grid-template-columns: 1fr 1fr;
  }
}

@media (width <= 540px) {
  .next-grid {
    grid-template-columns: 1fr;
  }
}

/* Mini FAQ */
.mini-faq-section {
  padding: 80px 0;
}

.mini-faq-head {
  display: flex;
  flex-wrap: wrap;
  gap: 24px;
  align-items: end;
  justify-content: space-between;

  margin-bottom: 36px;
  padding-bottom: 20px;
  border-bottom: 1px solid var(--ag-rule);
}

.mini-faq-head h2 {
  margin: 0;

  font-family: var(--ag-font-display);
  font-size: var(--ag-text-display-m);
  font-weight: 400;
  line-height: 1;
  letter-spacing: -0.01em;
}

.mini-faq-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0 64px;
}

.mini-faq-item {
  padding: 22px 0;
  border-bottom: 1px solid var(--ag-rule);
}

.mini-faq-item h5 {
  margin: 0 0 10px;

  font-family: var(--ag-font-display);
  font-size: var(--ag-text-lg);
  font-weight: 400;
  line-height: 1.1;
  letter-spacing: -0.005em;
}

.mini-faq-item p {
  margin: 0;
  font-size: var(--ag-text-sm);
  line-height: 1.55;
  color: var(--ag-ink-soft);
}

.mini-faq-item p a {
  border-bottom: 1px solid var(--ag-accent-deep);
  color: var(--ag-accent-deep);
}

@media (width <= 720px) {
  .mini-faq-grid {
    grid-template-columns: 1fr;
  }
}

/* Community CTA */
.commu-cta {
  position: relative;

  overflow: hidden;
  display: grid;
  grid-template-columns: 1.6fr 0.7fr;
  gap: 48px;
  align-items: center;

  margin-top: 56px;
  padding: 56px;
  border: 1px solid var(--ag-rule);
  border-radius: 4px;

  color: var(--ag-ink);

  background: var(--ag-paper-deep);
}

.commu-cta-image {
  overflow: hidden;

  width: 100%;
  max-width: 220px;
  margin-left: auto;
  border-radius: 4px;
}

.commu-cta h3 {
  margin: 0 0 14px;

  font-family: var(--ag-font-display);
  font-size: var(--ag-text-display-s);
  font-weight: 400;
  line-height: 1.05;
  color: var(--ag-ink);
  letter-spacing: -0.01em;
}

.commu-cta p {
  margin: 0;
  font-size: var(--ag-text-base);
  line-height: 1.55;
  color: var(--ag-ink-soft);
}

.commu-cta-actions {
  display: flex;
  margin-top: 24px;
}

.commu-cta .btn {
  justify-content: center;
  white-space: nowrap;
}

@media (width <= 720px) {
  .commu-cta {
    grid-template-columns: 1fr;
    padding: 32px;
  }
}

/* Tunnel back link */
.tunnel-back {
  display: inline-flex;
  gap: 10px;
  align-items: center;

  margin-bottom: 18px;
  padding: 4px 0;
  border: none;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xs);
  color: var(--ag-ink-soft);
  text-transform: uppercase;
  letter-spacing: 0.16em;

  background: none;

  transition:
    color 0.15s ease,
    transform 0.15s ease;
}

.tunnel-back:hover {
  transform: translateX(-2px);
  color: var(--ag-ink);
}

/* Compléments post-portage : positionnement du CTA récap (le mockup
   l'appliquait via `style={{}}` inline sur <button>, pas viable côté theme)
   et wrapper du bouton "continuer mes achats" au bas de la colonne items. */
.tunnel-cta {
  display: flex;
  justify-content: center;

  width: 100%;
  margin-top: 18px;
  padding: 18px;
}

/* Placeholder .slot du mini-card récap avec un fond visible sans image
   (le sélecteur `.summary-item .slot` du mockup fixe l'aspect-ratio uniquement). */
.summary .slot {
  background-color: var(--ag-paper-deep);
}

/* =============================================================
   U8 — Gate variant : masque les sections v2/v3 selon le panier
   ============================================================= */

/* Politique : le template rend le SUPERSET (v3), le JS retire les
   classes v2-only / v3-only quand il détecte une variante moindre.
   Cela garantit CDN-safe (HTML identique pour tous) tout en évitant
   un flash de sections inutiles. */
[data-tunnel-form-root][data-variant="free"] .v-paid,
[data-tunnel-form-root][data-variant="free"] .v2-only,
[data-tunnel-form-root][data-variant="free"] .v3-only {
  display: none !important;
}

[data-tunnel-form-root][data-variant="digital"] .v3-only {
  display: none !important;
}

/* Panier vide : ni formulaire ni récap. Le fallback PHP redirige vers
   /panier/ au chargement, mais un panier qui se vide sous une page déjà
   ouverte ne repasse jamais par le serveur — cet état est le filet. */

/* Les blocs de saisie et le récapitulatif, pas la section entière : le titre
   vit dedans, et `applyCheckoutVariant()` y écrit « Votre panier est vide ».
   Masquer la section effacerait le seul endroit où la page dit ce qui se passe. */
[data-tunnel-form-root][data-variant="empty"]
  .tunnel-layout
  > section
  > .tunnel-section,
[data-tunnel-form-root][data-variant="empty"] .tunnel-layout > aside {
  display: none !important;
}

.tunnel-empty {
  margin: var(--ag-space-lg) 0 var(--ag-space-4xl);
  font-size: var(--ag-text-md);
  color: var(--ag-ink);
}

.tunnel-empty a {
  color: var(--ag-accent);
  text-decoration: underline;
}

/* .field-row (2-col responsive) est déjà défini plus haut par le portage
   mockup (ligne 713) — on le réutilise tel quel. */

/* Section title (niveau intermédiaire entre form-sub et h1). */
.tunnel-section-title {
  margin: 0 0 12px;

  font-family: var(--ag-font-body);
  font-size: var(--ag-text-lg);
  font-weight: 600;
  color: var(--ag-ink);
}

/* Moyen de paiement : les cartes sélectionnables de la maquette
   (`.pay-method`, plus haut) reprises en lignes pleine largeur, avec le corps
   de l'option cochée déplié dessous. Les onglets qui occupaient cette place
   étaient l'invention du portage ; la maquette, elle, a toujours dessiné un
   choix, pas une navigation. */
.pay-method-block {
  overflow: hidden;
  border: 1px solid var(--ag-rule);
  border-radius: 4px;
}

/* La bordure et le rayon passent au bloc, qui enveloppe la ligne ET son
   corps : les garder sur la ligne dessinerait deux cadres emboîtés. */
.pay-method.is-row {
  flex-direction: row;
  gap: 14px;
  align-items: center;

  margin: 0;
  padding: 16px 18px;
  border: 0;
  border-radius: 0;

  text-align: left;
}

.pay-method.is-row input[type="radio"] {
  flex: 0 0 auto;
  margin: 0;
}

.pay-method-name {
  font-family: var(--ag-font-body);
  font-size: var(--ag-text-sm);
  text-transform: none;
  letter-spacing: normal;
}

.pay-method-body {
  padding: 0 18px 18px;
  border-top: 1px solid var(--ag-rule);
}

.pay-method-note {
  margin: 16px 0 0;
  font-size: var(--ag-text-sm);
  color: var(--ag-ink-soft);
}

/* Réserve la place du Payment Element pendant qu'il monte son iframe : sans
   elle le panneau passe d'environ 100 px (le seul « Chargement… ») à 226 px,
   et tout ce qui suit sursaute. Portée au panneau carte, et à lui seul —
   appliquée aux deux, elle imposait 200 px au panneau PayPal dont le bouton
   n'en occupe que 62, soit 138 px de vide. */
[data-pay-panel="card"] {
  min-height: 218px;
  padding-top: 18px;
}

/* `[hidden]` ne bat pas le `display: flex` de `.btn` — même spécificité, et
   c'est `.btn` qui est déclarée plus loin. Sans cette ligne, le bouton
   « Payer » restait affiché sur l'onglet PayPal, où il n'a rien à soumettre. */
.tunnel-cta[hidden] {
  display: none;
}

.pay-loading {
  padding: 40px 0;
  font-size: var(--ag-text-sm);
  color: var(--ag-ink-soft);
  text-align: center;
}

/* Mount point Payment Element — laisse Stripe faire son iframe rendering,
   on cadre juste un peu et on impose la bg pour que l'iframe hérite. */
#ag-payment-card {
  min-height: 44px;
}

/* =============================================================
   U10 — Shipping rates + dédicace
   ============================================================= */

/* Liste des tarifs de livraison sur /paiement/ variante physical. */
.ship-rate-list {
  display: flex;
  flex-direction: column;
  gap: 8px;

  margin: 0;
  padding: 0;

  list-style: none;
}

.ship-rate {
  cursor: pointer;

  display: flex;
  gap: 12px;
  align-items: flex-start;

  padding: 12px 14px;
  border: 1px solid var(--ag-rule);
  border-radius: 4px;
}

.ship-rate:has(input:checked) {
  border-color: var(--ag-ink);
  background: var(--ag-paper-deep);
}

.ship-rate input[type="radio"] {
  margin-top: 2px;
}

.ship-rate-body {
  flex: 1;
}

.ship-rate-title {
  font-family: var(--ag-font-body);
  font-weight: 500;
  color: var(--ag-ink);
}

.ship-rate-desc {
  margin-top: 2px;
  font-size: var(--ag-text-sm);
  color: var(--ag-ink-soft);
}

.ship-rate-price {
  font-family: var(--ag-font-mono);
  font-weight: 500;
  color: var(--ag-ink);
  white-space: nowrap;
}

/* Case à cocher dédicace + hint compact. */
.ag-checkbox {
  cursor: pointer;
  display: flex;
  gap: 12px;
  align-items: flex-start;
}

.ag-checkbox input[type="checkbox"] {
  margin-top: 4px;
}

.ag-checkbox-label {
  display: flex;
  flex-direction: column;
  gap: 4px;

  font-family: var(--ag-font-body);
  color: var(--ag-ink);
}

.ag-checkbox-hint {
  font-size: var(--ag-text-sm);
  font-weight: 400;
  color: var(--ag-ink-soft);
}

/* Bloc Expédition sur /merci/ physical. */
.confirm-shipping {
  margin-top: 32px;
  padding: 20px;
  border: 1px solid var(--ag-rule);
  border-radius: 4px;

  background: var(--ag-paper-deep);
}

.confirm-shipping h3 {
  margin: 0 0 12px;
  font-family: var(--ag-font-body);
  font-size: var(--ag-text-lg);
  font-weight: 600;
}

.confirm-shipping-lines {
  display: flex;
  flex-direction: column;
  gap: 6px;

  font-size: var(--ag-text-sm);
  color: var(--ag-ink);
}

.confirm-shipping-lines span {
  display: block;
}

/* =============================================================
   Divergences design gate — micro-UI paiement (paste after U10)
   ============================================================= */

/* Pastille numérotée à droite du titre de section — extension du
   `.tunnel-section-title` défini plus haut (U8), on ajoute juste le
   layout flex nécessaire pour faire flotter la pastille à droite. */
.tunnel-section-title:has(.tunnel-section-step) {
  display: flex;
  gap: 12px;
  align-items: baseline;
}

.tunnel-section-step {
  display: inline-flex;
  align-items: center;
  justify-content: center;

  min-width: 26px;
  height: 26px;
  padding: 0 8px;
  border-radius: 999px;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xs);
  font-weight: 500;
  color: var(--ag-accent-deep);

  background: var(--ag-paper-deep);
}

/* Sous-titre « — Mode d'expédition » sous adresse liv. */
.tunnel-section-subtitle {
  margin: 24px 0 12px;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xs);
  font-weight: 500;
  color: var(--ag-ink-soft);
  text-transform: uppercase;
  letter-spacing: 0.16em;
}

/* Label « (facultatif) » discret à côté d'un label de champ. */
.ag-optional {
  margin-left: 6px;

  font-family: var(--ag-font-body);
  font-size: var(--ag-text-xs);
  font-weight: 400;
  color: var(--ag-ink-soft);
  text-transform: none;
  letter-spacing: normal;
}

/* Le passage à l'acte, descendu sous le total du récapitulatif : c'est la
   place qu'il occupe déjà sur /panier/, et celle où la cliente vérifie ce
   qu'elle va payer. */
.summary-waiver,
.summary-optin {
  margin: 16px 0 0;
}

/* Le filet ouvre le groupe des consentements, il n'en sépare pas les cases :
   posé sur la première **visible**, la renonciation ne paraissant que sur un
   panier téléchargeable. */
.summary-waiver {
  margin-top: 20px;
  padding-top: 20px;
  border-top: 1px solid var(--ag-rule);
}

.summary-waiver[hidden] + .summary-optin {
  padding-top: 20px;
  border-top: 1px solid var(--ag-rule);
}

/* Texte de consentement : plus petit que le corps de la page. Ce sont des
   mentions qu'on lit une fois, dans une colonne étroite, sous un total qui
   doit rester ce que l'œil accroche en premier. */
.summary-waiver .ag-checkbox-title,
.summary-optin .ag-checkbox-title {
  font-size: var(--ag-text-sm);
  line-height: 1.45;
}

/* La précision passe sous le titre qu'elle précise : à taille égale — elles y
   étaient toutes deux — la hiérarchie disparaissait. */
.summary-optin .ag-checkbox-hint {
  font-size: var(--ag-text-xs);
  line-height: 1.45;
}

.summary-cta {
  margin: 18px 0 24px;
}

.summary-cta .tunnel-cta {
  justify-content: center;
  width: 100%;
}

/* Mention CGV sous le CTA — petite, sobre. */
.tunnel-cgv-notice {
  margin: 12px 0 0;
  font-size: var(--ag-text-xs);
  color: var(--ag-ink-soft);
  text-align: center;
}

.tunnel-cgv-notice a {
  color: var(--ag-ink-soft);
  text-decoration: underline;
}

.tunnel-cgv-notice a:hover {
  color: var(--ag-accent);
}

/* Erreur de soumission (carte + PayPal) — `[data-tunnel-error]` n'avait
   aucune règle avant ça : le message rendait en <p> par défaut, noyé sous
   le CTA et la mention CGV. */
.tunnel-submit-error {
  margin: 12px 0 0;
  padding: 12px 16px;
  border: 1px solid var(--ag-accent);
  border-radius: 4px;

  font-size: var(--ag-text-sm);
  font-weight: 500;
  color: var(--ag-accent-deep);
  text-align: center;

  background: var(--ag-rose);
}

/* .summary-contact : déjà défini plus haut, on réutilise tel quel. */

/* Dédicace variante « offert » — badge à droite du bloc. */
.ag-checkbox--offert {
  align-items: center;

  padding: 16px;
  border: 1px solid var(--ag-rule);
  border-radius: 4px;

  background: var(--ag-paper-deep);
}

.ag-checkbox-title {
  font-weight: 500;
  color: var(--ag-ink);
}

.ag-checkbox-badge {
  margin-left: auto;
  padding: 4px 10px;
  border-radius: 999px;

  font-family: var(--ag-font-mono);
  font-size: var(--ag-text-xs);
  font-weight: 500;
  color: var(--ag-secondary);
  text-transform: uppercase;
  letter-spacing: 0.14em;

  background: var(--ag-mint, #e6f4ec);
}

/* Gate variant complémentaire : sections « v-free » visibles UNIQUEMENT
   sur variante free (opposé de v-paid). Utilisé pour les inputs
   Prénom/Email qui n'ont pas de layout row en variante free. */
[data-tunnel-form-root][data-variant="digital"] .v-free,
[data-tunnel-form-root][data-variant="physical"] .v-free {
  display: none !important;
}
