/* ==========================================================================
   MAFOTO — La Pile                                            [source : Fiber]
   Reproduction du « Motion Layer » en CSS 3D pur, sans bibliothèque.
   Relevé sur fiber.framer.ai : perspective 1900 px, plateau tourné une fois,
   cartes espacées de 128 px en translateZ.
   ========================================================================== */

.reel {
  position: relative;
  height: 100svh;
  overflow: hidden;
  cursor: grab;
  touch-action: pan-y;
}
.reel:active { cursor: grabbing; }

/* La caméra et le plateau sont des boîtes pleine section posées au plan z = 0.
   Sans `pointer-events: none`, elles interceptent le curseur pour TOUTE carte
   située derrière ce plan (translateZ négatif) : c'est ce qui rendait la moitié
   de la Pile inerte à partir de la quatrième image. On les rend transparentes
   au pointeur et on le réactive uniquement sur les cartes. */
.reel__camera {
  position: absolute;
  inset: 0;
  perspective: 1900px;
  perspective-origin: 50% 48%;
  pointer-events: none;
}

/* Le plateau porte seul la rotation. Les cartes n'ont qu'à se déplacer en Z :
   la diagonale à l'écran est produite par la rotation héritée. */
.reel__stage {
  position: absolute;
  inset: 0;
  transform-style: preserve-3d;
  transform: rotateX(-14deg) rotateY(-44deg);
  pointer-events: none;
}

.card {
  position: absolute;
  top: 50%;
  left: 50%;
  width: clamp(250px, 24vw, 360px);
  aspect-ratio: 3 / 4;          /* la Pile ne prend QUE des portraits */
  border-radius: var(--radius); /* jamais d'angle vif sur une image */
  overflow: hidden;
  background: #0b0b0c;
  box-shadow: 0 40px 90px rgba(0, 0, 0, .5);
  /* La carte n'a aucun enfant en 3D : le plateau seul porte la profondeur. */
  transform-style: flat;
  will-change: transform, opacity;
  /* Seules les cartes reçoivent le pointeur (voir .reel__stage). */
  pointer-events: auto;
  cursor: zoom-in;
}

/* --- Deux images superposées : étalonnée (par défaut) et d'origine ---------
   Le survol du curseur rend ses couleurs à la photo. C'est le collimateur
   d'autofocus transposé à la couleur : la machine voit en valeurs, l'œil humain
   voit en couleurs. Le curseur fait basculer de l'un à l'autre.
   Les deux fichiers sont cuits à la fabrication (tools/grade_reel.py) : aucun
   filtre CSS, donc aucun coût GPU et aucun piège de composition.
--------------------------------------------------------------------------- */
.card__img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.card__img--true { opacity: 0; transition: opacity 520ms var(--ease); }
.card:hover .card__img--true { opacity: 1; }

/* Halo doux sous la carte visée, en complément de l'arc tournant (.orbit).
   Le box-shadow porte la diffusion, l'arc porte le mouvement. */
.card { transition: box-shadow 380ms var(--ease); }
.card:hover {
  box-shadow:
    0 0 40px rgba(255, 192, 0, .22),
    0 40px 90px rgba(0, 0, 0, .55);
}

.card__label {
  position: absolute;
  left: 14px;
  bottom: 12px;
  z-index: 2;
  color: #fff;
  font-size: var(--t-meta);
  font-weight: var(--w-medium);
  text-transform: uppercase;
  text-shadow: 0 1px 8px rgba(0, 0, 0, .6);
  opacity: .9;
}

/* --------------------------------------------------------------------------
   Accroche et repères posés par-dessus la Pile
   -------------------------------------------------------------------------- */
/* Le mot est un DÉCOR DE FOND : la Pile glisse par-dessus et le mange
   partiellement. C'est ce recouvrement qui donne la profondeur — le mot n'a
   pas besoin d'être lu en entier, il a besoin d'être reconnu. */
.reel__title {
  position: absolute;
  left: var(--gutter);
  top: 50%;
  transform: translateY(-50%);
  z-index: 1;
  pointer-events: none;
  color: var(--ink-1);
  opacity: .92;
}
.reel__lede {
  position: absolute;
  left: var(--gutter);
  top: calc(var(--gutter) + 44px);
  z-index: 10;
  max-width: 32ch;
  pointer-events: none;
  color: var(--ink-2);
}
.reel__hint {
  position: absolute;
  left: 50%;
  bottom: 92px;
  transform: translateX(-50%);
  z-index: 10;
  color: var(--ink-3);
  font-size: var(--t-meta);
  text-transform: uppercase;
  letter-spacing: .07em;
  pointer-events: none;
}

/* Flèches de défilement horizontal.
   Indispensables : une souris classique n'émet pas de `deltaX`, et on refuse
   de détourner la molette verticale qui appartient à la page. */
