/* ==========================================================================
   Composants — Agnesa Mirabel
   --------------------------------------------------------------------------
   Principes de motion appliqués partout ici :
   · durées UI < 300ms, easing custom (les natives CSS sont trop molles)
   · jamais d'ease-in sur de l'UI (démarrage lent = interface qui traîne)
   · rien n'apparaît depuis scale(0) — le minimum est .96
   · tout élément pressable descend à scale(.97) au :active
   · les états :hover sont derrière (hover: hover) — sinon faux positifs au tap
   · on n'anime que transform et opacity (GPU, pas de layout/paint)
   ========================================================================== */

/* ==========================================================================
   Boutons
   ========================================================================== */
.c-btn {
  --btn-bg: var(--accent);
  --btn-fg: var(--accent-contrast);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-xs);
  min-height: 48px;                 /* cible tactile ≥ 44px */
  padding: var(--space-sm) var(--space-xl);
  border: 1px solid transparent;
  border-radius: var(--r-full);
  background: var(--btn-bg);
  color: var(--btn-fg);
  font-family: var(--font-body);
  font-size: var(--t-sm);
  font-weight: 600;
  letter-spacing: .04em;
  line-height: 1;
  text-decoration: none;
  cursor: pointer;
  position: relative;
  isolation: isolate;
  transition:
    transform var(--d-press) var(--ease-out),
    box-shadow var(--d-base) var(--ease-out),
    background-color var(--d-fast) ease,
    color var(--d-fast) ease;
}
.c-btn:hover { color: var(--btn-fg); }

@media (hover: hover) and (pointer: fine) {
  .c-btn:hover {
    box-shadow: var(--shadow-glow), var(--shadow-md);
    transform: translateY(-1px);
  }
}
/* Le retour au doigt doit être instantané et perceptible. */
.c-btn:active { transform: scale(.97); }

.c-btn--ghost {
  --btn-bg: transparent;
  --btn-fg: var(--accent);
  border-color: var(--border-strong);
}
@media (hover: hover) and (pointer: fine) {
  .c-btn--ghost:hover { background: var(--glow-soft); box-shadow: none; }
}

.c-btn--quiet {
  --btn-bg: transparent;
  --btn-fg: var(--text-muted);
  padding-inline: var(--space-md);
}
@media (hover: hover) and (pointer: fine) {
  .c-btn--quiet:hover { --btn-fg: var(--text); background: var(--border-subtle); box-shadow: none; }
}

.c-btn--lg { min-height: 56px; font-size: var(--t-base); padding-inline: var(--space-2xl); }

/* ==========================================================================
   Lanterne — le curseur devient la lanterne du livre.
   Purement décoratif : donc amorti par ressort côté JS, et désactivé au
   pointeur grossier + en reduced-motion. Ne porte aucune information.
   ========================================================================== */
/* La lanterne du curseur : plusieurs couches superposées plutôt qu'un seul
   dégradé plat. Un cœur chaud et resserré, une nappe moyenne, puis une très
   large retombée — c'est l'écart entre les trois qui fait « lumière portée »
   au lieu de « tache floue ». */
.c-lantern {
  position: fixed;
  top: 0; left: 0;
  width: 52rem; height: 52rem;
  margin: -26rem 0 0 -26rem;
  pointer-events: none;
  z-index: 0;
  opacity: 0;
  transition: opacity var(--d-slow) ease;
  will-change: transform;
  background:
    /* cœur : petit et net, c'est lui qui donne l'impression de flamme */
    radial-gradient(circle closest-side,
      color-mix(in srgb, var(--glow) 22%, transparent) 0%,
      color-mix(in srgb, var(--glow) 9%, transparent) 16%,
      transparent 34%),
    /* nappe intermédiaire */
    radial-gradient(circle closest-side,
      color-mix(in srgb, var(--glow) 7%, transparent) 0%,
      color-mix(in srgb, var(--glow) 3%, transparent) 42%,
      transparent 64%),
    /* retombée très large, presque imperceptible */
    radial-gradient(circle closest-side,
      color-mix(in srgb, var(--glow) 3%, transparent) 0%,
      transparent 78%);
}
.c-lantern.is-lit { opacity: 1; }

