/* =============================================================================
   AUDIO CORAN — DESIGN SYSTEM COMMUN
   assets/design/design-system.css
   -----------------------------------------------------------------------------
   Source unique de vérité pour l'écosystème Audio Coran :
   Accueil · Player audio · Coran · Adhkar.

   À charger AVANT la feuille de style propre à chaque application :
     <link rel="stylesheet" href="assets/design/design-system.css">
     <link rel="stylesheet" href="style.css">

   Logique de marque :
     • Émeraude  = ACTION  (boutons, liens, focus, états actifs)
     • Or        = ORNEMENT (enluminures, filets, accents décoratifs)

   Ne contient AUCUNE règle de mise en page propre à une app.
   Uniquement : tokens, base, thèmes, et composants réutilisables (préfixe .ds-).
   ========================================================================== */

/* -------------------------------------------------------------------------
   1. DESIGN TOKENS — mode sombre par défaut
   ---------------------------------------------------------------------- */
:root {
  /* — Palette brute — */
  --emerald:        #0F6D4C;
  --emerald-light:  #1FA97A;
  --gold:           #C9A24B;
  --gold-light:     #E8C97A;
  --offwhite:       #F6F3EA;
  --charcoal:       #14181B;
  --deep-black:     #0A0C0E;

  /* — Surfaces & fonds — */
  --bg:             var(--deep-black);
  --bg-elevated:    #101614;                     /* vert-noir des cartes */
  --surface:        rgba(31, 169, 122, 0.06);    /* voile émeraude, pas gris */
  --surface-strong: rgba(31, 169, 122, 0.11);

  /* — Bordures — */
  --border:         rgba(236, 234, 223, 0.09);
  --border-accent:  rgba(31, 169, 122, 0.32);    /* interactif = émeraude */
  --border-gold:    rgba(201, 162, 75, 0.30);    /* ornemental = or */

  /* — Texte — */
  --text:           #ECEAE0;
  --text-secondary: #AEB9B2;                     /* gris-vert, pas gris neutre */
  --text-tertiary:  #7E8B85;

  /* — Rôles sémantiques — */
  --accent:         var(--emerald-light);        /* actions, liens, focus */
  --accent-2:       var(--gold);                 /* enluminures */
  /* L'or porte parfois du texte : nom de module, référence de verset,
     étiquette de repli. Sur fond sombre, --accent-2 offre 8:1 et convient.
     Sur fond clair il tombe à 2,2:1, très en dessous du seuil lisible : ce
     token lui donne une déclinaison assombrie. Même rôle ornemental, même
     famille chromatique — seulement de quoi rester lisible. */
  --accent-2-text:  var(--gold);
  --primary:        var(--emerald-light);
  --secondary:      var(--gold);
  --success:        #1FA97A;
  --warning:        #E0A83E;
  --danger:         #E15252;

  /* — Ombres & halos — */
  --shadow-soft:    0 20px 60px rgba(0, 0, 0, 0.50);
  --shadow-card:    0 2px 14px rgba(0, 0, 0, 0.30);
  --shadow-glow:    0 0 40px rgba(31, 169, 122, 0.16);
  --halo:           radial-gradient(125% 460px at 50% -70px, rgba(15, 109, 76, 0.30), transparent 72%);
  --edge-gradient:  linear-gradient(90deg, transparent, var(--emerald-light), var(--gold), transparent);

  /* — Rayons — */
  --radius-xs:   8px;                            /* pastilles, vignettes, étiquettes */
  --radius-lg:   28px;
  --radius-md:   18px;
  --radius-sm:   12px;
  --radius-pill: 100px;

  /* — Typographie — */
  --font-display: "Amiri", Georgia, serif;
  --font-body:    "Inter", "Segoe UI", sans-serif;
  --font-mono:    "JetBrains Mono", monospace;

  /* Échelle typographique (fluide, cohérente partout) */
  --fs-xs:   0.75rem;   /* 12 */
  --fs-sm:   0.875rem;  /* 14 */
  --fs-base: 1rem;      /* 16 */
  --fs-md:   1.125rem;  /* 18 */
  --fs-lg:   1.375rem;  /* 22 */
  --fs-xl:   clamp(1.75rem, 4vw, 2.25rem);
  --fs-2xl:  clamp(2.25rem, 6vw, 3.25rem);

  --lh-tight:   1.2;
  --lh-normal:  1.55;
  --lh-relaxed: 1.7;

  --fw-regular:  400;
  --fw-medium:   500;
  --fw-semibold: 600;
  --fw-bold:     700;

  /* — Espacements (échelle 4pt) — */
  --sp-1: 4px;
  --sp-2: 8px;
  --sp-3: 12px;
  --sp-4: 16px;
  --sp-5: 20px;
  --sp-6: 24px;
  --sp-8: 32px;
  --sp-10: 40px;
  --sp-12: 48px;
  --sp-16: 64px;

  /* — Layout — */
  --header-h: 64px;
  --container: 1200px;
  --tap-min:  44px;             /* cible tactile minimale (a11y) */

  /* — Mouvement — */
  --ease-out:   cubic-bezier(0.16, 1, 0.3, 1);
  --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
  --dur-fast: 180ms;
  --dur-base: 300ms;
  --dur-slow: 600ms;

  color-scheme: dark;
}

/* -------------------------------------------------------------------------
   2. THÈME CLAIR
   ---------------------------------------------------------------------- */
[data-theme="light"] {
  --bg:             var(--offwhite);
  --bg-elevated:    #FFFFFF;
  --surface:        rgba(15, 109, 76, 0.05);
  --surface-strong: rgba(15, 109, 76, 0.09);
  --border:         rgba(20, 24, 27, 0.10);
  --border-accent:  rgba(15, 109, 76, 0.30);
  --border-gold:    rgba(168, 132, 47, 0.32);
  --text:           var(--charcoal);
  --text-secondary: rgba(20, 24, 27, 0.64);
  /* 0,44 donnait 2,8:1 sur crème — insuffisant pour les mentions et les
     aides, qui sont pourtant du texte à part entière. 0,62 les amène à
     4,8:1 sans les faire passer pour du texte courant. */
  --text-tertiary:  rgba(20, 24, 27, 0.62);
  --accent:         var(--emerald);
  --accent-2:       var(--gold);
  --accent-2-text:  #6A5320;                     /* or lisible : 6,6:1 sur crème */
  --primary:        var(--emerald);
  --secondary:      var(--gold);
  --shadow-soft:    0 20px 50px rgba(20, 24, 27, 0.12);
  --shadow-card:    0 2px 14px rgba(20, 24, 27, 0.08);
  --shadow-glow:    0 0 40px rgba(15, 109, 76, 0.12);
  --halo:           radial-gradient(125% 460px at 50% -70px, rgba(15, 109, 76, 0.10), transparent 72%);
  color-scheme: light;
}

/* -------------------------------------------------------------------------
   3. BASE PARTAGÉE
   ---------------------------------------------------------------------- */
::selection { background: var(--accent); color: var(--deep-black); }

:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 3px;
  border-radius: 6px;
}

/* Scrollbars cohérentes (WebKit + Firefox) */
* {
  scrollbar-width: thin;
  scrollbar-color: var(--border-accent) transparent;
}
*::-webkit-scrollbar { width: 10px; height: 10px; }
*::-webkit-scrollbar-track { background: transparent; }
*::-webkit-scrollbar-thumb {
  background: var(--surface-strong);
  border-radius: var(--radius-pill);
  border: 2px solid transparent;
  background-clip: padding-box;
}
*::-webkit-scrollbar-thumb:hover { background: var(--border-accent); background-clip: padding-box; }

/* Repli quand backdrop-filter n'est pas supporté */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .ds-blur { background: var(--bg) !important; }
}

/* Accessibilité : mouvement réduit */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

/* -------------------------------------------------------------------------
   4. COMPOSANTS RÉUTILISABLES (opt-in, préfixe .ds-)
   Utilisables tels quels dans toutes les apps sans collision.
   ---------------------------------------------------------------------- */

/* — Boutons — */
.ds-btn {
  display: inline-flex; align-items: center; justify-content: center;
  gap: var(--sp-2);
  min-height: var(--tap-min);
  padding: 0 var(--sp-5);
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: var(--fw-semibold);
  line-height: 1;
  /* Un libellé qui passe à la ligne double la hauteur du bouton et casse
     l'alignement de la rangée : il se tronque plutôt qu'il ne se replie. */
  white-space: nowrap;
  border-radius: var(--radius-pill);
  border: 1px solid transparent;
  cursor: pointer;
  transition: transform var(--dur-fast) var(--ease-out),
              background var(--dur-fast) var(--ease-out),
              border-color var(--dur-fast) var(--ease-out),
              box-shadow var(--dur-fast) var(--ease-out),
              opacity var(--dur-fast) var(--ease-out);
}
.ds-btn:active { transform: translateY(1px) scale(0.99); }
.ds-btn:disabled, .ds-btn[aria-disabled="true"] {
  opacity: 0.45; cursor: not-allowed; transform: none; pointer-events: none;
}

.ds-btn--primary {
  background: var(--accent);
  color: var(--deep-black);
  box-shadow: 0 6px 18px rgba(31, 169, 122, 0.28);
}
.ds-btn--primary:hover { transform: translateY(-1px); box-shadow: 0 10px 26px rgba(31, 169, 122, 0.38); }

.ds-btn--ghost {
  background: var(--surface);
  color: var(--text);
  border-color: var(--border);
}
.ds-btn--ghost:hover { background: var(--surface-strong); border-color: var(--border-accent); }

