/* ============================================================
   PORTFOLIO — sections Vidéo (mosaïque) & Photo

   La mosaïque casse volontairement la grille régulière : une pièce
   large qui ouvre, deux verticales au format réseaux, une carrée,
   une large qui ferme. Chaque réalisation occupe une place différente
   pour éviter l'effet catalogue.

   Les cartes vidéo sont des « façades » : seule l'image poster est
   rendue au chargement, l'iframe YouTube arrive au clic
   (voir js/video-portfolio.js).

   Les tailles suivent le rem fluide défini dans le <head> de
   index.html, donc tout scale avec le reste du site.
   ============================================================ */

/* --- Cadre commun ------------------------------------------
   .container-large plafonne la largeur mais n'applique aucun padding
   horizontal : sans contrainte propre, le contenu file jusqu'aux bords
   de l'écran. On aligne donc sur la largeur utile de la galerie photo
   (.mwg_effect000 .medias, max-width 1200px), en un peu plus large pour
   que la mosaïque respire. */

.section_reel {
  padding: 8rem 0 7rem;
}

.section_reel > .reel_head,
.section_reel > .reel_mosaic {
  max-width: 1600px;
  margin-inline: auto;
  padding-inline: 3rem;
  box-sizing: border-box;
}

/* La galerie photo garde sa largeur d'origine (1200px, définie dans son
   embed), mais sa titraille s'aligne sur celle de la mosaïque. */
.section_move > .container-large {
  max-width: 1600px;
  margin-inline: auto;
  padding-inline: 3rem;
  box-sizing: border-box;
}

/* --- Titraille ---------------------------------------------- */

.reel_head {
  margin-bottom: 4.5rem;
}

.reel_eyebrow {
  color: var(--color--orange);
  font-size: 0.85rem;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  margin: 0 0 1rem;
}

/* Filet court : ancre le surtitre sans alourdir. */
.reel_eyebrow::before {
  content: "";
  display: inline-block;
  width: 2.5rem;
  height: 0.125rem;
  background: var(--color--orange);
  vertical-align: middle;
  margin-right: 0.75rem;
}

.reel_title {
  color: var(--color--purple-black);
  font-family: Clashdisplay Variable, sans-serif;
  font-size: clamp(3rem, 7vw, 7rem);
  font-weight: 700;
  line-height: 0.95;
  letter-spacing: -0.02em;
  margin: 0 0 1.5rem;
}

.reel_lede {
  color: var(--color--purple-black);
  font-size: clamp(1.05rem, 1.5vw, 1.35rem);
  line-height: 1.5;
  max-width: 38ch;
  margin: 0;
  opacity: 0.75;
}

/* --- Mosaïque ------------------------------------------------
   12 colonnes : permet des largeurs 7/5 (large + vertical) puis 5/7
   (carré + large) sans casser l'alignement vertical. */

/* minmax(0, 1fr) plutôt que 1fr : une piste 1fr se dimensionne sur le
   contenu le plus large (ici la légende et son max-width en ch) et fait
   déborder la mosaïque. Le minimum à 0 force la piste à suivre le
   conteneur, pas le texte. */
/* Le gap de ligne doit absorber la légende, qui vit sous le cadre et
   n'entre pas dans le calcul de la piste : 6rem évite qu'un titre touche
   la carte suivante. */
.reel_mosaic {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  gap: 6rem 2rem;
}

/* Même raison côté élément : min-width vaut auto par défaut. */
.reel_item {
  min-width: 0;
}

/* Toutes les vidéos étant en 16:9, le rythme vient de l'échelle et des
   décalages, pas des ratios. La pièce d'ouverture et celle de fermeture
   occupent 7 colonnes, les quatre autres 5. */
.reel_item.is-lead  { grid-column: span 7; }
.reel_item.is-mid   { grid-column: span 5; }
.reel_item.is-close { grid-column: span 7; }
.reel_item.is-short { grid-column: span 4; }

/* Quinconce : les moyennes de rang pair descendent, ce qui casse la
   lecture en lignes sans jamais faire remonter une carte dans la
   légende de sa voisine. */