/* Le halo respire : une flamme n'est jamais fixe. Amplitude volontairement
   minuscule (3 %) et cycle lent — à peine conscient, mais on le sent. */
.motion-on .c-lantern.is-lit {
  animation: agn-flame 5.4s ease-in-out infinite;
}
@keyframes agn-flame {
  0%,   100% { opacity: 1;    filter: brightness(1); }
  38%        { opacity: .94;  filter: brightness(1.06); }
  64%        { opacity: .97;  filter: brightness(.97); }
}

/* Un second point, plus resserré, suit la lanterne avec un retard propre :
   deux sources légèrement décalées lisent comme une flamme, pas comme un
   spot. Piloté par le même transform que .c-lantern (voir motion.js). */
.c-lantern::after {
  content: '';
  position: absolute;
  top: 50%; left: 50%;
  width: 9rem; height: 9rem;
  margin: -4.5rem 0 0 -4.5rem;
  border-radius: 50%;
  background: radial-gradient(circle closest-side,
    color-mix(in srgb, var(--glow) 16%, transparent),
    transparent 70%);
  filter: blur(6px);
}

@media (hover: none), (pointer: coarse) {
  .c-lantern { display: none; }
}

/* ==========================================================================
   Révélation au scroll — clip-path, comme un rideau qui se lève.
   Une seule fois par élément (once) : une révélation qui rejoue est agaçante.
   ========================================================================== */
/* ⚠️ Le masquage initial est conditionné à `html.reveal-ready`, que le JS ne
   pose qu'après avoir VÉRIFIÉ qu'il peut réellement animer (IntersectionObserver
   présent, mouvement non réduit). Sans ce garde-fou, un JS cassé ou un
   observateur qui ne se déclenche pas laisse toute la page à opacity:0 —
   c'est-à-dire un site blanc. Le contenu visible est l'état par défaut. */
html.reveal-ready .js-reveal {
  opacity: 0;
  clip-path: inset(0 0 100% 0);
  transform: translateY(14px);
  transition:
    opacity var(--d-reveal) var(--ease-warm),
    clip-path var(--d-reveal) var(--ease-warm),
    transform var(--d-reveal) var(--ease-warm);
}
html.reveal-ready .js-reveal.is-revealed {
  opacity: 1;
  clip-path: inset(0 0 0 0);
  transform: none;
}
/* Cascade : 60ms entre les éléments d'une même grille. Court, sinon ça traîne. */
.js-reveal[data-reveal-i='1'] { transition-delay: 60ms; }
.js-reveal[data-reveal-i='2'] { transition-delay: 120ms; }
.js-reveal[data-reveal-i='3'] { transition-delay: 180ms; }
.js-reveal[data-reveal-i='4'] { transition-delay: 240ms; }
.js-reveal[data-reveal-i='5'] { transition-delay: 300ms; }

/* Filet de sécurité supplémentaire : une révélation qui n'a pas été déclenchée
   au bout de 2,5 s (onglet en arrière-plan, observateur qui ne rend pas la
   main) redevient visible d'elle-même. On préfère une apparition sans
   animation à un bloc de texte définitivement invisible. */
html.reveal-ready .js-reveal:not(.is-revealed) {
  animation: agnesa-failsafe 0s linear 2.5s forwards;
}
@keyframes agnesa-failsafe {
  to { opacity: 1; clip-path: inset(0 0 0 0); transform: none; }
}

/* ==========================================================================
   Header
   ========================================================================== */