.ds-btn--icon {
  width: var(--tap-min); height: var(--tap-min); padding: 0;
  background: var(--surface); color: var(--text);
  border: 1px solid var(--border); border-radius: 50%;
}
.ds-btn--icon:hover { background: var(--surface-strong); border-color: var(--border-accent); }

/* — Carte — */
.ds-card {
  position: relative;
  background: var(--bg-elevated);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: var(--sp-6);
  box-shadow: var(--shadow-card);
  overflow: hidden;
}
.ds-card--glow::after {           /* liseré dégradé signature */
  content: ""; position: absolute; inset: 0; border-radius: inherit;
  padding: 1px; pointer-events: none;
  background: var(--edge-gradient);
  opacity: 0.35;
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor; mask-composite: exclude;
}

/* — Champs de saisie / search — */
.ds-input, .ds-search {
  width: 100%;
  min-height: var(--tap-min);
  padding: 0 var(--sp-4);
  font: var(--fw-regular) var(--fs-sm)/1.4 var(--font-body);
  color: var(--text);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  transition: border-color var(--dur-fast) var(--ease-out),
              background var(--dur-fast) var(--ease-out);
}
.ds-input::placeholder, .ds-search::placeholder { color: var(--text-tertiary); }
.ds-input:focus, .ds-search:focus {
  outline: none; border-color: var(--border-accent);
  background: var(--surface-strong);
}

/* — Badges / Chips / Tags — */
.ds-badge {
  display: inline-flex; align-items: center; gap: var(--sp-1);
  padding: 4px 12px;
  font-size: var(--fs-xs); font-weight: var(--fw-semibold);
  letter-spacing: 0.02em;
  color: var(--accent);
  background: color-mix(in srgb, var(--accent) 14%, transparent);
  border: 1px solid var(--border-accent);
  border-radius: var(--radius-pill);
}
.ds-chip {
  display: inline-flex; align-items: center; gap: var(--sp-2);
  min-height: 32px; padding: 0 var(--sp-3);
  font-size: var(--fs-sm); color: var(--text-secondary);
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-pill); cursor: pointer;
  transition: all var(--dur-fast) var(--ease-out);
}
.ds-chip:hover { color: var(--text); border-color: var(--border-accent); }
.ds-chip[aria-selected="true"], .ds-chip.is-active {
  color: var(--deep-black); background: var(--accent); border-color: var(--accent);
}

/* — Alertes — */
.ds-alert {
  display: flex; gap: var(--sp-3);
  padding: var(--sp-4);
  border: 1px solid var(--border);
  border-left-width: 3px;
  border-radius: var(--radius-sm);
  background: var(--surface);
  font-size: var(--fs-sm); color: var(--text-secondary);
}
.ds-alert--success { border-left-color: var(--success); }
.ds-alert--warning { border-left-color: var(--warning); }
.ds-alert--danger  { border-left-color: var(--danger); }

/* — Modale / Dialogue — */
.ds-modal-backdrop {
  position: fixed; inset: 0; z-index: 150;
  background: rgba(0, 0, 0, 0.55);
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
  display: grid; place-items: center; padding: var(--sp-4);
}
.ds-modal {
  width: min(96vw, 520px);
  background: var(--bg-elevated);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-soft);
  padding: var(--sp-8);
}

/* — Loader / Spinner — */
.ds-spinner {
  width: 28px; height: 28px; border-radius: 50%;
  border: 3px solid var(--surface-strong);
  border-top-color: var(--accent);
  animation: ds-spin 0.8s linear infinite;
}
@keyframes ds-spin { to { transform: rotate(360deg); } }

/* — Skeleton — */
.ds-skeleton {
  background: linear-gradient(100deg, var(--surface) 30%, var(--surface-strong) 50%, var(--surface) 70%);
  background-size: 200% 100%;
  border-radius: var(--radius-sm);
  animation: ds-shimmer 1.4s ease-in-out infinite;
}
@keyframes ds-shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }

/* — Pagination — */
.ds-pagination { display: flex; gap: var(--sp-2); align-items: center; flex-wrap: wrap; }
.ds-pagination button {
  min-width: var(--tap-min); min-height: var(--tap-min);
  padding: 0 var(--sp-3);
  color: var(--text-secondary);
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  transition: all var(--dur-fast) var(--ease-out);
}
.ds-pagination button:hover { color: var(--text); border-color: var(--border-accent); }
.ds-pagination button[aria-current="page"] {
  color: var(--deep-black); background: var(--accent); border-color: var(--accent);
}

/* — Filet dégradé signature (séparateur) — */
.ds-edge { height: 1px; border: 0; background: var(--edge-gradient); opacity: 0.5; }

/* — Utilitaires — */
.ds-visually-hidden {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip: rect(0 0 0 0); white-space: nowrap; border: 0; padding: 0; margin: -1px;
}
.ds-container { width: 100%; max-width: var(--container); margin-inline: auto; padding-inline: clamp(16px, 4vw, 48px); }
/* -------------------------------------------------------------------------
   CONTRÔLE ROND — bascule de thème, actions isolées d'un en-tête.

   RÈGLE PERDUE, RÉTABLIE. Seuls subsistaient :hover, :active, :focus-visible
   et le dimensionnement des icônes : le bloc de base avait disparu de la
   feuille. Les boutons des trois studios s'affichaient donc en icônes nues —
   sans bordure, sans fond, sans hauteur de 44px, sans rayon. C'est la cause
   réelle des en-têtes « cassés » de Studio Versets, Studio Posts et Studio
   Vidéo : le balisage était correct, le style manquait.

   Deux indices confirmaient la perte : `:hover` pilote `border-color` alors
   qu'aucune bordure n'était déclarée, et la section « réseaux sociaux » se
   décrit comme « même famille visuelle que les contrôles ronds .ac-ctrl ».

   Valeurs reprises telles quelles de `.topbar .icon-btn` (style.css) pour que
   la bascule de thème soit rigoureusement identique dans les studios et sur
   le site public.
   ---------------------------------------------------------------------- */
.ac-ctrl {
  display: inline-grid; place-items: center; flex: none;
  width: var(--tap-min); height: var(--tap-min);
  padding: 0;
  color: var(--text-secondary);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  cursor: pointer;
  transition: color var(--dur-fast) var(--ease-out),
              border-color var(--dur-fast) var(--ease-out),
              background var(--dur-fast) var(--ease-out),
              transform var(--dur-fast) var(--ease-out);
}
.ac-ctrl:hover { border-color: var(--border-accent); color: var(--text); background: var(--surface-strong); }
.ac-ctrl:active { transform: scale(0.95); }
.ac-ctrl:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.ac-ctrl svg, .ac-ctrl .icon { width: 19px; height: 19px; }

/* — Le bouton — même famille que .ac-ctrl : bordure, rayon pilule, 44px. */
.ac-apps__btn {
  display: inline-flex; align-items: center; gap: var(--sp-2);
  min-height: var(--tap-min); padding: 0 var(--sp-4);
  font-family: var(--font-body);
  font-size: var(--fs-sm); font-weight: var(--fw-semibold);
  white-space: nowrap;
  color: var(--text);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  cursor: pointer;
  transition: border-color var(--dur-fast) var(--ease-out),
              background var(--dur-fast) var(--ease-out),
              transform var(--dur-fast) var(--ease-out);
}
.ac-apps__btn:hover { background: var(--surface-strong); border-color: var(--border-accent); }
.ac-apps__btn:active { transform: scale(0.97); }
.ac-apps__btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.ac-apps__btn[aria-expanded="true"] {
  color: var(--deep-black); background: var(--accent); border-color: var(--accent);
}
.ac-apps__ico { flex: none; width: 17px; height: 17px; }

/* Sous 560px, le libellé cède la place : la grille de points suffit à
   identifier un sélecteur d'applications, et l'en-tête garde son air. */
@media (max-width: 559px) {
  .ac-apps__btn { width: var(--tap-min); padding: 0; justify-content: center; }
  .ac-apps__label { position: absolute; width: 1px; height: 1px; overflow: hidden;
                    clip: rect(0 0 0 0); white-space: nowrap; }
}

/* — Le panneau — */
/* L'ENVELOPPE — corrige un ancrage fautif.
   .ac-apps__panel est en `position: absolute`, mais son hôte .ac-apps
   n'avait aucune règle : le panneau se calait donc sur le premier ancêtre
   positionné rencontré (souvent l'en-tête entier, parfois le bloc initial),
   d'où un menu décalé, collé au bord de l'écran ou sorti sous l'encoche.
   `position: relative` le raccroche à son bouton, comme prévu.
   `display: inline-flex` évite en prime qu'un <div> en bloc casse
   l'alignement vertical dans la rangée d'actions. */
.ac-apps {
  position: relative;
  display: inline-flex; align-items: center; flex: none;
}
.ac-apps__panel {
  position: absolute; top: calc(100% + var(--sp-3)); right: 0; z-index: 95;
  width: min(92vw, 460px);
  padding: var(--sp-4);
  background: var(--bg-elevated);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-soft);
  transform-origin: top right;
  animation: ac-apps-in var(--dur-fast) var(--ease-out);
}
.ac-apps__panel[hidden] { display: none; }
/* Filet dégradé signature en tête du panneau — ornemental. */
.ac-apps__panel::before {
  content: ""; position: absolute; inset: 0 0 auto 0; height: 2px;
  border-radius: var(--radius-lg) var(--radius-lg) 0 0;
  background: var(--edge-gradient); opacity: 0.55;
}
@keyframes ac-apps-in { from { opacity: 0; transform: translateY(-8px) scale(0.98); } }