.reel_item.is-mid:nth-of-type(3),
.reel_item.is-mid:nth-of-type(5) {
  margin-top: 4rem;
}

/* Dernière ligne : le paysage (7 col) et le vertical (4 col) se
   partagent la largeur. Le Short étant beaucoup plus haut à largeur
   égale, on l'aligne sur le bas du paysage plutôt que sur le haut. */
.reel_item.is-short {
  align-self: end;
}

/* --- Carte ---------------------------------------------------- */

/* Un <button> se dimensionne sur son contenu minimum et ignore la piste
   de grille : sans min-width:0 il impose sa largeur intrinsèque et fait
   déborder la page sur mobile. */
.reel_trigger {
  display: block;
  width: 100%;
  min-width: 0;
  max-width: 100%;
  padding: 0;
  border: 0;
  background: none;
  text-align: left;
  cursor: pointer;
  color: inherit;
  font: inherit;
}

.reel_trigger:focus-visible {
  outline: 0.125rem solid var(--color--orange);
  outline-offset: 0.75rem;
}

.reel_frame {
  position: relative;
  display: block;
  width: 100%;
  min-width: 0;
  max-width: 100%;
  overflow: hidden;
  border-radius: 1rem;
  background: var(--color--purple-black);
}

/* Le ratio du cadre suit celui du tournage, pour que le poster et le
   player coïncident sans bandes noires. */
.reel_frame { aspect-ratio: 16 / 9; }
.is-short .reel_frame { aspect-ratio: 9 / 16; }

.reel_poster {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transform: scale(1.02);
  transition: transform 0.9s cubic-bezier(0.16, 1, 0.3, 1);
}

.reel_trigger:hover .reel_poster {
  transform: scale(1.07);
}

/* Voile bas : garantit la lisibilité du play quelle que soit l'image. */
.reel_frame::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(13, 11, 7, 0) 45%, rgba(13, 11, 7, 0.5) 100%);
  pointer-events: none;
  transition: opacity 0.5s ease;
}

/* --- Bouton lecture ------------------------------------------- */

.reel_play {
  position: absolute;
  left: 1.75rem;
  bottom: 1.75rem;
  width: 4.5rem;
  height: 4.5rem;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--color--orange);
  color: var(--color--blanc);
  z-index: 1;
  transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1),
              background-color 0.3s ease;
}

.reel_play svg {
  margin-left: 0.15rem;
}

.reel_trigger:hover .reel_play {
  transform: scale(1.15);
}

/* Halo qui pulse au survol : attire l'œil sans animation permanente. */
.reel_play::after {
  content: "";
  position: absolute;
  inset: -0.5rem;
  border: 0.125rem solid var(--color--orange);
  border-radius: 50%;
  opacity: 0;
  transform: scale(0.85);
  transition: opacity 0.5s ease, transform 0.5s ease;
}

.reel_trigger:hover .reel_play::after {
  opacity: 0.55;
  transform: scale(1);
}

/* --- Légende --------------------------------------------------- */

.reel_meta {
  display: flex;
  gap: 1.25rem;
  padding-top: 1.5rem;
}

.reel_index {
  color: var(--color--orange);
  font-family: Clashdisplay Variable, sans-serif;
  font-size: 0.9rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  padding-top: 0.35rem;
}

/* Même contrainte que la grille : un élément flex refuse par défaut de
   passer sous la largeur intrinsèque de son texte. */
.reel_body {
  display: block;
  min-width: 0;
}

.reel_name {
  display: block;
  color: var(--color--purple-black);
  font-family: Clashdisplay Variable, sans-serif;
  font-size: clamp(1.5rem, 2.2vw, 2.1rem);
  font-weight: 600;
  line-height: 1.15;
  margin-bottom: 0.4rem;
}

.reel_desc {
  display: block;
  color: var(--color--purple-black);
  font-size: clamp(0.95rem, 1.1vw, 1.1rem);
  line-height: 1.5;
  max-width: 42ch;
  opacity: 0.7;
}

/* --- Lecture en cours ------------------------------------------ */