.c-header {
  position: sticky;
  top: 0;
  z-index: 100;
  background: color-mix(in srgb, var(--bg) 86%, transparent);
  backdrop-filter: saturate(140%) blur(14px);
  -webkit-backdrop-filter: saturate(140%) blur(14px);
  border-bottom: 1px solid transparent;
  transition: border-color var(--d-base) ease, box-shadow var(--d-base) ease;
}
.c-header.is-scrolled {
  border-bottom-color: var(--border);
  box-shadow: var(--shadow-sm);
}
.c-header__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-lg);
  min-height: 4.5rem;
}

.c-brand {
  display: inline-flex;
  flex-direction: column;
  gap: 2px;
  text-decoration: none;
  color: var(--text-strong);
}
.c-brand__name {
  font-family: var(--font-display);
  font-size: var(--t-md);
  font-weight: 700;
  letter-spacing: .05em;
  line-height: 1;
  text-transform: uppercase;
}
.c-brand__tag {
  font-size: var(--t-xs);
  letter-spacing: var(--ls-caps);
  text-transform: uppercase;
  color: var(--accent);
  line-height: 1;
}

/* --- Navigation ---------------------------------------------------------- */
.c-nav { display: flex; align-items: center; gap: var(--space-xs); }
.c-nav__list {
  display: flex;
  align-items: center;
  gap: var(--space-2xs);
  list-style: none;
  margin: 0; padding: 0;
}
.c-nav__link {
  display: inline-block;
  padding: var(--space-xs) var(--space-sm);
  border-radius: var(--r-md);
  color: var(--text);
  font-size: var(--t-sm);
  text-decoration: none;
  position: relative;
  /* Pas de transform ici : la nav est parcourue en permanence, un mouvement
     à chaque survol devient vite fatigant. Seule la couleur bouge. */
  transition: color var(--d-fast) ease, background-color var(--d-fast) ease;
}
@media (hover: hover) and (pointer: fine) {
  .c-nav__link:hover { color: var(--accent); background: var(--border-subtle); }
}
/* Le filet doré sous l'onglet courant : discret, mais il situe. */
.c-nav__link[aria-current='page'] { color: var(--accent); }
.c-nav__link[aria-current='page']::after {
  content: '';
  position: absolute;
  left: var(--space-sm); right: var(--space-sm);
  bottom: 2px;
  height: 1px;
  background: var(--accent);
}

/* --- Bascule de thème ---------------------------------------------------- */
.c-theme-toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px; height: 44px;
  padding: 0;
  border: 1px solid var(--border);
  border-radius: var(--r-full);
  background: transparent;
  color: var(--text-muted);
  cursor: pointer;
  transition:
    transform var(--d-press) var(--ease-out),
    color var(--d-fast) ease,
    border-color var(--d-fast) ease,
    background-color var(--d-fast) ease;
}
@media (hover: hover) and (pointer: fine) {
  .c-theme-toggle:hover { color: var(--accent); border-color: var(--border-strong); background: var(--glow-soft); }
}
.c-theme-toggle:active { transform: scale(.93); }
.c-theme-toggle svg { width: 19px; height: 19px; }
/* Une seule des deux icônes est montrée : la cible du clic, pas l'état courant. */
:root[data-theme='light'] .c-theme-toggle .i-moon,
:root:not([data-theme='dark']) .c-theme-toggle .i-moon { display: none; }
:root[data-theme='dark'] .c-theme-toggle .i-sun { display: none; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) .c-theme-toggle .i-sun { display: none; }
  :root:not([data-theme]) .c-theme-toggle .i-moon { display: block; }
}

/* --- Sélecteur de langue ------------------------------------------------- */
.c-lang { display: flex; align-items: center; gap: 2px; }
.c-lang__item {
  padding: 6px var(--space-xs);
  border-radius: var(--r-sm);
  font-size: var(--t-xs);
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--text-muted);
  text-decoration: none;
  transition: color var(--d-fast) ease, background-color var(--d-fast) ease;
}
.c-lang__item[aria-current='true'] { color: var(--accent); background: var(--glow-soft); }
@media (hover: hover) and (pointer: fine) {
  .c-lang__item:hover { color: var(--text); }
}