.ac-apps__title {
  margin: 0 0 var(--sp-3); padding: 0 var(--sp-2);
  font-family: var(--font-body);
  font-size: var(--fs-xs); font-weight: var(--fw-semibold);
  letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--text-tertiary);
}

.ac-apps__grid { display: grid; gap: var(--sp-1); }
/* Deux colonnes dès que la largeur le permet — sept entrées en une colonne
   font un menu qu'il faut faire défiler. */
@media (min-width: 420px) { .ac-apps__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

.ac-apps__item {
  display: flex; align-items: center; gap: var(--sp-3);
  min-height: var(--tap-min);
  padding: var(--sp-2) var(--sp-3);
  text-decoration: none; color: var(--text);
  border-radius: var(--radius-sm);
  transition: background var(--dur-fast) var(--ease-out);
}
.ac-apps__item:hover { background: var(--surface-strong); }
.ac-apps__item:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.ac-apps__item.is-current { background: var(--surface); }
.ac-apps__item.is-current .ac-apps__item-nom { color: var(--accent); }
.ac-apps__item.is-current .ac-apps__item-ico {
  color: var(--deep-black); background: var(--accent); border-color: var(--accent);
}

.ac-apps__item-ico {
  flex: none;
  display: grid; place-items: center;
  width: 36px; height: 36px;
  color: var(--accent);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  transition: color var(--dur-fast) var(--ease-out),
              background var(--dur-fast) var(--ease-out),
              border-color var(--dur-fast) var(--ease-out);
}
.ac-apps__item-ico .icon,
.ac-apps__item-ico svg { width: 18px; height: 18px; }

.ac-apps__item-txt { min-width: 0; display: grid; gap: 1px; }
.ac-apps__item-nom {
  font-family: var(--font-body);
  font-size: var(--fs-sm); font-weight: var(--fw-semibold); line-height: 1.3;
}
.ac-apps__item-desc {
  font-size: var(--fs-xs); line-height: 1.35;
  color: var(--text-tertiary);
  /* Une description qui passe à trois lignes déséquilibre la grille : elle se
     tronque plutôt qu'elle ne repousse la carte voisine. */
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}

@media (prefers-reduced-motion: reduce) {
  .ac-apps__btn, .ac-apps__item, .ac-apps__item-ico { transition: none; }
  .ac-apps__btn:active { transform: none; }
  .ac-apps__panel { animation: none; }
}

/* — Le couple « thème + applications », réuni par ac-shell.js —
   L'écart entre les deux appartient à CE conteneur, pas à l'en-tête qui
   l'accueille. Chaque barre a son propre `gap` — 10px sur l'accueil, 12 puis
   22px sur écran large dans /coran-app/, autre chose dans /marque-page/ — et
   le couple paraissait donc plus ou moins serré d'une page à l'autre. Ici,
   l'espacement est le même partout. */
.ac-actions {
  display: inline-flex; align-items: center;
  flex: 0 0 auto;
  gap: 10px;
}

/* Placement — le groupe pousse tout le reste à gauche.
   Le sélecteur est volontairement limité à un enfant DIRECT de .topbar :
   dans /coran-app/, la marque porte déjà `margin-inline-end: auto` et deux
   marges automatiques se partageraient l'espace libre, ce qui centrerait le
   groupe au lieu de le coller à droite. Là-bas, il est descendant de
   .coran-topbar__inner : la règle ne s'y applique pas, et la marge de la
   marque suffit. */
.topbar > .ac-actions { margin-left: auto; }

@media print { .ac-apps { display: none !important; } }

/* Sous-liens du pied de page — conservés : une application peut de nouveau
   en déclarer, et la règle ne coûte rien tant qu'aucune ne le fait. */
.site-footer__sublinks {
  margin: 4px 0 8px 26px;
  padding-left: var(--sp-3);
  list-style: none;
  border-left: 1px solid var(--border);
}
.site-footer__sublinks a {
  display: inline-flex; align-items: center;
  min-height: 34px;
  font-size: var(--fs-sm);
  color: var(--text-tertiary);
  text-decoration: none;
  transition: color var(--dur-fast) var(--ease-out);
}
.site-footer__sublinks a:hover { color: var(--accent); }
@media (prefers-reduced-motion: reduce) { .site-footer__sublinks a { transition: none; } }


/* -------------------------------------------------------------------------
   LIEN D'ÉVITEMENT — accessibilité clavier
   Première cible tabulable de la page : permet de sauter l'en-tête et la
   barre « applications » pour atteindre directement le contenu. Invisible
   tant qu'il n'a pas le focus.
   ---------------------------------------------------------------------- */
.ac-skip {
  position: fixed;
  top: var(--sp-2);
  left: 50%;
  transform: translate(-50%, -160%);
  z-index: 1000;
  display: inline-flex; align-items: center;
  min-height: var(--tap-min);
  padding: 0 var(--sp-5);
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: var(--fw-semibold);
  color: var(--deep-black);
  background: var(--accent);
  border-radius: var(--radius-pill);
  box-shadow: var(--shadow-soft);
  text-decoration: none;
  transition: transform var(--dur-fast) var(--ease-out);
}
.ac-skip:focus-visible,
.ac-skip:focus {
  transform: translate(-50%, 0);
  outline: 2px solid var(--text);
  outline-offset: 2px;
}

/* -------------------------------------------------------------------------
   ATOMES DE MARQUE PARTAGÉS
   Utilisés par l'en-tête et les deux variantes de pied de page (complet et
   compact). Placés ici et non dans style.css : le Coran et les Adhkar ne
   chargent pas la feuille racine. Le chemin ../icons/ est relatif à CE
   fichier (assets/design/), donc valable depuis toutes les pages.
   ---------------------------------------------------------------------- */
.brand-logo {
  display: inline-block; flex-shrink: 0;
  /* Taille fluide : 128px sur un iPhone SE (320px), 179px à partir de ~430px.
     La valeur fixe précédente occupait près de la moitié de la largeur d'écran
     sur mobile et écrasait le contenu. */
  width: clamp(128px, 34vw, 179px);
  height: clamp(24px, 6.4vw, 34px);
  background: url("../icons/logo.svg") no-repeat left center / contain;
}
[data-theme="light"] .brand-logo { background-image: url("../icons/logo-light.svg"); }

/* Le logo du pied de page marketing est cliquable et ramène à l'accueil, comme
   celui de la variante compacte. `inline-flex` est nécessaire : sans lui,
   l'ancre s'étendrait sur toute la largeur de la colonne et la zone cliquable
   déborderait largement du logo. */
.site-footer__brand-link {
  display: inline-flex;
  border-radius: var(--radius-sm);
  transition: opacity var(--dur-fast) var(--ease-out);
}
.site-footer__brand-link:hover { opacity: 0.82; }
.site-footer__brand-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }
@media (prefers-reduced-motion: reduce) { .site-footer__brand-link { transition: none; } }

/* Déclinaison du pied de page complet — un cran sous le logo d'en-tête. */
.site-footer__brand-logo {
  /* Minimum relevé de 120 à 136px : à 112-120px la signature devenait
     difficile à lire sur petit écran. Le plafond desktop ne bouge pas. */
  width: clamp(136px, 36vw, 158px);
  height: clamp(26px, 6.8vw, 30px);
  margin-bottom: 14px;
}

/* Réseaux sociaux — même famille visuelle que les contrôles ronds .ac-ctrl.
   44px = cible tactile minimale (--tap-min). */
.site-footer__social { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; }
.site-footer__social-link {
  display: inline-grid; place-items: center;
  width: var(--tap-min); height: var(--tap-min);
  color: var(--text-tertiary);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 50%;
  transition: color var(--dur-fast) var(--ease-out),
              border-color var(--dur-fast) var(--ease-out),
              background var(--dur-fast) var(--ease-out),
              transform var(--dur-fast) var(--ease-out);
}
.site-footer__social-link:hover {
  color: var(--accent); background: var(--surface-strong);
  border-color: var(--border-accent); transform: translateY(-2px);
}
.site-footer__social-link:active { transform: translateY(0) scale(0.95); }
.site-footer__social-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.site-footer__social-link .icon { width: 19px; height: 19px; }