.reel__nav {
  position: absolute;
  right: var(--gutter);
  bottom: 92px;
  z-index: 12;
  display: flex;
  gap: 6px;
}
.reel__arrow {
  width: 42px;
  height: 42px;
  display: grid;
  place-items: center;
  border: 1px solid var(--glass-border);
  border-radius: 50%;
  background: var(--glass-bg);
  backdrop-filter: blur(var(--glass-blur));
  -webkit-backdrop-filter: blur(var(--glass-blur));
  color: var(--ink-1);
  transition: background 300ms var(--ease), transform 300ms var(--ease);
}
.reel__arrow:hover { background: var(--beam); color: #121212; }
.reel__arrow:active { transform: scale(.94); }

/* Indicateur de suite : le dégradé dit « ça continue » sans le dire. */
.reel::after {
  content: '';
  position: absolute;
  inset: 0 0 0 auto;
  width: 14vw;
  z-index: 11;
  background: linear-gradient(to right, transparent, var(--paper));
  pointer-events: none;
}

/* --------------------------------------------------------------------------
   REPLI MOBILE — UNE FILE QUI SE FEUILLETTE, PAS UN MUR DE 7 500 PIXELS
   ==========================================================================
   Ce qu'il y avait avant : les seize cartes empilées en COLONNE pleine
   largeur. Mesuré sur un écran de 375 px, ça faisait 7 563 px de haut — 36 %
   de la hauteur totale de la page pour une seule section, et rien d'autre à
   faire que défiler pendant vingt secondes. Personne n'arrive au bout.

   Ici la file reste horizontale, comme sur grand écran, mais sans rig 3D :
   un simple défilement natif avec aimant. Le geste demandé est le même —
   « glissez » — et il coûte une hauteur de carte au lieu de seize.

   TROIS PIÈGES, tous les trois rencontrés :

     1. `touch-action: pan-y` sur `.reel` INTERDIT le glissement horizontal au
        doigt. Posé pour la version 3D (où le glissement est piloté en JS et
        où la molette verticale doit rester à la page), il rend ici la file
        totalement immobile. On le rend à `auto`.
     2. `.reel__camera` et `.reel__stage` sont neutralisés au pointeur pour
        laisser passer le curseur vers les cartes en profondeur. À plat, il
        n'y a plus de profondeur : c'est le plateau qui porte le défilement,
        il doit redevenir sensible au doigt.
     3. le rig JS est éteint sous 781 px, donc l'écouteur qui ouvrait une photo
        l'était aussi : AUCUNE carte ne s'ouvrait au doigt. Corrigé côté
        js/ui/reel.js — un écouteur de clic vit maintenant hors du rig.
   -------------------------------------------------------------------------- */
@media (max-width: 780px), (prefers-reduced-motion: reduce) {
  .reel {
    height: auto;
    overflow: visible;
    cursor: default;
    touch-action: auto;
    padding-bottom: clamp(26px, 5vh, 48px);
  }
  .reel__camera { position: static; perspective: none; pointer-events: auto; }

  .reel__stage {
    position: static;
    transform: none;
    transform-style: flat;
    pointer-events: auto;

    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: min(76vw, 320px);
    gap: 10px;
    padding-inline: var(--gutter);

    overflow-x: auto;
    overscroll-behavior-x: contain;
    scroll-snap-type: x mandatory;
    scroll-padding-inline: var(--gutter);
    /* Pas de piste de défilement : la page n'en a nulle part ailleurs. */
    scrollbar-width: none;
    -ms-overflow-style: none;
  }
  .reel__stage::-webkit-scrollbar { width: 0; height: 0; }

  .card {
    position: static;
    width: 100%;
    transform: none !important;
    opacity: 1 !important;
    scroll-snap-align: center;
    box-shadow: 0 14px 34px rgba(0, 0, 0, .16);
  }
  /* Le halo doré du survol n'a pas de sens au doigt : il resterait allumé sur
     la dernière carte touchée. */
  .card:hover { box-shadow: 0 14px 34px rgba(0, 0, 0, .16); }
  .card__img--true { opacity: 1; }   /* pas de survol au doigt : couleurs vraies */

  .reel__title {
    position: static;
    transform: none;
    mix-blend-mode: normal;
    padding: 92px var(--gutter) 0;
    color: var(--ink-1);
  }
  .reel__lede {
    position: static;
    max-width: none;
    padding: clamp(46px, 9vh, 92px) var(--gutter) 26px;
  }

  /* L'indication et les flèches passent SOUS la file, en flux normal. Elles
     étaient masquées : sans elles, rien ne dit que la file continue à droite. */
  .reel__hint {
    position: static;
    transform: none;
    padding: 18px var(--gutter) 0;
    text-align: center;
  }
  .reel__nav {
    position: static;
    justify-content: center;
    margin-top: 14px;
  }
  .reel::after { content: none; }
}

/* Au doigt, la file se feuillette d'un glissement : deux flèches en plus, ce
   n'est plus une aide, c'est du mobilier. Elles restent pour le pointeur fin
   en mouvement réduit, où le glissement n'est pas naturel. */
@media (hover: none) {
  .reel__nav { display: none; }
}