/* --- Menu mobile --------------------------------------------------------- */
.c-burger {
  display: none;
  align-items: center; justify-content: center;
  width: 44px; height: 44px;
  border: 1px solid var(--border);
  border-radius: var(--r-full);
  background: transparent;
  color: var(--text);
  cursor: pointer;
  transition: transform var(--d-press) var(--ease-out);
}
.c-burger:active { transform: scale(.93); }

.c-drawer {
  position: fixed;
  inset: 0;
  z-index: 200;
  display: grid;
  place-items: center;
  background: color-mix(in srgb, var(--bg) 96%, transparent);
  backdrop-filter: blur(18px);
  -webkit-backdrop-filter: blur(18px);
  /* Transitions (pas de keyframes) : interruptibles, donc une ouverture-fermeture
     rapide se retarget au lieu de repartir de zéro. */
  opacity: 0;
  visibility: hidden;
  transition: opacity var(--d-base) var(--ease-out), visibility var(--d-base);
}
.c-drawer.is-open { opacity: 1; visibility: visible; }
.c-drawer__list {
  list-style: none;
  margin: 0; padding: 0;
  text-align: center;
  display: grid;
  gap: var(--space-md);
}
.c-drawer__link {
  font-family: var(--font-display);
  font-size: var(--t-xl);
  color: var(--text-strong);
  text-decoration: none;
  /* Chaque entrée entre depuis .96 — jamais depuis 0 : rien n'apparaît de nulle part. */
  opacity: 0;
  transform: translateY(10px) scale(.96);
  transition: opacity var(--d-base) var(--ease-out), transform var(--d-base) var(--ease-out);
}
.c-drawer.is-open .c-drawer__link { opacity: 1; transform: none; }
.c-drawer.is-open li:nth-child(1) .c-drawer__link { transition-delay: 40ms; }
.c-drawer.is-open li:nth-child(2) .c-drawer__link { transition-delay: 80ms; }
.c-drawer.is-open li:nth-child(3) .c-drawer__link { transition-delay: 120ms; }
.c-drawer.is-open li:nth-child(4) .c-drawer__link { transition-delay: 160ms; }
.c-drawer.is-open li:nth-child(5) .c-drawer__link { transition-delay: 200ms; }
.c-drawer.is-open li:nth-child(6) .c-drawer__link { transition-delay: 240ms; }
.c-drawer__close {
  position: absolute;
  top: var(--space-lg); right: var(--space-lg);
}

@media (max-width: 900px) {
  .c-nav__list { display: none; }
  .c-burger { display: inline-flex; }
}

/* ==========================================================================
   Hero
   ========================================================================== */
/* L'illustration du hero est une scène NOCTURNE dans les deux thèmes.
   On y redéfinit donc les tokens localement : texte crème et voile sombre,
   même en mode clair. Un voile crème sur une nuit peinte délave l'image et
   rend le titre illisible — testé, c'était le cas. */
.c-hero {
  position: relative;
  display: grid;
  align-items: center;
  min-height: min(88svh, 780px);
  overflow: hidden;
  isolation: isolate;

  --text: var(--cream-100);
  --text-strong: #FFFBF0;
  --accent: var(--gold-500);        /* 6.58:1 sur le voile sombre ✓ */
  --accent-hover: var(--gold-400);
  --accent-contrast: var(--ink-900);
  --border-strong: rgba(217, 174, 95, .52);
  color: var(--text);
}
.c-hero__media {
  position: absolute;
  inset: 0;
  z-index: -2;
}
.c-hero__media img {
  width: 100%; height: 100%;
  object-fit: cover;
  object-position: center 32%;
}
/* Voile sombre en dur (pas var(--scrim)) : il doit rester sombre dans les deux
   thèmes pour que le titre crème garde son contraste sur les zones éclairées
   par les lanternes de l'illustration. Dégradé latéral + vertical : le texte
   est à gauche, c'est là qu'il faut le plus d'opacité. */