/* Signature Kito Digital */
.kito-credit { color: var(--text-secondary); font-weight: 700; text-decoration: none; transition: color var(--dur-fast); }
.kito-credit:hover { color: var(--text); }
.kito-credit__digital {
  background: linear-gradient(90deg, #7C5CFF, #2EE5FF);
  -webkit-background-clip: text; background-clip: text; color: transparent;
}


/* =============================================================================
   SUITE STUDIO — bibliothèque commune aux outils de production
   -----------------------------------------------------------------------------
   Studio Versets · Studio Posts · Studio Vidéo partagent exactement ces
   composants. Un même geste doit produire la même réaction visuelle dans les
   trois modules : c'est ici, et nulle part ailleurs, que se décide l'apparence
   d'un bouton, d'un champ, d'un onglet, d'un accordéon ou d'une notification.

   AJOUT PUREMENT ADDITIF : aucune règle antérieure de ce fichier n'est
   modifiée. Les applications Accueil, Player, Coran, Adhkar et Wallpapers ne
   sont donc pas affectées.

   Contrat de géométrie — à ne pas contourner dans les feuilles d'application :
     • toute cible interactive     ≥ 44px  (--tap-min)
     • bouton                      rayon pilule
     • champ, carte compacte       rayon 12px (--radius-sm)
     • carte, panneau, modale      rayon 18/28px (--radius-md / --radius-lg)
     • état sélectionné            fond émeraude plein, texte --deep-black
     • anneau de focus             2px émeraude, décalage 2px
     • réaction immédiate          --dur-fast · déplacement de bloc --dur-base
   ========================================================================== */

:root {
  --studio-appbar-h: 60px;   /* hauteur de la barre supérieure des studios */
  --studio-navbar-h: 62px;   /* barre d'onglets basse (mobile) */

  /* Place RÉELLEMENT occupée par la barre supérieure, encoche comprise.
     C'est ce décalage — et non --studio-appbar-h seul — que doivent utiliser
     les blocs collants placés dessous, sinon ils glissent sous la barre sur
     iPhone en mode installé. Hors encoche, env() vaut 0 : valeurs inchangées. */
  --studio-appbar-offset: calc(var(--studio-appbar-h) + env(safe-area-inset-top, 0px));
}

/* -------------------------------------------------------------------------
   S1. BARRE SUPÉRIEURE DES STUDIOS
   Identique dans les trois modules : marque, nom du module, actions propres à
   l'outil, sélecteur de studio, bascule de thème — toujours dans cet ordre.
   ---------------------------------------------------------------------- */
.ac-appbar {
  position: sticky; top: 0; z-index: 60; flex: 0 0 auto;
  border-bottom: 1px solid var(--border);
  background: color-mix(in srgb, var(--bg) 82%, transparent);
  -webkit-backdrop-filter: blur(16px) saturate(140%);
          backdrop-filter: blur(16px) saturate(140%);

  /* Encoche iPhone — en mode « installé » (standalone), la barre commence à
     y=0, donc sous l'heure et la batterie. Le retrait se pose ici, sur la
     bande elle-même, et non sur .ac-appbar__inner : ainsi le fond flouté
     monte bien jusqu'en haut de l'écran au lieu de laisser un bandeau nu.
     Hors encoche, env() vaut 0 : aucun effet sur les autres plateformes. */
  padding-top: env(safe-area-inset-top, 0px);
}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .ac-appbar { background: var(--bg-elevated); }
}
/* Filet dégradé signature — ornemental, comme sur les cartes. */
.ac-appbar::after {
  content: ""; position: absolute; inset: auto 0 -1px 0; height: 1px;
  background: var(--edge-gradient); opacity: 0.5; pointer-events: none;
}
.ac-appbar__inner {
  display: flex; align-items: center; flex-wrap: nowrap; gap: var(--sp-3);
  width: 100%; max-width: var(--container); margin-inline: auto;
  min-height: var(--studio-appbar-h);
  /* Mêmes gouttières que .topbar (style.css) : le logo et les pilules
     s'alignent au pixel près entre le site public et les studios. */
  padding-block: var(--sp-2);
  padding-right: calc(clamp(16px, 4vw, 48px) + env(safe-area-inset-right));
  padding-left:  calc(clamp(16px, 4vw, 48px) + env(safe-area-inset-left));
}
/* Pleine largeur — utilisée par les trois studios, comme la .topbar publique. */
.ac-appbar--fluid .ac-appbar__inner { max-width: none; }

.ac-appbar__brand {
  display: inline-flex; align-items: center; gap: var(--sp-2);
  min-width: 0; text-decoration: none; color: var(--text);
  border-radius: var(--radius-sm);
}
/* .ac-appbar__mark et .ac-appbar__name ont été retirés : ils habillaient la
   marque textuelle « ◈ Audio-Coran », remplacée par le logo .brand-logo du
   site public. Plus aucun élément ne les portait. */

/* Nom du module — ornement, donc or. Jamais un état, jamais cliquable. */
.ac-appbar__module {
  flex: none;
  display: inline-flex; align-items: center;
  padding: 3px 11px;
  font-size: var(--fs-xs); font-weight: var(--fw-semibold); letter-spacing: 0.02em;
  white-space: nowrap;
  color: var(--accent-2-text);
  background: color-mix(in srgb, var(--accent-2) 12%, transparent);
  border: 1px solid var(--border-gold);
  border-radius: var(--radius-pill);
}
.ac-appbar__actions { display: flex; align-items: center; flex-wrap: nowrap; gap: var(--sp-2); margin-left: auto; min-width: 0; }
.ac-appbar__sep { flex: none; width: 1px; height: 24px; background: var(--border); }

@media (max-width: 640px) {
  .ac-appbar__module { display: none; }
  .ac-appbar__sep { display: none; }
  .ac-appbar__inner { gap: var(--sp-2); }
  /* Pictogramme seul : le libellé reste dans aria-label, la cible garde 44px. */
  .ac-appbar__actions .ds-btn:not(.ds-btn--icon) {
    width: var(--tap-min); padding: 0;
  }
  .ac-appbar__actions .ds-btn .btn-label { display: none; }
}
/* Même correction que .ac-apps : l'hôte du sélecteur de studio n'était pas
   positionné, si bien que son menu — en `position: absolute` — s'ancrait sur
   .ac-appbar (élément collant, donc bloc conteneur) et non sur son bouton.
   Résultat : un menu plaqué au bord droit de la fenêtre, hors du gabarit et
   sous l'encoche sur iPhone. C'est ce qui « cassait » visuellement l'en-tête
   de Studio Versets et de Studio Posts. */
.studio-switch {
  position: relative;
  display: inline-flex; align-items: center; flex: none;
}
.studio-switch__menu {
  position: absolute; top: calc(100% + var(--sp-2)); right: 0; z-index: 70;
  /* Ne jamais déborder de la fenêtre sur petit écran, encoche comprise. */
  max-width: calc(100vw - var(--sp-4) - env(safe-area-inset-right, 0px)
                          - env(safe-area-inset-left, 0px));
  min-width: 232px; padding: var(--sp-2);
  background: var(--bg-elevated);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-soft);
  transform-origin: top right;
  animation: ac-menu-in var(--dur-fast) var(--ease-out);
}
.studio-switch__menu[hidden] { display: none; }
@keyframes ac-menu-in { from { opacity: 0; transform: translateY(-6px) scale(0.98); } }
.studio-switch__item {
  display: flex; align-items: center; gap: var(--sp-3);
  width: 100%; min-height: var(--tap-min);
  padding: var(--sp-2) var(--sp-3);
  font-family: var(--font-body); font-size: var(--fs-sm); font-weight: var(--fw-medium);
  text-align: left; text-decoration: none; color: var(--text);
  background: none; border: 0; border-radius: var(--radius-sm); cursor: pointer;
  transition: background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
}
.studio-switch__item:hover { background: var(--surface-strong); }
.studio-switch__item:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.studio-switch__item[aria-current="true"] { color: var(--accent); background: var(--surface); }
.studio-switch__ico { flex: none; width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; }
.studio-switch__label { min-width: 0; }
.studio-switch__label small { display: block; font-size: var(--fs-xs); font-weight: var(--fw-regular); color: var(--text-tertiary); }
.studio-switch__title {
  padding: var(--sp-2) var(--sp-3) var(--sp-1);
  font-size: var(--fs-xs); font-weight: var(--fw-semibold);
  letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-tertiary);
}

/* -------------------------------------------------------------------------
   S3. BOUTONS — complément à .ds-btn (mêmes proportions, mêmes états)
   ---------------------------------------------------------------------- */
.ds-btn--sm   { min-height: 36px; padding: 0 var(--sp-4); font-size: var(--fs-xs); }
.ds-btn--danger {
  background: var(--surface); color: var(--danger); border-color: var(--border);
}
.ds-btn--danger:hover {
  background: color-mix(in srgb, var(--danger) 14%, transparent);
  border-color: color-mix(in srgb, var(--danger) 40%, transparent);
}
/* Confirmation d'une action réussie — « Copié », « Enregistré ». */
.ds-btn.is-done {
  background: var(--success); color: var(--deep-black);
  border-color: transparent; box-shadow: none;
}
.ds-btn--icon.ds-btn--sm { width: 36px; height: 36px; min-height: 36px; }
.ds-btn svg, .ds-btn .icon { flex: none; width: 17px; height: 17px; }
.ds-btn--sm svg, .ds-btn--sm .icon { width: 15px; height: 15px; }
.ds-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* -------------------------------------------------------------------------
   S4. CHAMPS — un seul gabarit pour input, select, textarea
   ---------------------------------------------------------------------- */
.ds-textarea, .ds-select {
  display: block; width: 100%; min-width: 0; min-height: var(--tap-min);
  padding: var(--sp-3) var(--sp-4);
  /* 16px minimum : en dessous, Safari iOS zoome à la mise au point. */
  font-family: var(--font-body); font-size: max(16px, var(--fs-sm)); line-height: 1.4;
  color: var(--text); background: var(--surface);
  border: 1px solid var(--border); border-radius: var(--radius-sm);
  transition: border-color var(--dur-fast) var(--ease-out),
              background   var(--dur-fast) var(--ease-out);
}
.ds-input { padding: var(--sp-3) var(--sp-4); font-size: max(16px, var(--fs-sm)); }
.ds-input:hover:not(:disabled),
.ds-textarea:hover:not(:disabled),
.ds-select:hover:not(:disabled) { border-color: var(--border-accent); }
.ds-textarea::placeholder { color: var(--text-tertiary); }
.ds-textarea:focus, .ds-select:focus {
  outline: none; border-color: var(--border-accent); background: var(--surface-strong);
}
.ds-input:disabled, .ds-textarea:disabled, .ds-select:disabled { opacity: 0.45; cursor: not-allowed; }
.ds-input[aria-invalid="true"], .ds-textarea[aria-invalid="true"] {
  border-color: var(--danger);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--danger) 18%, transparent);
}
.ds-textarea { resize: vertical; min-height: 96px; line-height: var(--lh-relaxed); }

/* Chevron unique pour TOUS les menus déroulants de la suite. La data-URI ne
   pouvant pas lire var(), la variante claire est fournie explicitement. */