.reel_item.is-playing .reel_poster,
.reel_item.is-playing .reel_play,
.reel_item.is-playing .reel_frame::after {
  opacity: 0;
  visibility: hidden;
}

.reel_frame iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
  z-index: 2;
}

/* --- Carte pas encore renseignée -------------------------------- */

.reel_item[data-yt-id=""] .reel_play {
  background: #6b7280;
}

.reel_item[data-yt-id=""] .reel_trigger {
  cursor: not-allowed;
}

/* --- Section Photo — galerie justifiée ---------------------------- */

.section_gallery {
  padding: 2rem 0 7rem;
}

.section_gallery > .reel_head,
.section_gallery > .gallery_grid {
  max-width: 1600px;
  margin-inline: auto;
  padding-inline: 3rem;
  box-sizing: border-box;
}

/* 6 colonnes : permet des lignes de 2 (3+3), de 3 (2+2+2) et la ligne
   portrait + 2 empilées, sans jamais casser l'alignement vertical. */
.gallery_grid {
  display: grid;
  grid-template-columns: repeat(6, minmax(0, 1fr));
  gap: 1.5rem;
}

.shot {
  position: relative;
  grid-column: span 2;
  min-width: 0;
  margin: 0;
  overflow: hidden;
  border-radius: 1rem;
  background: var(--color--purple-black);
  aspect-ratio: 3 / 2;
  cursor: zoom-in;
}

/* Grande : la moitié d'une ligne. */
.shot.is-wide {
  grid-column: span 3;
}

/* Ligne portrait : le vertical (2 col) tient la hauteur de deux
   lignes ; les deux paysages qui l'accompagnent occupent chacun les
   4 colonnes restantes, empilés à sa droite. Leur ratio est forcé à 2:1
   pour que la somme de leurs hauteurs égale celle du portrait. */
.shot.is-portrait {
  grid-column: span 2;
  grid-row: span 2;
  aspect-ratio: 2 / 3;
}

.shot.is-tall-pair {
  grid-column: span 4;
  aspect-ratio: 40 / 13;
}

/* Image de clôture : pleine largeur, en panoramique pour ne pas dominer
   la page à elle seule. */
.shot.is-full {
  grid-column: 1 / -1;
  aspect-ratio: 3 / 1;
}

.shot img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 0.8s cubic-bezier(0.16, 1, 0.3, 1);
}

.shot:hover img {
  transform: scale(1.05);
}

/* Voile au survol : signale que l'image est cliquable. */
.shot::after {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(13, 11, 7, 0.25);
  opacity: 0;
  transition: opacity 0.4s ease;
  pointer-events: none;
}

.shot:hover::after {
  opacity: 1;
}

/* --- Visionneuse -------------------------------------------------- */

.lightbox {
  position: fixed;
  inset: 0;
  z-index: 9999;
  display: none;
  place-items: center;
  background: rgba(13, 11, 7, 0.94);
  padding: 3rem;
  box-sizing: border-box;
}

.lightbox.is-open {
  display: grid;
}

.lightbox_img {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  border-radius: 0.5rem;
}

.lightbox_close,
.lightbox_nav {
  position: absolute;
  display: grid;
  place-items: center;
  width: 3.5rem;
  height: 3.5rem;
  border: 0;
  border-radius: 50%;
  background: var(--color--orange);
  color: var(--color--blanc);
  cursor: pointer;
  transition: transform 0.3s ease;
}

.lightbox_close:hover,
.lightbox_nav:hover {
  transform: scale(1.1);
}

.lightbox_close {
  top: 2rem;
  right: 2rem;
  font-size: 1.5rem;
  line-height: 1;
}

.lightbox_nav.is-prev { left: 2rem; }
.lightbox_nav.is-next { right: 2rem; }

.lightbox_count {
  position: absolute;
  bottom: 2rem;
  left: 50%;
  transform: translateX(-50%);
  color: var(--color--blanc);
  font-size: 0.9rem;
  letter-spacing: 0.08em;
}

/* --- Responsive galerie ------------------------------------------- */