.c-hero__scrim {
  position: absolute;
  inset: 0;
  z-index: -1;
  background:
    linear-gradient(100deg, rgba(10, 21, 38, .92) 0%, rgba(10, 21, 38, .74) 38%, rgba(10, 21, 38, .30) 72%, rgba(10, 21, 38, .16) 100%),
    linear-gradient(to bottom, rgba(10, 21, 38, .55) 0%, rgba(10, 21, 38, .18) 42%, rgba(10, 21, 38, .62) 100%);
}
.c-hero__inner { padding-block: clamp(4rem, 12vw, 8rem); }
.c-hero__title {
  font-size: var(--t-3xl);
  max-width: 22ch;
  margin-bottom: var(--space-lg);
}
.c-hero__title em {
  font-style: italic;
  color: var(--accent);
}
.c-hero__text {
  font-size: var(--t-md);
  max-width: 48ch;
  color: var(--text);
  margin-bottom: var(--space-xl);
}
.c-hero__actions { display: flex; flex-wrap: wrap; gap: var(--space-sm); }

/* ==========================================================================
   Cartes livre
   ========================================================================== */
.c-books {
  display: grid;
  gap: clamp(1.5rem, 4vw, var(--space-xl));
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 20rem), 1fr));
}

.c-book {
  display: flex;
  flex-direction: column;
  gap: var(--space-md);
  padding: var(--space-lg);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  background: var(--surface);
  text-decoration: none;
  color: inherit;
  transition:
    transform var(--d-base) var(--ease-out),
    box-shadow var(--d-base) var(--ease-out),
    border-color var(--d-base) ease;
}
@media (hover: hover) and (pointer: fine) {
  .c-book:hover {
    transform: translateY(-4px);
    box-shadow: var(--shadow-lg), var(--shadow-glow);
    border-color: var(--border-strong);
  }
  .c-book:hover .c-book__cover img { transform: scale(1.03); }
}
.c-book:active { transform: scale(.99); }

.c-book__cover {
  overflow: hidden;
  border-radius: var(--r-md);
  background: var(--surface-2);
  aspect-ratio: 3 / 4;
}
.c-book__cover img {
  width: 100%; height: 100%;
  object-fit: cover;
  transition: transform var(--d-slow) var(--ease-warm);
}
.c-book__title { font-size: var(--t-lg); margin: 0; }
.c-book__meta {
  font-size: var(--t-xs);
  letter-spacing: var(--ls-caps);
  text-transform: uppercase;
  color: var(--accent);
}
.c-book__text { color: var(--text-muted); font-size: var(--t-sm); margin: 0; }
.c-book__foot { margin-top: auto; padding-top: var(--space-sm); }

/* ==========================================================================
   Stations — son propre dispositif narratif transformé en navigation.
   Les panneaux de gare de ses illustrations : « Station of Dreams », etc.
   ========================================================================== */
.c-stations {
  display: grid;
  gap: var(--space-md);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr));
  list-style: none;
  margin: 0; padding: 0;
}
.c-station {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: var(--space-xs);
  padding: var(--space-lg) var(--space-lg) var(--space-lg) calc(var(--space-lg) + 14px);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  background: var(--surface);
  overflow: hidden;
}
/* Le rail : rappel du filet doré des panneaux de gare. */
.c-station::before {
  content: '';
  position: absolute;
  top: 0; bottom: 0; left: 0;
  width: 3px;
  background: linear-gradient(to bottom, transparent, var(--accent-deco), transparent);
}
.c-station__name {
  font-family: var(--font-display);
  font-size: var(--t-md);
  color: var(--text-strong);
  margin: 0;
}
.c-station__text { font-size: var(--t-sm); color: var(--text-muted); margin: 0; }

/* ==========================================================================
   Bloc autrice
   ========================================================================== */