.ds-select {
  appearance: none; -webkit-appearance: none; cursor: pointer;
  padding-right: var(--sp-10); text-overflow: ellipsis;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23AEB9B2' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right var(--sp-4) center;
}
[data-theme="light"] .ds-select {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%235B6165' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
}
.ds-select option { background: var(--bg-elevated); color: var(--text); }

/* Curseur — même piste, même pastille partout. */
.ds-range {
  width: 100%; height: var(--tap-min); margin: 0; padding: 0;
  background: transparent; appearance: none; -webkit-appearance: none;
  cursor: pointer; border: none;
}
.ds-range::-webkit-slider-runnable-track { height: 4px; border-radius: var(--radius-pill); background: var(--surface-strong); }
.ds-range::-moz-range-track            { height: 4px; border-radius: var(--radius-pill); background: var(--surface-strong); }
.ds-range::-webkit-slider-thumb {
  appearance: none; -webkit-appearance: none;
  width: 16px; height: 16px; margin-top: -6px; border-radius: 50%;
  background: var(--accent); border: 2px solid var(--bg);
  transition: transform var(--dur-fast) var(--ease-out);
}
.ds-range::-moz-range-thumb {
  width: 16px; height: 16px; border-radius: 50%;
  background: var(--accent); border: 2px solid var(--bg);
}
.ds-range:hover::-webkit-slider-thumb  { transform: scale(1.15); }
.ds-range:active::-webkit-slider-thumb { transform: scale(1.25); }
.ds-range:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-pill); }

/* Interrupteur */
.ds-switch { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); min-height: var(--tap-min); }
.ds-switch__label { font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
.ds-toggle {
  position: relative; flex: none; width: 48px; height: 28px; padding: 0;
  background: color-mix(in srgb, var(--text-secondary) 34%, transparent);
  border: 0; border-radius: var(--radius-pill); cursor: pointer;
  transition: background var(--dur-fast) var(--ease-out);
}
.ds-toggle::after {
  content: ""; position: absolute; top: 3px; left: 3px; width: 22px; height: 22px;
  border-radius: 50%; background: #FFFFFF;
  transition: transform var(--dur-fast) var(--ease-out);
}
.ds-toggle[aria-checked="true"] { background: var(--accent); }
.ds-toggle[aria-checked="true"]::after { transform: translateX(20px); }
.ds-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* -------------------------------------------------------------------------
   S5. ONGLETS — variante filet (dans un panneau) et variante pilule (barre)
   ---------------------------------------------------------------------- */
.ds-tabs { display: flex; gap: var(--sp-1); }
.ds-tabs--line { padding: var(--sp-3) var(--sp-4) 0; border-bottom: 1px solid var(--border); }
.ds-tabs--line .ds-tab {
  flex: 1; min-height: var(--tap-min); padding: 0 var(--sp-2);
  font-family: var(--font-body); font-size: var(--fs-sm); font-weight: var(--fw-semibold);
  color: var(--text-secondary); background: none;
  border: 0; border-bottom: 2px solid transparent; cursor: pointer;
  transition: color var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out);
}
.ds-tabs--line .ds-tab:hover { color: var(--text); }
.ds-tabs--line .ds-tab[aria-selected="true"], .ds-tabs--line .ds-tab.is-active {
  color: var(--accent); border-bottom-color: var(--accent);
}
.ds-tab:focus-visible { outline: 2px solid var(--accent); outline-offset: -3px; border-radius: var(--radius-sm); }

.ds-tabs--pill {
  padding: var(--sp-1); background: var(--surface);
  border: 1px solid var(--border); border-radius: var(--radius-pill);
  overflow-x: auto; scrollbar-width: none;
}
.ds-tabs--pill::-webkit-scrollbar { display: none; }
.ds-tabs--pill .ds-tab {
  flex: 1 0 auto;
  display: inline-flex; align-items: center; justify-content: center; gap: var(--sp-2);
  min-height: var(--tap-min); padding: 0 var(--sp-4);
  font-family: var(--font-body); font-size: var(--fs-sm); font-weight: var(--fw-semibold);
  color: var(--text-secondary); background: none; border: 0;
  border-radius: var(--radius-pill); cursor: pointer;
  transition: color var(--dur-fast) var(--ease-out), background var(--dur-fast) var(--ease-out);
}
.ds-tabs--pill .ds-tab:hover:not([aria-selected="true"]) { color: var(--text); background: var(--surface-strong); }
.ds-tabs--pill .ds-tab[aria-selected="true"] { color: var(--deep-black); background: var(--accent); }

/* -------------------------------------------------------------------------
   S6. CONTRÔLE SEGMENTÉ — choix exclusif parmi 2 à 6 options
   Une seule apparence dans toute la suite : puits en pilule, option retenue
   en émeraude pleine. Fonctionne avec <button aria-checked|aria-pressed> et
   avec <input type=radio> + <label>.
   ---------------------------------------------------------------------- */
.ds-seg {
  position: relative;   /* ancre les <input type=radio> masqués ci-dessous */
  display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr);
  gap: var(--sp-1); padding: var(--sp-1);
  align-items: stretch;
  background: var(--surface); border: 1px solid var(--border);
  /* Rayon de carte et non pilule.
     -------------------------------------------------------------------
     Le rayon pilule ne tient que si le puits reste bas. Dès qu'un libellé
     passe sur deux lignes — « Sourate entière » dans une colonne étroite —
     ou que le groupe s'empile, le puits devient une grande capsule ovale
     qui pèse plus que les options qu'elle contient. Un rayon de carte
     donne exactement la même lecture à toutes les hauteurs. */
  border-radius: var(--radius-md);
}
/* Le puits devient sa propre référence de mesure : ses libellés se
   dimensionnent sur LUI, pas sur la fenêtre. Voir la note sur `cqi` plus bas.
   Le `position: relative` ci-dessus reste l'ancre des <input> masqués — la
   containment de type `inline-size` ne change rien à ce point. */
@supports (container-type: inline-size) {
  .ds-seg { container-type: inline-size; }
}
.ds-seg--wrap { grid-auto-flow: row; }
.ds-seg input {
  position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none;
}
.ds-seg > button, .ds-seg > label {
  display: flex; align-items: center; justify-content: center; gap: var(--sp-1);
  margin: 0; min-width: 0; min-height: var(--tap-min);
  padding: var(--sp-2) var(--sp-3);
  font-family: var(--font-body);
  font-size: clamp(12px, 3.2vw, var(--fs-sm)); font-weight: var(--fw-semibold);
  line-height: 1.25; text-align: center;
  /* `balance` répartit un libellé de deux mots sur deux lignes égales au
     lieu de laisser un mot seul en bas ; `anywhere` reste le filet de
     sécurité pour un mot plus large que sa colonne. */
  text-wrap: balance; overflow-wrap: anywhere;
  font-variant-numeric: tabular-nums;
  color: var(--text-secondary); background: none; border: 0;
  border-radius: var(--radius-sm); cursor: pointer;
  transition: color      var(--dur-fast) var(--ease-out),
              background var(--dur-fast) var(--ease-out);
}
/* MESURE AU CONTENEUR, PAS À LA FENÊTRE.
   `clamp(12px, 3.2vw, --fs-sm)` ci-dessus rapporte la taille du texte à la
   LARGEUR DE FENÊTRE. Or ce contrôle vit le plus souvent dans une colonne
   étroite : 380px pour la colonne de réglages de Studio Posts. Sur un écran
   de 1440px, 3.2vw vaut 46px, donc la borne haute s'appliquait toujours —
   le texte restait au maximum quelle que soit l'étroitesse réelle du puits,
   et les libellés s'écrasaient.

   `cqi` mesure le puits lui-même : à 340px de large il donne ~14px, à 200px
   ~10.5px (plancher 12px). Le rembourrage suit la même logique, ce qui rend
   ~9px de largeur de texte par segment dans la colonne de réglages.

   La déclaration en `vw` reste au-dessus : les navigateurs sans requêtes de
   conteneur la conservent, aucun n'est laissé sans taille. */
@supports (container-type: inline-size) {
  .ds-seg > button, .ds-seg > label {
    font-size: clamp(12px, 4.6cqi, var(--fs-sm));
    padding-inline: clamp(var(--sp-1), 3cqi, var(--sp-3));
  }
}
.ds-seg > button:hover:not(:disabled):not([aria-checked="true"]):not([aria-pressed="true"]),
.ds-seg > label:hover { color: var(--text); background: var(--surface-strong); }
.ds-seg > button[aria-checked="true"],
.ds-seg > button[aria-pressed="true"],
.ds-seg input:checked + label {
  color: var(--deep-black); background: var(--accent);
  /* Léger relief : l'option retenue se pose SUR le puits au lieu d'y être
     incrustée. C'est le seul repère de profondeur du composant ; il est
     neutralisé en pdf-mode comme toutes les ombres. */
  box-shadow: 0 1px 2px rgb(0 0 0 / 0.28);
}
.ds-seg > button:disabled { opacity: 0.45; cursor: not-allowed; }
.ds-seg > button:focus-visible,
.ds-seg input:focus-visible + label { outline: 2px solid var(--accent); outline-offset: 2px; }
.ds-seg svg { flex: none; width: 15px; height: 15px; }

/* Puce d'état ronde (titres de section) */
.ds-dot {
  flex: none; width: 7px; height: 7px; border-radius: 50%;
  background: var(--accent-2); box-shadow: 0 0 10px var(--accent-2);
}
/* Libellé de section — même graisse, même casse, même couleur partout. */
.ds-section-label {
  display: flex; align-items: center; gap: var(--sp-2); min-width: 0;
  font-family: var(--font-body);
  font-size: var(--fs-xs); font-weight: var(--fw-semibold);
  letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-secondary);
}
.ds-count {
  flex: none; padding: 1px 9px;
  font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: var(--fw-semibold);
  font-variant-numeric: tabular-nums;
  color: var(--accent); background: var(--surface-strong);
  border-radius: var(--radius-pill);
}
.ds-count.is-warning { color: var(--warning); }