@media screen and (max-width: 1100px) {
  .gallery_grid {
    gap: 1rem;
  }
}

@media screen and (max-width: 860px) {
  /* 4 colonnes : deux images par ligne, le portrait garde sa hauteur
     double en occupant la moitié gauche. */
  .gallery_grid {
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }

  .shot,
  .shot.is-wide,
  .shot.is-tall-pair,
  .shot.is-full {
    grid-column: span 2;
    /* Le ratio panoramique/allongé du desktop n'a plus de sens sur une
       demi-largeur : on revient au 3:2 natif. */
    aspect-ratio: 3 / 2;
  }

  .shot.is-portrait {
    grid-column: span 2;
    grid-row: span 2;
    aspect-ratio: 2 / 3;
  }
}

@media screen and (max-width: 767px) {
  .section_gallery {
    padding: 1rem 0 4rem;
  }

  .section_gallery > .reel_head,
  .section_gallery > .gallery_grid {
    padding-inline: 1.25rem;
  }

  /* Une image par ligne : sur un écran étroit, deux vignettes côte à
     côte ne montrent plus rien du cadrage. */
  .gallery_grid {
    grid-template-columns: 1fr;
    gap: 1rem;
  }

  .shot,
  .shot.is-wide,
  .shot.is-tall-pair,
  .shot.is-portrait,
  .shot.is-full {
    grid-column: 1 / -1;
    grid-row: auto;
    aspect-ratio: 3 / 2;
  }

  /* Le portrait garde son format vertical même empilé. */
  .shot.is-portrait {
    aspect-ratio: 2 / 3;
  }

  .lightbox {
    padding: 1.25rem;
  }

  .lightbox_close { top: 1rem; right: 1rem; }
  .lightbox_nav.is-prev { left: 0.75rem; }
  .lightbox_nav.is-next { right: 0.75rem; }
}

/* --- Responsive --------------------------------------------------- */

@media screen and (max-width: 1100px) {
  /* Les colonnes se resserrent mais les légendes gardent leur hauteur :
     on conserve donc un gap de ligne généreux et on annule la remontée
     de la carrée, qui sinon vient buter dans le texte au-dessus. */
  .reel_mosaic {
    gap: 5rem 1.5rem;
  }

  .reel_item.is-mid:nth-of-type(3),
  .reel_item.is-mid:nth-of-type(5) {
    margin-top: 2.5rem;
  }
}

@media screen and (max-width: 860px) {
  /* Sous 860px la mosaïque devient illisible : on repasse en pleine
     largeur, un projet après l'autre, et on annule les décalages.
     Le :nth-of-type est répété ici pour égaler la spécificité de la
     règle desktop qui décale la 2e verticale — sans ça elle resterait
     sur 5 colonnes. */
  .reel_item.is-lead,
  .reel_item.is-mid,
  .reel_item.is-close,
  .reel_item.is-short,
  .reel_item.is-mid:nth-of-type(3),
  .reel_item.is-mid:nth-of-type(5) {
    grid-column: 1 / span 12;
    margin-top: 0;
  }

  /* En pleine largeur, un 9:16 occuperait presque deux écrans de haut :
     on borne sa hauteur et on centre le cadre. */
  .reel_item.is-short .reel_frame {
    max-width: 22rem;
    margin-inline: auto;
  }

  .reel_mosaic {
    gap: 3.5rem;
  }
}

@media screen and (max-width: 767px) {
  .section_reel {
    padding: 4.5rem 0 4rem;
  }

  .section_reel > .reel_head,
  .section_reel > .reel_mosaic {
    padding-inline: 1.25rem;
  }

  .reel_head {
    margin-bottom: 3rem;
  }

  .reel_play {
    left: 1.15rem;
    bottom: 1.15rem;
    width: 3.5rem;
    height: 3.5rem;
  }

  .reel_play svg {
    width: 22px;
    height: 22px;
  }

  .reel_meta {
    gap: 0.9rem;
    padding-top: 1.15rem;
  }

  .section_move {
    padding-top: 3.5rem;
  }
}