.c-author {
  display: grid;
  gap: clamp(1.75rem, 5vw, var(--space-2xl));
  align-items: center;
  grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
}
@media (max-width: 820px) {
  .c-author { grid-template-columns: 1fr; }
}
.c-author__portrait {
  position: relative;
  border-radius: var(--r-lg);
  overflow: hidden;
  aspect-ratio: 4 / 5;
  box-shadow: var(--shadow-lg);
}
.c-author__portrait img { width: 100%; height: 100%; object-fit: cover; }
/* Le cadre à volutes dorées de ses couvertures, réduit à un filet en retrait. */
.c-author__portrait::after {
  content: '';
  position: absolute;
  inset: 10px;
  border: 1px solid var(--border-strong);
  border-radius: var(--r-md);
  pointer-events: none;
}
.c-author__quote {
  font-family: var(--font-display);
  font-size: var(--t-lg);
  font-style: italic;
  line-height: 1.42;
  color: var(--text-strong);
  border-left: 2px solid var(--accent-deco);
  padding-left: var(--space-lg);
  margin: 0 0 var(--space-lg);
  max-width: 34ch;
}

/* ==========================================================================
   Bandeau boutique / mise en avant
   ========================================================================== */
.c-panel {
  padding: clamp(1.75rem, 5vw, var(--space-2xl));
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  background:
    radial-gradient(120% 140% at 12% 0%, var(--glow-soft), transparent 58%),
    var(--surface);
}
.c-panel__grid {
  display: grid;
  gap: var(--space-xl);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 17rem), 1fr));
}

/* ==========================================================================
   Fiche produit / options d'exemplaire
   ========================================================================== */
.c-variants { display: grid; gap: var(--space-sm); }
.c-variant {
  display: flex;
  align-items: flex-start;
  gap: var(--space-md);
  padding: var(--space-md) var(--space-lg);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  background: var(--surface);
  cursor: pointer;
  transition: border-color var(--d-fast) ease, background-color var(--d-fast) ease;
}
.c-variant:has(input:checked) {
  border-color: var(--border-strong);
  background: var(--glow-soft);
}
.c-variant__title { font-weight: 600; display: block; }
.c-variant__note { font-size: var(--t-sm); color: var(--text-muted); }
.c-variant__price { margin-left: auto; font-family: var(--font-display); font-size: var(--t-md); color: var(--accent); }

/* ==========================================================================
   Footer
   ========================================================================== */
.c-footer {
  margin-top: var(--space-3xl);
  padding-block: var(--space-2xl) var(--space-xl);
  border-top: 1px solid var(--border);
  background: var(--surface);
  color: var(--text-muted);
  font-size: var(--t-sm);
}
.c-footer__grid {
  display: grid;
  gap: var(--space-xl);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 13rem), 1fr));
  margin-bottom: var(--space-xl);
}
.c-footer h2, .c-footer h3 {
  font-family: var(--font-body);
  font-size: var(--t-xs);
  font-weight: 600;
  letter-spacing: var(--ls-caps);
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: var(--space-sm);
}
.c-footer ul { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--space-xs); }
.c-footer a { color: var(--text-muted); text-decoration: none; }
@media (hover: hover) and (pointer: fine) {
  .c-footer a:hover { color: var(--accent); }
}
.c-footer__bottom {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-md);
  justify-content: space-between;
  align-items: center;
  padding-top: var(--space-lg);
  border-top: 1px solid var(--border-subtle);
  font-size: var(--t-xs);
}
.c-social { display: flex; gap: var(--space-xs); }
.c-social a {
  display: inline-flex;
  align-items: center; justify-content: center;
  width: 40px; height: 40px;
  border: 1px solid var(--border);
  border-radius: var(--r-full);
  transition: transform var(--d-press) var(--ease-out), color var(--d-fast) ease, border-color var(--d-fast) ease;
}
@media (hover: hover) and (pointer: fine) {
  .c-social a:hover { color: var(--accent); border-color: var(--border-strong); }
}
.c-social a:active { transform: scale(.93); }
.c-social svg { width: 18px; height: 18px; }