/* -------------------------------------------------------------------------
   S7. ACCORDÉON — <details>/<summary>, chevron unique
   Un seul indicateur d'ouverture dans toute la suite : chevron qui pivote.
   ---------------------------------------------------------------------- */
/* `overflow: hidden` a été retiré : posé sur un <details>, WebKit calcule
   la hauteur de la boîte sur le seul <summary> et rogne le contenu révélé.
   Sur iPhone, la dernière option d'un groupe déplié disparaissait ainsi
   sous la bordure. Le filet supérieur porte désormais son propre rayon, ce
   qui rendait ce recadrage inutile. */
.ds-acc {
  position: relative; min-width: 0;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-md);
  transition: border-color var(--dur-fast) var(--ease-out);
}
.ds-acc + .ds-acc { margin-top: var(--sp-2); }
.ds-acc::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 2px;
  border-radius: var(--radius-md) var(--radius-md) 0 0;
  background: var(--edge-gradient); opacity: 0; pointer-events: none;
  transition: opacity var(--dur-fast) var(--ease-out);
}
.ds-acc[open] { border-color: var(--border-accent); }
.ds-acc[open]::before { opacity: 1; }
.ds-acc > summary {
  display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3);
  min-height: var(--tap-min); padding: var(--sp-3) var(--sp-4);
  font-family: var(--font-body); font-size: var(--fs-sm); font-weight: var(--fw-semibold);
  color: var(--text); list-style: none; cursor: pointer; user-select: none;
  transition: background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
}
.ds-acc > summary::-webkit-details-marker { display: none; }
.ds-acc > summary::marker { content: ""; }
.ds-acc > summary:hover { background: var(--surface-strong); }
.ds-acc > summary:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.ds-acc[open] > summary { color: var(--accent); }
/* Chevron : dessiné en CSS, donc aucun SVG à dupliquer dans les pages. */
.ds-acc > summary::after {
  content: ""; flex: none; width: 7px; height: 7px; margin-right: 3px;
  border-right: 1.6px solid currentColor; border-bottom: 1.6px solid currentColor;
  transform: rotate(45deg) translate(-2px, -2px);
  transition: transform var(--dur-fast) var(--ease-out);
}
.ds-acc[open] > summary::after { transform: rotate(-135deg) translate(-3px, -3px); }
.ds-acc__body { padding: 0 var(--sp-4) var(--sp-4); min-width: 0; }

/* -------------------------------------------------------------------------
   S8. NOTIFICATIONS — pile unique, même durée, même animation partout
   Contrat DOM : <div class="ac-toasts"> ← <div class="ac-toast is-success">
   ---------------------------------------------------------------------- */
.ac-toasts {
  position: fixed; z-index: 300;
  right: var(--sp-5);
  bottom: calc(var(--sp-5) + env(safe-area-inset-bottom) + var(--ac-toasts-offset, 0px));
  display: flex; flex-direction: column; gap: var(--sp-2);
  max-width: min(360px, calc(100vw - 32px));
  pointer-events: none;
}
.ac-toast {
  display: flex; align-items: flex-start; gap: var(--sp-2);
  padding: var(--sp-3) var(--sp-4);
  font-family: var(--font-body); font-size: var(--fs-sm); line-height: 1.45;
  color: var(--text); background: var(--bg-elevated);
  border: 1px solid var(--border-accent); border-left-width: 3px;
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow-card);
  pointer-events: auto;
  animation: ac-toast-in var(--dur-base) var(--ease-out);
}
.ac-toast.is-success { border-left-color: var(--success); }
.ac-toast.is-error   { border-left-color: var(--danger); }
.ac-toast.is-warning { border-left-color: var(--warning); }
.ac-toast.is-leaving { animation: ac-toast-out var(--dur-fast) var(--ease-out) forwards; }
@keyframes ac-toast-in  { from { opacity: 0; transform: translateY(10px) scale(0.98); } to { opacity: 1; transform: none; } }
@keyframes ac-toast-out { to { opacity: 0; transform: translateY(6px); } }
@media (max-width: 640px) {
  .ac-toasts { left: var(--sp-3); right: var(--sp-3); max-width: none; }
}

/* -------------------------------------------------------------------------
   S9. BARRE D'ONGLETS BASSE (mobile) — pictogramme + libellé empilés
   Même hauteur, même taille d'icône, même pastille d'état dans les modules
   qui en ont besoin.
   ---------------------------------------------------------------------- */
.ac-navbar {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 40;
  display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: 2px;
  align-content: center;
  height: calc(var(--studio-navbar-h) + env(safe-area-inset-bottom));
  padding: 0 calc(var(--sp-2) + env(safe-area-inset-right))
           env(safe-area-inset-bottom)
           calc(var(--sp-2) + env(safe-area-inset-left));
  background: color-mix(in srgb, var(--bg) 82%, transparent);
  -webkit-backdrop-filter: blur(20px) saturate(140%);
          backdrop-filter: blur(20px) saturate(140%);
  border-top: 1px solid var(--border);
}
/* Même repli que .ac-appbar : sans flou, un fond opaque, jamais translucide. */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .ac-navbar { background: var(--bg-elevated); }
}
.ac-navbar::before {
  content: ""; position: absolute; top: -1px; left: 0; right: 0; height: 1px;
  background: var(--edge-gradient); opacity: 0.6; pointer-events: none;
}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .ac-navbar { background: var(--bg-elevated); }
}
.ac-navtab {
  position: relative;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 5px;
  min-width: 0; min-height: var(--tap-min); padding: var(--sp-1) 2px;
  font-family: var(--font-body); text-align: center;
  color: var(--text-tertiary); background: none; border: 0;
  border-radius: var(--radius-md); cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: color var(--dur-fast) var(--ease-out);
}
.ac-navtab:focus-visible { outline: 2px solid var(--accent); outline-offset: -3px; }
.ac-navtab__pill {
  position: absolute; inset: 0; transform: scale(0.88);
  border-radius: var(--radius-md);
  background: color-mix(in srgb, var(--accent) 16%, transparent);
  opacity: 0; pointer-events: none;
  transition: opacity var(--dur-fast) var(--ease-out), transform var(--dur-base) var(--ease-out);
}
.ac-navtab__ico {
  position: relative; z-index: 1; flex: none; width: 22px; height: 22px;
  fill: none; stroke: currentColor; stroke-width: 1.75;
  stroke-linecap: round; stroke-linejoin: round;
  transition: transform var(--dur-base) var(--ease-out);
}
.ac-navtab__lbl {
  position: relative; z-index: 1; max-width: 100%;
  font-size: clamp(9px, 2.6vw, 10.5px); line-height: 1;
  font-weight: var(--fw-medium); letter-spacing: 0.01em;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  transition: font-weight var(--dur-fast) var(--ease-out);
}
.ac-navtab[aria-selected="true"], .ac-navtab.is-active { color: var(--accent); }
.ac-navtab[aria-selected="true"] .ac-navtab__pill,
.ac-navtab.is-active .ac-navtab__pill { opacity: 1; transform: scale(1); }
.ac-navtab[aria-selected="true"] .ac-navtab__lbl,
.ac-navtab.is-active .ac-navtab__lbl { font-weight: var(--fw-bold); }
.ac-navtab:active .ac-navtab__ico { transform: scale(0.86); }

/* -------------------------------------------------------------------------
   S10. PANNEAU EN VERRE — matière commune aux colonnes de réglages
   ---------------------------------------------------------------------- */
.ds-panel {
  position: relative; min-width: 0;
  background: color-mix(in srgb, var(--bg-elevated) 76%, transparent);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: clamp(var(--sp-4), 2.4vw, var(--sp-6));
  -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px);
}
.ds-panel::after {
  content: ""; position: absolute; inset: 0 0 auto 0; height: 1px;
  background: var(--edge-gradient); opacity: 0.6; pointer-events: none;
  border-radius: var(--radius-lg) var(--radius-lg) 0 0;
}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .ds-panel { background: var(--bg-elevated); }
}

/* -------------------------------------------------------------------------
   S11. PIED DE PAGE DES STUDIOS
   ---------------------------------------------------------------------- */
.ac-studio-foot {
  width: 100%; max-width: var(--container);
  margin: var(--sp-8) auto 0;
  padding-top: var(--sp-4);
  border-top: 1px solid var(--border);
  text-align: center;
  font-size: var(--fs-xs); line-height: 1.6; color: var(--text-tertiary);
  overflow-wrap: anywhere;
}
.ac-studio-foot strong { color: var(--text-secondary); font-weight: var(--fw-semibold); }

/* -------------------------------------------------------------------------
   S12. DIVERS PARTAGÉS
   ---------------------------------------------------------------------- */
.ds-spinner--sm { width: 15px; height: 15px; border-width: 2px; }
.ds-spinner--btn { border-color: color-mix(in srgb, currentColor 32%, transparent); border-top-color: currentColor; }

/* Zone de dépôt de fichier */
.ds-drop {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--sp-2); padding: var(--sp-6) var(--sp-4);
  text-align: center; color: var(--text-secondary);
  background: var(--surface);
  border: 1.5px dashed var(--border-accent); border-radius: var(--radius-md);
  cursor: pointer;
  transition: border-color var(--dur-fast) var(--ease-out),
              background   var(--dur-fast) var(--ease-out),
              transform    var(--dur-fast) var(--ease-out);
}
.ds-drop:hover { border-color: var(--accent); background: var(--surface-strong); }
.ds-drop.is-dragover {
  border-color: var(--accent);
  background: color-mix(in srgb, var(--accent) 12%, transparent);
  transform: scale(1.01);
}
.ds-drop svg { width: 30px; height: 30px; color: var(--accent-2); }
.ds-drop p { margin: 0; font-size: var(--fs-xs); line-height: 1.5; }
.ds-drop strong { color: var(--text); font-weight: var(--fw-semibold); }

/* Ligne d'état sous un champ ou une zone de dépôt */
.ds-status {
  margin: 0; padding: var(--sp-2) var(--sp-3);
  font-size: var(--fs-xs); line-height: 1.45; color: var(--text-tertiary);
  background: var(--surface);
  border-left: 2px solid var(--border);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  word-break: break-word;
}
.ds-status.is-loaded  { color: var(--accent);  border-left-color: var(--accent); }
.ds-status.is-warning { color: var(--warning); border-left-color: var(--warning); }
.ds-status.is-error   { color: var(--danger);  border-left-color: var(--danger); }

/* Barre de progression */
.ds-progress { height: 7px; background: var(--surface-strong); border-radius: var(--radius-pill); overflow: hidden; }
.ds-progress__fill {
  height: 100%; width: 0;
  background: linear-gradient(90deg, var(--accent), var(--accent-2));
  border-radius: var(--radius-pill);
  transition: width var(--dur-base) var(--ease-out);
}

/* Réduction du mouvement — filet de sécurité pour les composants ci-dessus. */
@media (prefers-reduced-motion: reduce) {
  .ds-btn:hover, .ds-drop.is-dragover, .ac-navtab:active .ac-navtab__ico { transform: none; }
  .studio-switch__menu { animation: none; }
}

/* -------------------------------------------------------------------------
   S13. RESPECT DE L'ATTRIBUT [hidden]
   Les composants ci-dessus imposent un `display` (inline-flex, grid, flex…)
   qui l'emporterait sur la valeur `none` du navigateur : un élément masqué
   par le JS resterait visible. Sélecteur volontairement spécifique — une
   règle globale `[hidden]` casserait les cas où une application réaffiche
   délibérément un bloc masqué (ex. la colonne de réglages de Studio Posts
   sur grand écran).
   ---------------------------------------------------------------------- */
.ds-btn[hidden], .ds-chip[hidden], .ds-badge[hidden], .ds-seg[hidden],
.ds-tabs[hidden], .ds-tab[hidden], .ds-switch[hidden], .ds-toggle[hidden],
.ds-drop[hidden], .ds-progress[hidden], .ds-spinner[hidden],
.ac-navbar[hidden], .ac-navtab[hidden], .ac-toasts[hidden],
.ac-appbar[hidden], .ac-ctrl[hidden], .studio-switch[hidden] { display: none; }

/* -------------------------------------------------------------------------
   S14. BOUTON DE BASCULE DE THÈME — icône affichée avant l'exécution du JS
   assets/js/ac-theme.js montre l'une ou l'autre icône en posant un style en
   ligne, mais seulement une fois le DOM prêt : entre le premier rendu et cet
   instant, les deux icônes se superposaient. Les règles ci-dessous s'appuient
   sur l'attribut data-theme, déjà posé par le script anti-clignotement du
   <head>, et donnent exactement le même résultat que ac-theme.js — les deux
   ne peuvent donc pas se contredire.
   ---------------------------------------------------------------------- */
[data-theme="dark"]  [data-icon-moon] { display: none; }
[data-theme="light"] [data-icon-sun]  { display: none; }

/* -------------------------------------------------------------------------
   S15. SÉLECTEUR DE COULEUR — palette de la charte + couleur libre
   Une rangée de pastilles rondes : les teintes de la charte Audio-Coran, une
   option « automatique » qui laisse le thème décider, et une dernière pastille
   qui ouvre le sélecteur natif du système. Cibles de 44px, sélection signalée
   par un anneau émeraude — le même signal que partout ailleurs.

   Balisage attendu :
     <div class="ds-swatches" role="radiogroup" aria-label="…">
       <button class="ds-swatch ds-swatch--auto" role="radio" aria-checked="true"></button>
       <button class="ds-swatch" role="radio" aria-checked="false"
               style="--swatch: #D6B25E"></button>
       <label class="ds-swatch ds-swatch--custom">
         <input type="color" value="#FFFFFF"><span></span>
       </label>
     </div>
   ---------------------------------------------------------------------- */
.ds-swatches {
  display: flex; flex-wrap: wrap; gap: var(--sp-2);
  padding: 0; margin: 0;
}
.ds-swatch {
  position: relative; flex: none;
  display: inline-grid; place-items: center;
  width: var(--tap-min); height: var(--tap-min);
  padding: 0; cursor: pointer;
  background: none; border: 0; border-radius: 50%;
  transition: transform var(--dur-fast) var(--ease-out);
}
/* La pastille colorée est un pseudo-élément : le halo de sélection peut
   ainsi vivre sur l'élément lui-même sans grossir la cible tactile. */
.ds-swatch::before {
  content: ""; width: 26px; height: 26px; border-radius: 50%;
  background: var(--swatch, var(--text));
  box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.28),
              inset 0 0 0 2px rgba(255, 255, 255, 0.10);
  transition: transform var(--dur-fast) var(--ease-out);
}
.ds-swatch:hover::before { transform: scale(1.12); }
.ds-swatch:active { transform: scale(0.94); }
.ds-swatch:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* Sélection : anneau émeraude détaché, lisible sur une pastille claire
   comme sur une pastille sombre. */
.ds-swatch::after {
  content: ""; position: absolute; inset: 4px;
  border-radius: 50%; border: 2px solid var(--accent);
  opacity: 0; transform: scale(0.82);
  transition: opacity var(--dur-fast) var(--ease-out),
              transform var(--dur-fast) var(--ease-out);
  pointer-events: none;
}
.ds-swatch[aria-checked="true"]::after,
.ds-swatch.is-active::after { opacity: 1; transform: scale(1); }

/* « Automatique » : la couleur suit le thème du visuel. Damier discret pour
   dire « aucune couleur imposée », sans recourir à un libellé. */
.ds-swatch--auto::before {
  background:
    linear-gradient(135deg,
      transparent 46%, var(--text-tertiary) 46%,
      var(--text-tertiary) 54%, transparent 54%),
    var(--surface-strong);
}

/* Couleur libre : <label> enveloppant un <input type="color"> invisible.
   Le dégradé annonce la fonction ; la valeur retenue s'affiche ensuite via
   la variable --swatch, posée par le JS. */
.ds-swatch--custom { overflow: hidden; }
.ds-swatch--custom::before {
  background: var(--swatch, conic-gradient(
    #E15252, #E0A83E, #1FA97A, #2EE5FF, #7C5CFF, #E15252));
}
.ds-swatch--custom input[type="color"] {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  opacity: 0; cursor: pointer; border: 0; padding: 0;
}
.ds-swatch--custom:focus-within { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 50%; }

@media (prefers-reduced-motion: reduce) {
  .ds-swatch, .ds-swatch::before, .ds-swatch::after { transition: none; }
}

/* -------------------------------------------------------------------------
   S16. CURSEUR AVEC VALEUR — libellé, valeur chiffrée et piste alignés
   Reprend .ds-range ; n'ajoute que la disposition, pour que tous les réglages
   numériques de la suite se lisent de la même façon.
   ---------------------------------------------------------------------- */
.ds-slider__head {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--sp-3); margin-bottom: var(--sp-1);
}
.ds-slider__label { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--text); }
.ds-slider__value {
  font-family: var(--font-mono); font-size: var(--fs-xs);
  font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums;
  color: var(--accent); white-space: nowrap;
}
.ds-slider__value.is-auto { color: var(--text-tertiary); }

/* -------------------------------------------------------------------------
   S17. CONTRÔLE SEGMENTÉ — VARIANTE À CONTOUR
   Le puits plein de .ds-seg fonctionne sur une rangée courte. Empilé sur
   plusieurs lignes, il devient une grande surface pleine qui pèse dans la
   page et attire l'œil plus que les options elles-mêmes.

   Cette variante retire le puits : chaque option porte son propre contour,
   l'option retenue est remplie en émeraude. Même sémantique, même signal de
   sélection, beaucoup moins de matière. À préférer dès que le groupe compte
   plus de trois options ou occupe plusieurs rangées.
   ---------------------------------------------------------------------- */
.ds-seg--outline {
  gap: var(--sp-2);
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
}
.ds-seg--outline > button,
.ds-seg--outline > label {
  min-height: var(--tap-min);
  padding: var(--sp-2) var(--sp-4);
  color: var(--text-secondary);
  background: transparent;
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  transition: color        var(--dur-fast) var(--ease-out),
              background   var(--dur-fast) var(--ease-out),
              border-color var(--dur-fast) var(--ease-out);
}
.ds-seg--outline > button:hover:not(:disabled):not([aria-checked="true"]):not([aria-pressed="true"]),
.ds-seg--outline > label:hover {
  color: var(--text);
  background: transparent;
  border-color: var(--border-accent);
}
.ds-seg--outline > button[aria-checked="true"],
.ds-seg--outline > button[aria-pressed="true"],
.ds-seg--outline input:checked + label {
  color: var(--deep-black);
  background: var(--accent);
  border-color: var(--accent);
}

/* -------------------------------------------------------------------------
   S18. LIGNE DE RÉGLAGE COMPACTE
   Un libellé à gauche, un contrôle court à droite, sur une seule ligne.
   Un sélecteur de couleur en pleine largeur occupait autant de hauteur qu'un
   champ de texte pour une information qui tient dans une pastille : à quatre
   couleurs réglables, c'était un écran de défilement gagné.
   ---------------------------------------------------------------------- */
.ds-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--sp-3);
  min-height: var(--tap-min);
}
.ds-row > label {
  margin: 0;
  font-size: var(--fs-sm);
  font-weight: var(--fw-semibold);
  color: var(--text);
  overflow-wrap: anywhere;
}
/* Pastille de couleur : cible de 44px, aperçu rond, sélecteur natif au clic. */
.ds-row input[type="color"] {
  width: 52px;
  height: 32px;
  padding: 2px;
  flex: none;
  cursor: pointer;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  transition: border-color var(--dur-fast) var(--ease-out);
}
.ds-row input[type="color"]:hover { border-color: var(--border-accent); }
.ds-row input[type="color"]:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.ds-row input[type="color"]::-webkit-color-swatch { border: none; border-radius: 6px; }
.ds-row input[type="color"]::-moz-color-swatch { border: none; border-radius: 6px; }

/* -------------------------------------------------------------------------
   S19. PIED DE PAGE COMPACT — variante « application »
   ac-shell.js pose la classe .ac-footer-compact sur tout conteneur
   <footer data-ac-footer="compact"> et y injecte marque + réseaux + crédits.

   Ces règles vivaient à l'identique dans coran-app/css/style.css et
   adhkar-app/style.css. Marque-page, qui n'inclut ni l'une ni l'autre,
   se retrouvait avec un pied de page entièrement dépourvu de style.
   Source unique ici : les trois applications sont désormais identiques,
   et toute application qui adopte `data-ac-footer="compact"` est stylée
   sans rien recopier.
   ---------------------------------------------------------------------- */
.ac-footer-compact {
  position: relative;
  margin-top: 48px;
  padding: 28px clamp(18px, 5vw, 40px) calc(32px + env(safe-area-inset-bottom, 0px));
  border-top: 1px solid var(--border);
  text-align: left;
}
/* Liseré dégradé signature, comme sur le pied de page principal. */
.ac-footer-compact::before {
  content: "";
  position: absolute; top: -1px; left: 0; right: 0; height: 1px;
  background: var(--edge-gradient);
  opacity: 0.55;
}
.ac-footer-compact__inner {
  display: flex; align-items: center; justify-content: space-between;
  gap: 16px; flex-wrap: wrap;
  max-width: 900px; margin: 0 auto;
}
.ac-footer-compact__brand { display: inline-flex; flex: 0 0 auto; }
.ac-footer-compact__brand .brand-logo {
  /* Un cran sous le logo d'en-tête : le pied de page est secondaire. */
  width: clamp(128px, 34vw, 152px);
  height: clamp(24px, 6.4vw, 29px);
}
.ac-footer-compact .site-footer__social { margin-top: 0; }

.ac-footer-compact__credits {
  max-width: 900px; margin: 20px auto 0;
  font-size: 12.5px; line-height: 1.65; color: var(--text-tertiary);
}
.ac-footer-compact__credits p { margin: 0 0 4px; }
.ac-footer-compact__credits a { color: var(--text-secondary); }

.ac-footer-compact__copyright {
  max-width: 900px; margin: 16px auto 0;
  padding-top: 14px; border-top: 1px solid var(--border);
  font-size: 12px; color: var(--text-tertiary);
}

@media (max-width: 560px) {
  .ac-footer-compact__inner { flex-direction: column; align-items: flex-start; gap: 14px; }
}

/* -------------------------------------------------------------------------
   S20. RÉSERVATION DE HAUTEUR AVANT REMPLISSAGE (anti-CLS)
   ac-shell.js remplit [data-ac-switch] et [data-ac-footer] après le premier
   rendu. Sans hauteur réservée, la page saute au moment du remplissage.
   Ces trois règles étaient recopiées dans style.css, coran-app et adhkar-app,
   et absentes de marque-page.
   ---------------------------------------------------------------------- */
/* 38px était sous-évalué : ces conteneurs reçoivent une PILULE libellée, pas
   un carré. On réserve donc la largeur réelle du bouton — sinon la rangée
   d'actions se décale au remplissage. Sous 560px les deux pilules se replient
   en pictogramme seul : la réservation suit le même seuil. */
[data-ac-switch]:empty,
[data-studio-switch]:empty { display: inline-block; height: var(--tap-min); }
[data-ac-switch]:empty     { width: 148px; }   /* « Applications » */
[data-studio-switch]:empty { width: 116px; }   /* « Studios »      */
@media (max-width: 559px) {
  [data-ac-switch]:empty,
  [data-studio-switch]:empty { width: var(--tap-min); }
}
[data-ac-footer]:empty { min-height: 320px; display: block; }
@media (max-width: 700px) {
  [data-ac-footer]:empty { min-height: 480px; }
}
[data-ac-footer="compact"]:empty { min-height: 150px; }

/* =============================================================================
   COMPOSANT RETIRÉ — sélecteur d'applications en rangée de pilules
   -----------------------------------------------------------------------------
   Les règles .app-switch / .ac-switch / .ac-burger occupaient cet emplacement.
   Elles ont été supprimées : la rangée de pilules et son bouton burger ont été
   remplacés par le bouton « Applications » unique et son panneau, dont les
   styles vivent dans assets/design/design-system.css sous le préfixe .ac-apps.

   Ces règles ne s'appliquaient plus à rien — ac-shell.js retire les classes du
   conteneur au remplissage — mais elles restaient lisibles dans la feuille et
   invitaient à croire le composant encore en service.
   ========================================================================== */

/* -------------------------------------------------------------------------
   S21. OUTILS D'ÉTUDE — barre d'apprentissage des matn
   Composant partagé par Les Quatre Règles, Les Trois Fondements et les
   40 Nawawî. Le balisage est produit par assets/js/ac-etude.js ; ces règles
   sont sa seule feuille. Aucune application ne redéclare quoi que ce soit
   ici — c'est précisément l'objet de la factorisation.
   ---------------------------------------------------------------------- */
.ac-etude { display: flex; flex-direction: column; gap: var(--sp-3); }
.ac-etude[hidden] { display: none; }

/* Le groupe de vues occupe sa propre ligne : trois libellés côte à côte ne
   tiennent pas à côté des autres commandes sur une colonne de lecture. */
.ac-etude__vue { width: 100%; }
.ac-etude__row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); }

/* — Réglage du corps du texte arabe — */
.ac-etude__taille {
  display: inline-flex; align-items: center; gap: var(--sp-1);
  padding: 0 var(--sp-2) 0 var(--sp-3);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
}
.ac-etude__taille-l {
  font-family: var(--font-display);
  font-size: var(--fs-sm); color: var(--text-tertiary);
}
.ac-etude__taille-b {
  display: inline-grid; place-items: center;
  width: 36px; height: var(--tap-min);
  font-size: 19px; line-height: 1;
  color: var(--text-secondary);
  background: none; border: 0; cursor: pointer;
  transition: color var(--dur-fast) var(--ease-out);
}
.ac-etude__taille-b:hover:not(:disabled) { color: var(--text); }
.ac-etude__taille-b:disabled { opacity: 0.35; cursor: not-allowed; }
.ac-etude__taille-b:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: var(--radius-sm); }

/* — États —
   Émeraude pleine pour « appris » : c'est un état atteint, l'équivalent d'une
   case cochée. « Favori » reste en contour or — l'or est ornemental dans ce
   projet, jamais un état interactif ; il n'habille ici que la bordure et le
   pictogramme, pas un fond plein. */
.ac-etude .ds-btn.is-done {
  color: var(--deep-black);
  background: var(--accent);
  border-color: var(--accent);
}
.ac-etude .ds-btn.is-fav {
  color: var(--accent-2-text);
  border-color: var(--border-gold);
  background: color-mix(in srgb, var(--accent-2) 10%, transparent);
}
@supports not (color: color-mix(in srgb, red, blue)) {
  .ac-etude .ds-btn.is-fav { background: transparent; }
}
.ac-etude .ds-btn.is-fav svg { fill: currentColor; }

/* — Modes d'affichage —
   Portés par une classe sur <html> : le texte masqué sort du FLUX et pas
   seulement de la vue, sinon il laisserait des blancs entre les blocs.
   Les sélecteurs couvrent les trois nomenclatures existantes plutôt que
   d'imposer un renommage des trois applications. */
.ac-vue--ar :is(.qr-fr, .uf-fr, .hd-tr) { display: none; }
.ac-vue--fr :is(.qr-ar, .uf-ar, .hd-ar-block),
.ac-vue--fr :is(.qr-sharh, .uf-sharh) { display: none; }
.ac-sharh--off :is(.qr-sharh, .uf-sharh) { display: none; }

/* Corps du texte arabe — le pont se fait par les JETONS des applications, pas
   par une règle sur les éléments. Chaque feuille déclare
   `--xx-ar-size: var(--ac-ar-size, clamp(...))` : tant que le lecteur n'a rien
   réglé, la valeur fluide d'origine s'applique ; dès qu'il touche aux boutons,
   --ac-ar-size prend le dessus. Écrire ici `font-size` sur les éléments aurait
   écrasé ces clamp() et cassé la typographie par défaut des trois apps. */

/* Sur téléphone, les boutons tiennent sur deux rangées plutôt que de
   rétrécir sous la cible tactile de 44px. */
@media (max-width: 480px) {
  .ac-etude__row .ds-btn { flex: 1 1 calc(50% - var(--sp-2)); justify-content: center; }
}
