/* Bibliothèque Exkave — grille vivante de pressages.
   Nike pour le rythme des modules, Adidas pour la mécanique catalogue. */
body.library-page[data-ex-biblio] {
  --lib-page: #080807;
  --lib-sidebar: #10100e;
  --lib-results: #141310;
  --lib-card: #1a1916;
  --lib-card-raised: #211f1a;
  --lib-ink: #fffdf7;
  --lib-brass: #d1b56f;
}

body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) {
  padding-top: 28px;
  background: var(--lib-page);
}

body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel {
  margin: 0 var(--reprise-content-gutter, 44px) 22px;
  padding: 20px 24px 22px;
  border: 0;
  background: var(--lib-results);
}

body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .panel-head {
  margin: 0 0 14px;
}

body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .panel-title {
  font-size: clamp(26px, 2.4vw, 34px);
}

body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .panel-meta {
  margin-top: 8px;
}

body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-controls,
body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail-hint {
  display: none;
}

body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail-shell {
  grid-template-columns: 24px minmax(0,1fr) 24px;
  gap: 8px;
  align-items: start;
  padding: 0;
}

body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail-shell > .rail-nav {
  align-self: start;
  min-height: 156px;
  height: 156px;
}

body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail {
  grid-auto-columns: 112px;
  grid-auto-rows: max-content;
  align-self: start;
  align-items: start;
  gap: 14px;
  min-height: 0;
  height: auto;
  padding: 2px 3px 4px;
}

body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail .result,
body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail .result.active {
  min-height: 0;
  padding: 0;
  border: 0;
  background: transparent;
  box-shadow: none;
  transform: none;
}

body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail .cover-placeholder,
body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail .result.active .cover-placeholder {
  display: block;
  /* `112px` sec ecrasait la regle fluide de `library-v21` a TOUTES les
     largeurs : a 390 px la vignette du rail fait 89 px et le carton debordait
     de 23 px — 29 fois par ecran, sur chaque ecran, releve par le smoke du
     2026-08-18. `min()` garde la taille de bureau sans jamais depasser le
     parent, et ne demande aucune requete media. */
  width: min(112px, 100%);
  height: auto;
  aspect-ratio: 1;
  border-radius: 0;
}

body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail .result h3 {
  margin: 9px 0 2px;
  font-size: 14px;
}

body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .detail {
  margin: 0 var(--reprise-content-gutter, 44px);
  padding: 0;
  background: transparent;
}

body.library-page[data-ex-biblio] .pressing-card-heading {
  margin-bottom: 18px;
}

body.library-page[data-ex-biblio] .pressing-card-heading span {
  display: block;
  color: var(--lib-brass);
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 400;
  letter-spacing: .14em;
  text-transform: uppercase;
}

body.library-page[data-ex-biblio] .pressing-card-heading h4 {
  margin: 5px 0 0;
  color: var(--lib-ink);
  font-family: var(--font-display);
  font-size: clamp(21px, 1.7vw, 27px);
  font-weight: 400;
  line-height: 1.04;
}

@media (min-width: 981px) {
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] #detail > .master {
    display: grid;
    grid-template-columns: 232px minmax(0,1fr);
    gap: 28px;
    align-items: start;
  }

  body.library-page[data-ex-biblio] .pressing-filter-shell {
    position: sticky;
    top: 92px;
    z-index: 24;
    display: block;
    margin: 0;
    padding: 25px 21px 23px;
    background: var(--lib-sidebar);
  }

  body.library-page[data-ex-biblio] .pressing-filter-toggle {
    display: block;
    width: 100%;
    margin: 0 0 22px;
    padding: 0 0 14px;
    border: 0;
    border-bottom: 1px solid rgba(255,253,247,.13);
    color: var(--lib-ink);
    background: transparent;
    font-family: var(--font-display);
    font-size: 19px;
    font-weight: 400;
    letter-spacing: 0;
    text-align: left;
    text-transform: none;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-filter-bar {
    display: grid;
    grid-template-columns: 1fr;
    gap: 17px;
    margin: 0;
    padding: 0;
    border: 0;
    background: transparent;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-filter-field {
    display: grid;
    gap: 6px;
    min-height: 0;
    padding: 0;
    border: 0;
    background: transparent;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-filter-field > span {
    color: rgba(255,253,247,.48);
    font-size: 9px;
    letter-spacing: .13em;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-filter-field :is(input,select) {
    min-height: 38px;
    padding: 0;
    border: 0;
    border-bottom: 1px solid rgba(255,253,247,.18);
    border-radius: 0;
    color: var(--lib-ink);
    background: transparent;
    box-shadow: none;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .price-code-input-wrap {
    display: grid;
    grid-template-columns: minmax(0,1fr) 34px;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-filter-submit {
    min-height: 42px;
    margin-top: 3px;
    border: 0;
    background: var(--lib-brass);
    color: #15120b;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .field-clear {
    justify-self: start;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .lineage-branch {
    min-width: 0;
    padding: 25px;
    background: var(--lib-results);
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressings-head {
    margin-bottom: 24px;
    padding-bottom: 17px;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-grid {
    display: grid;
    grid-template-columns: repeat(3,minmax(0,1fr));
    grid-auto-flow: dense;
    gap: 18px;
    overflow: visible;
    border: 0;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing,
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing:nth-child(even),
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing:nth-child(3n + 2),
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing:nth-child(3n) {
    position: relative;
    display: flex;
    flex-direction: column;
    width: auto;
    min-width: 0;
    max-width: none;
    min-height: 492px;
    margin: 0;
    padding: 0 0 62px;
    overflow: hidden;
    border: 0;
    background: var(--lib-card);
    box-shadow: none;
    opacity: 1;
    transform: none;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing.is-featured-pressing {
    grid-column: span 2;
    display: grid;
    grid-template-columns: minmax(280px,1.08fr) minmax(245px,.92fr);
    grid-template-rows: minmax(0,1fr);
    min-height: 492px;
    background: var(--lib-card-raised);
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing > .pressing-cover {
    position: relative;
    display: block;
    width: 100%;
    max-width: none;
    height: auto;
    min-height: 0;
    aspect-ratio: 1;
    border: 0;
    border-radius: 0;
    box-shadow: none;
    grid-column: auto;
    grid-row: auto;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing.is-featured-pressing > .pressing-cover {
    grid-column: 1;
    grid-row: 1;
    height: 100%;
    min-height: 492px;
    aspect-ratio: auto;
    background: #0c0b09;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing.is-featured-pressing > .pressing-cover img {
    object-fit: contain;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-card-data {
    grid-column: auto;
    grid-row: auto;
    min-width: 0;
    padding: 19px;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing.is-featured-pressing .pressing-card-data {
    grid-column: 2;
    grid-row: 1;
    display: flex;
    flex-direction: column;
    justify-content: center;
    padding: 30px 26px 70px;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-facts-grid {
    grid-template-columns: repeat(2,minmax(0,1fr));
    gap: 13px 15px;
    margin: 0;
    padding: 0;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-facts-grid .pressing-fact strong,
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-facts-grid .pressing-fact:nth-child(1) strong,
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-facts-grid .pressing-fact:nth-child(2) strong {
    color: var(--lib-ink);
    font-size: 14px;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-runout-grid {
    position: absolute;
    inset: auto 0 0;
    z-index: 5;
    display: grid;
    grid-template-columns: 1fr;
    gap: 9px;
    max-width: none;
    padding: 70px 19px 60px;
    border: 0;
    background: linear-gradient(180deg, transparent, rgba(8,8,7,.97) 34%);
    opacity: 0;
    transform: translateY(7px);
    transition: opacity .26s ease, transform .26s ease;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing:hover .pressing-runout-grid,
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing:focus-visible .pressing-runout-grid {
    opacity: 1;
    transform: none;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing::before {
    position: absolute;
    top: 13px;
    left: 13px;
    z-index: 8;
    width: 31px;
    height: 31px;
    display: grid;
    place-items: center;
    padding: 0;
    border-radius: 50%;
    color: #15120b;
    background: var(--lib-brass);
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing::after {
    right: auto;
    bottom: 20px;
    left: 19px;
    z-index: 9;
    border-bottom-color: rgba(209,181,111,.54);
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing > .pressing-card-flags {
    top: 13px;
    right: 13px;
    bottom: auto;
    z-index: 9;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-add-cta {
    margin-top: 28px;
  }
}

@media (min-width: 761px) and (max-width: 980px) {
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-grid {
    display: grid;
    grid-template-columns: repeat(2,minmax(0,1fr));
    gap: 16px;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing,
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing:nth-child(even),
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing:nth-child(3n + 2),
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing:nth-child(3n) {
    display: flex;
    flex-direction: column;
    min-height: 0;
    padding: 0 0 74px;
    background: var(--lib-card);
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing.is-featured-pressing {
    grid-column: span 2;
    display: grid;
    grid-template-columns: minmax(0,1.1fr) minmax(235px,.9fr);
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing > .pressing-cover {
    display: block;
    width: 100%;
    max-width: none;
    height: auto;
    aspect-ratio: 1;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-card-data {
    padding: 18px;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-runout-grid {
    padding-inline: 0;
  }
}

@media (max-width: 760px) {
  body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel,
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .detail {
    margin-inline: 8px;
  }

  body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail {
    grid-auto-columns: 108px;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: 16px;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing,
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing:nth-child(even),
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing:nth-child(3n + 2),
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing:nth-child(3n) {
    display: flex;
    flex-direction: column;
    min-height: 0;
    padding: 0 0 70px;
    background: var(--lib-card);
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing > .pressing-cover {
    display: block;
    width: 100%;
    max-width: none;
    height: auto;
    aspect-ratio: 1;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-card-data {
    padding: 18px;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-runout-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: 10px;
    padding: 16px 0 0;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing::before {
    top: 12px;
    left: 12px;
    z-index: 7;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing::after {
    bottom: 20px;
    left: 18px;
  }

  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing > .pressing-card-flags {
    top: 12px;
    right: 12px;
    bottom: auto;
  }
}

/* La fiche album parent partage exactement la largeur et les angles du panneau
   de discographie placé au-dessus. Le composant historique `.detail` était
   encore dimensionné par son contenu flex et conservait 30 px de padding :
   sa bordure droite sortait alors de la grille. */
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] #detail {
  display: block;
  width: auto;
  min-width: 0;
  max-width: none;
  box-sizing: border-box;
  justify-self: stretch;
  padding: 0 !important;
  overflow: hidden;
  border: 0 !important;
  border-radius: 22px !important;
  background: transparent !important;
  box-shadow: none !important;
}

body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] #detail > .master,
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] #detail .master-top {
  width: 100%;
  min-width: 0;
  max-width: 100%;
}

body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] #detail .master-top {
  border-radius: 22px;
}

@media (prefers-reduced-motion: reduce) {
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-runout-grid {
    transition: none;
  }
}



/* ===========================================================================
   RANGÉE ARTISTES + GRILLE DE PRESSAGES
   Correction de direction du 2026-08-18 : la version précédente présentait les
   artistes en escalier de noms sur fond noir, sans une seule pochette. Sur une
   page de disques, la pochette est l'entrée ; le nom vient après.

   Le reste est droit et régulier : mêmes tuiles, mêmes gouttières, mêmes
   alignements. La variation vient d'UN module large, pas d'une composition
   bancale.
   =========================================================================== */
body.library-page[data-ex-biblio] #artist-discovery {
  display: grid !important;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: clamp(14px, 1.6vw, 24px);
  margin: 0;
  padding: 0;
}
body.library-page[data-ex-biblio] .artist-pick {
  display: block;
  margin: 0 !important;
  padding: 0 !important;
  border: 0 !important;
  background: none !important;
  text-decoration: none;
  color: inherit;
  transform: none !important;
}
body.library-page[data-ex-biblio] .artist-pick-vue {
  display: block;
  aspect-ratio: 1;
  overflow: hidden;
  background: var(--lib-card, #1a1916);
  box-shadow: 0 12px 28px rgba(0, 0, 0, .45);
  transition: transform .4s cubic-bezier(.2, .7, .2, 1);
}
body.library-page[data-ex-biblio] .artist-pick-vue img {
  width: 100%; height: 100%; object-fit: cover; display: block;
}
body.library-page[data-ex-biblio] .artist-pick:hover .artist-pick-vue { transform: translateY(-5px); }
body.library-page[data-ex-biblio] .artist-pick:focus-visible .artist-pick-vue {
  outline: 2px solid var(--lib-brass, #d1b56f); outline-offset: 4px;
}
body.library-page[data-ex-biblio] .artist-pick-copy {
  display: block;
  margin-top: 10px;
  padding-top: 8px;
  border-top: 1px solid rgba(255, 253, 247, .13);
}
body.library-page[data-ex-biblio] .artist-pick-copy strong {
  display: block;
  font-size: 15px;
  font-weight: 400;
  letter-spacing: -.01em;
  color: var(--lib-ink, #fffdf7);
}
body.library-page[data-ex-biblio] .artist-pick-copy small {
  display: block;
  margin-top: 3px;
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: .09em;
  text-transform: uppercase;
  color: rgba(255, 253, 247, .48);
}

/* ===========================================================================
   TRANSPOSITION DE LA MAQUETTE — BIBLIOTHEQUE
   Reference : exkave_bibliotheque_mockup.html, validee le 2026-08-18.
   On transpose la composition, on ne la reinterprete pas. Les crochets sont
   ceux qui existaient deja : rien n'a ete deplace dans le DOM.

   INVARIANT UI EXKAVE
     Album parent != pressage. Un pressage appartient a un album parent.
     ARTISTE -> ALBUM PARENT -> PRESSAGES ENFANTS. Jamais aplati.

   Correspondances maquette -> produit :
     .hero            -> .exb-entree  (+ .exb-scene, ajoutee)
     .artist-context  -> .album-panel (.panel-head, #results)
     .album-card      -> #results .result   (PARENTS)
     .parent-banner   -> .master-top
     .filters         -> .pressing-filter-shell  (5 champs existants)
     .cards .pressing -> .pressing-grid > .pressing  (ENFANTS)
     .news-insert     -> .exb-rappel
     .add-box         -> .pressing-add-cta
   =========================================================================== */

/* --- 1 · typographie, scopee a la Bibliotheque -----------------------------
   La famille vient du contrat global ; aucun chargement local ou CDN. */
body.library-page[data-ex-biblio],
body.library-page[data-ex-biblio] .base-title,
body.library-page[data-ex-biblio] h1,
body.library-page[data-ex-biblio] h2,
body.library-page[data-ex-biblio] h3,
body.library-page[data-ex-biblio] h4 {
  font-family: var(--font-body) !important;
}

body.library-page[data-ex-biblio] {
  --mq-surface: #151512;
  --mq-surface-2: #1b1a16;
  --mq-text: #f5f2ea;
  --mq-muted: #aaa69c;
  --mq-muted-2: #77736b;
  --mq-or: #d4b45e;
  --mq-or-clair: #f0d680;
  --mq-trait: rgba(212, 180, 94, .22);
  --mq-trait-doux: rgba(255, 255, 255, .07);
  --mq-ombre: 0 20px 55px rgba(0, 0, 0, .35);
}

/* --- 2 · le hero ---------------------------------------------------------- */
body.library-page[data-ex-biblio] .exb-entree {
  position: relative;
  overflow: hidden;
  /* Deux colonnes, deux rangees, PLACEMENT EXPLICITE. En placement
     automatique, `.search-panel` et le rail tombaient sous le hero et la
     section montait a 4 780 px de haut : le champ de recherche se retrouvait
     a deux mille pixels du titre. */
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(430px, .78fr);
  grid-template-rows: auto auto;
  gap: 26px 52px;
  align-items: start;
  margin: 44px auto 0;
  padding: 52px 60px;
  border: 1px solid var(--mq-trait-doux);
  border-radius: 28px;
  /* FOND PHOTOGRAPHIQUE.
     `exkave-analog80-hero.png` est deja dans le depot et deja servie ailleurs
     sur le site : aucune image nouvelle, aucun artwork invente. Elle passe
     SOUS le texte et sous les pochettes, assombrie et desaturee pour que le
     titre et le champ de recherche gardent leur contraste. Le degrade est
     pose par-dessus, pas a la place. */
  background:
    linear-gradient(100deg, rgba(9, 9, 8, .94) 0 26%, rgba(9, 9, 8, .62) 48%, rgba(9, 9, 8, .28) 100%),
    linear-gradient(135deg, rgba(28, 27, 23, .18), rgba(10, 10, 9, .34)),
    url("/blueprints/assets/exkave-analog80-hero-1600.webp") center 42% / cover no-repeat,
    #0b0b09;
  box-shadow: var(--mq-ombre);
}
/* L'anneau au crayon de la maquette. Purement decoratif. */
body.library-page[data-ex-biblio] .exb-entree::after {
  content: "";
  position: absolute; right: -160px; top: -280px;
  width: 720px; height: 720px; border-radius: 50%;
  border: 1px solid rgba(212, 180, 94, .13);
  box-shadow: 0 0 0 58px rgba(212, 180, 94, .025), 0 0 0 120px rgba(212, 180, 94, .018);
  pointer-events: none;
}
body.library-page[data-ex-biblio] .hero {
  grid-column: 1; grid-row: 1;
  display: block !important;
  padding: 0 !important;
  border: 0 !important;
  background: none !important;
}
body.library-page[data-ex-biblio] .base-lockup::before {
  content: "Mémoire collective du vinyle";
  display: block;
  margin-bottom: 14px;
  font-size: 11px; letter-spacing: .18em; text-transform: uppercase;
  color: var(--mq-or); font-weight: 400;
}
body.library-page[data-ex-biblio] .base-title {
  font-size: clamp(38px, 4vw, 58px) !important;
  line-height: 1.02;
  letter-spacing: -.045em;
  margin: 0 0 18px;
}
body.library-page[data-ex-biblio] .exb-lead {
  max-width: 620px;
  margin: 0 0 30px;
  color: #c6c0b5;
  font-size: 17px;
  line-height: 1.62;
}
body.library-page[data-ex-biblio] .exb-lead:empty { display: none; }

/* Le compteur global, integre a la composition. */
body.library-page[data-ex-biblio] .exb-stats,
body.library-page[data-ex-biblio] .exb-contexte {
  display: flex;
  gap: 38px;
  margin-top: 30px;
  color: var(--mq-muted);
  font-size: 13px;
}
body.library-page[data-ex-biblio] .exb-stats[hidden] { display: none !important; }
body.library-page[data-ex-biblio] .exb-stat { display: block; }
body.library-page[data-ex-biblio] .exb-stat strong,
body.library-page[data-ex-biblio] .exb-contexte strong {
  display: block;
  color: var(--mq-text);
  font-size: 23px;
  letter-spacing: -.02em;
  margin-bottom: 2px;
}
/* Le contexte artiste : le nom, puis les DEUX compteurs, chacun nomme. */
body.library-page[data-ex-biblio] .exb-contexte { flex-direction: column; gap: 4px; }
body.library-page[data-ex-biblio] .exb-contexte strong { font-size: 30px; }

/* --- 3 · la scene du hero ------------------------------------------------- */
body.library-page[data-ex-biblio] .exb-scene {
  grid-column: 2; grid-row: 1 / span 2;
  position: relative;
  align-self: stretch;
  min-height: 0;
}
/* Sans album parent choisi, la colonne est vide : le hero repasse sur une
   seule colonne au lieu de reserver la moitie de sa largeur a du noir. */
body.library-page[data-ex-biblio] .exb-entree:has(> .exb-scene[data-etat="vide"]),
body.library-page[data-ex-biblio] .exb-entree:has(> .exb-scene[data-etat="artiste"]) {
  grid-template-columns: minmax(0, 1fr);
}
body.library-page[data-ex-biblio] .exb-scene[data-etat="vide"],
body.library-page[data-ex-biblio] .exb-scene[data-etat="artiste"] { display: none; }
body.library-page[data-ex-biblio] .exb-entree > .search-panel { grid-column: 1; grid-row: 2; }
/* Le rail public faisait doublon avec l'eventail du hero, qui montre deja de
   vraies pochettes au meme endroit. Une seule vitrine. */
body.library-page[data-ex-biblio] .exb-entree > .exl-rail { display: none !important; }
body.library-page[data-ex-biblio] .exb-scene-carte {
  /* Plus de pochette a cote de laquelle se caler : la carte se pose dans sa
     colonne, en bas, comme une legende de la section. */
  position: absolute; right: 0; bottom: 0; z-index: 4;
  width: min(300px, 100%); padding: 18px 20px;
  background: rgba(17, 17, 14, .93);
  border: 1px solid var(--mq-trait); border-radius: 14px;
  box-shadow: 0 15px 45px rgba(0, 0, 0, .35);
}
body.library-page[data-ex-biblio] .exb-scene-carte[hidden] { display: none; }
body.library-page[data-ex-biblio] .exb-scene-kicker,
body.library-page[data-ex-biblio] .exb-scene-carte > span {
  display: block; color: var(--mq-muted); font-size: 11px;
  letter-spacing: .1em; text-transform: uppercase;
}
body.library-page[data-ex-biblio] .exb-scene-carte b {
  display: block; font-size: 20px; margin: 4px 0; letter-spacing: -.02em;
  text-transform: none;
}
body.library-page[data-ex-biblio] .exb-scene-carte #exb-scene-detail { text-transform: none; letter-spacing: .01em; }

/* --- 4 · le rail des ALBUMS PARENTS --------------------------------------- */
/* La breadcrumb au monogramme n'a pas d'equivalent dans la maquette : elle
   disparait des qu'un artiste est choisi, l'en-tete du panneau la remplace. */
body.library-page[data-ex-biblio] #artist-stage[data-has-artist] { display: none !important; }
body.library-page[data-ex-biblio] #artist-stage .artist-stage-route { display: none !important; }

body.library-page[data-ex-biblio] .album-panel {
  padding: 30px 32px 34px !important;
  border: 1px solid var(--mq-trait-doux) !important;
  border-radius: 22px !important;
  background: linear-gradient(180deg, #171714, #11110f) !important;
  box-shadow: none !important;
}
body.library-page[data-ex-biblio] .album-panel .panel-head {
  display: flex; justify-content: space-between; align-items: flex-end;
  gap: 28px; flex-wrap: wrap; margin-bottom: 22px;
}
body.library-page[data-ex-biblio] .album-panel .panel-head::before {
  content: "Artiste";
  position: absolute; margin-top: -22px;
  font-size: 11px; letter-spacing: .18em; text-transform: uppercase;
  color: var(--mq-or); font-weight: 400;
}
body.library-page[data-ex-biblio] .album-panel .panel-title {
  font-size: clamp(26px, 2.4vw, 34px) !important;
  letter-spacing: -.035em; margin-top: 8px;
}
/* Le compteur du niveau ALBUM : « 31 affiches / 505 albums · 337 pressages
   documentes ». Chaque nombre nomme son entite. */
body.library-page[data-ex-biblio] .album-panel .panel-meta {
  font-size: 13px !important; color: var(--mq-or) !important;
  letter-spacing: .06em; text-align: right;
}
body.library-page[data-ex-biblio] .album-rail {
  gap: 18px !important;
  padding: 4px 2px 10px !important;
}
body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail .result {
  border: 0 !important; background: none !important; padding: 0 !important;
}
body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail .result.active .cover-placeholder,
body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail .result .cover-placeholder {
  border-radius: 10px !important;
  border: 1px solid var(--mq-trait-doux) !important;
}
/* Le parent selectionne se voit : liseré or, comme dans la maquette. */
body.library-page[data-ex-biblio] .album-rail .result.active .cover-placeholder,
body.library-page[data-ex-biblio] .album-rail .result.active img {
  outline: 2px solid var(--mq-or);
  outline-offset: 3px;
}

/* ===========================================================================
   ALBUM CARD LAYOUT LOCK — 2026-08-18
     - meme hauteur de pochette
     - meme hauteur de zone titre
     - annee toujours alignee
     - pas d'expansion verticale selon la longueur du titre
     - rail aligne sur une gouttiere fixe
   Mesure avant correction : une carte a titre court faisait 161 px, une carte
   a titre long 179 — et « The U2 Talkie - A Conversation With Larry, Bono,
   Adam & The Edge » en poussait cinq lignes. L'annee montait et descendait
   d'une vignette a l'autre. La zone titre est desormais une boite FIXE de
   44 px (deux lignes a 1.15), et l'annee occupe sa propre rangee.
   =========================================================================== */
body.library-page[data-ex-biblio] #results .result > div:not(.result-side) {
  display: grid;
  grid-template-rows: 44px 18px;
  row-gap: 4px;
  margin-top: 9px;
  min-width: 0;
}
body.library-page[data-ex-biblio] #results .result h3 {
  margin: 0 !important;
  line-height: 1.15;
  max-height: 44px;
  overflow: hidden;
  overflow-wrap: anywhere;
  /* PAS de `-webkit-line-clamp` ici, et c'est deliberе.
     Le clamp exige `display: -webkit-box`. Or le parent est desormais une
     grille, et un enfant de grille est BLOCKIFIE : Chrome transforme
     `-webkit-box` en `flow-root`, le clamp ne s'applique plus, et le titre se
     faisait couper au milieu de sa troisieme ligne — sans points de
     suspension, en mordant sur l'annee. Mesure faite, `!important` inclus.
     Un fondu en degrade fait le meme travail, sans dependre d'un mode
     d'affichage que la grille m'enleve : la boite reste haute de 44 px, et la
     ligne de trop s'efface au lieu d'etre tranchee. */
  -webkit-mask-image: linear-gradient(180deg, #000 0 28px, transparent 43px);
  mask-image: linear-gradient(180deg, #000 0 28px, transparent 43px);
}
/* L'annee, en dore discret : un rappel Exkave, pas une guirlande. */
body.library-page[data-ex-biblio] #results .result .album-range {
  margin: 0 !important;
  align-self: center;
  color: var(--mq-or) !important;
  font-weight: 400;
  font-size: 12px !important;
  letter-spacing: .03em;
  line-height: 1;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* --- gouttiere fixe au-dessus du rail --------------------------------------
   L'ecart dependait de la hauteur du bloc de tete : 49 px sous le nom de
   l'artiste, 26 px sous le compteur, selon lequel des deux descendait le plus
   bas. Une seule marge, fixe, sous l'en-tete entier. */
body.library-page[data-ex-biblio] .album-panel .panel-head {
  margin-bottom: 30px !important;
}
body.library-page[data-ex-biblio] .album-rail-shell {
  margin-top: 0 !important;
  align-items: start !important;
}
/* Les fleches encadrent maintenant tout le rail : leur zone d'action garde la
   meme hauteur que les cartes, titres compris, sans marge morte en haut ou en
   bas. */
body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail-shell > .rail-nav {
  align-self: stretch !important;
  height: auto !important;
  min-height: 0 !important;
  max-height: none !important;
  margin-top: 0 !important;
}

/* L'état d'entrée est une invitation, pas une fiche d'artiste : son titre et
   sa consigne se centrent dans toute la largeur avant le choix d'un artiste. */
body.library-page[data-ex-biblio] #artist-stage:not([data-has-artist]) {
  grid-template-columns: minmax(0, 1fr) !important;
}
body.library-page[data-ex-biblio] #artist-stage:not([data-has-artist]) .artist-stage-copy {
  width: 100%;
  max-width: none !important;
  justify-self: center;
  text-align: center;
  padding-inline: 0 !important;
}
body.library-page[data-ex-biblio] #artist-stage:not([data-has-artist]) .artist-stage-meta {
  margin-inline: auto;
}

@media (max-width: 720px) {
  /* Meme principe au doigt : trois lignes maximum, hauteur toujours fixe. */
  body.library-page[data-ex-biblio] #results .result > div:not(.result-side) {
    grid-template-rows: 50px 18px;
  }
  body.library-page[data-ex-biblio] #results .result h3 {
    max-height: 50px;
    -webkit-mask-image: linear-gradient(180deg, #000 0 34px, transparent 49px);
    mask-image: linear-gradient(180deg, #000 0 34px, transparent 49px);
  }
  body.library-page[data-ex-biblio] .album-panel .panel-head { margin-bottom: 22px !important; }
}

/* --- 5 · la banniere ALBUM PARENT ----------------------------------------- */
body.library-page[data-ex-biblio] .master-top {
  display: flex !important;
  align-items: center; gap: 26px; flex-wrap: wrap;
  min-height: 0 !important;
  padding: 24px 30px 30px !important;
  border: 1px solid var(--mq-trait) !important;
  border-radius: 22px !important;
  background: linear-gradient(90deg, rgba(212, 180, 94, .10), rgba(255, 255, 255, .018) 38%, rgba(255, 255, 255, .01)) !important;
  box-shadow: none !important;
}
/* LE FOND DE BANNIERE — la pochette du parent, recadree pleine largeur.
   La moitie droite de la banniere etait vide. On y glisse le disque qu'on est
   en train d'ouvrir : sa vraie pochette, recadree, desaturee et transparente.
   Aucune image nouvelle — c'est exactement celle de la vignette a gauche.
   Sans pochette, pas de fond.

   DEUX couches, dans cet ordre : `::before` porte l'image, `::after` porte le
   voile. Un pseudo-element ne peut pas etre a la fois filtre en noir et blanc
   ET servir de voile : `opacity` s'applique a tout ce qu'il contient, voile
   compris. Il en faut donc deux, et `::after` peint au-dessus de `::before`.
   Le voile est plus dense a gauche (le texte) et a droite (le nombre), plus
   leger au milieu, ou l'image peut respirer. */
body.library-page[data-ex-biblio] .master-top { position: relative; overflow: hidden; }
body.library-page[data-ex-biblio] .master-top::before {
  content: "" !important;
  display: block !important;
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background-image: var(--exb-fond-parent, none);
  background-size: cover;
  background-position: center 32%;
  filter: grayscale(1) contrast(1.02) brightness(.86);
  opacity: .34;
  -webkit-mask-image: linear-gradient(90deg, transparent 0 16%, rgba(0,0,0,.5) 42%, rgba(0,0,0,1) 72%);
  mask-image: linear-gradient(90deg, transparent 0 16%, rgba(0,0,0,.5) 42%, rgba(0,0,0,1) 72%);
}
body.library-page[data-ex-biblio] .master-top::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background: linear-gradient(90deg,
    rgba(18, 17, 14, .82) 0 24%,
    rgba(18, 17, 14, .30) 56%,
    rgba(18, 17, 14, .58) 82%,
    rgba(18, 17, 14, .74) 100%);
}
/* Le contenu passe devant le fond. */
body.library-page[data-ex-biblio] .master-top > * { position: relative; z-index: 1; }
/* La vignette peut deborder du cadre pour porter son credit : `overflow:
   hidden` sur la banniere la couperait, on lui rend sa place. */
body.library-page[data-ex-biblio] .master-top { padding-bottom: 34px !important; }
/* LA POCHETTE DU PARENT REVIENT ICI.
   Je l'avais masquee au motif qu'elle etait deja dans la scene du hero — puis
   les pochettes ont quitte le hero. Elle n'existait donc plus nulle part, et
   la banniere se reduisait a du texte perdu dans 1 046 px de vide. C'est le
   seul endroit ou l'on voit l'album qu'on est en train d'ouvrir. */
body.library-page[data-ex-biblio] .master-top .master-cover {
  display: block !important;
  flex: 0 0 auto;
  /* `!important` sur les deux dimensions : `library-v21` impose sa propre
     largeur a `.master-cover` et la vignette sortait a 188x132, deformee. */
  width: 132px !important; height: 132px !important;
  aspect-ratio: 1 !important;
  min-width: 0 !important; max-width: 132px !important;
  margin: 0 !important; padding: 0 !important;
  overflow: hidden;
  border-radius: 10px;
  border: 1px solid var(--mq-trait-doux) !important;
  /* Jamais un trou : sans image, un carton graphite. */
  background: #24221d !important;
  box-shadow: 0 14px 30px rgba(0, 0, 0, .42) !important;
}
body.library-page[data-ex-biblio] .master-top .master-cover img {
  width: 100%; height: 100%; object-fit: cover; display: block;
}
/* La medaille « ALBUM / fiche racine » posee sur la pochette redit ce que le
   libelle de la banniere dit deja, en plus petit et par-dessus l'image. */
body.library-page[data-ex-biblio] .master-top .master-badge { display: none !important; }
/* L'ATTRIBUTION RESTE, MAIS SORT DE L'IMAGE.
   « MusicBrainz · Cover Art Archive » etait posee EN INCRUSTATION sur une
   vignette de 132 px : elle s'y repliait sur deux lignes et mangeait le tiers
   de la pochette. On ne la supprime pas — c'est un credit de source, il est
   du — on la descend sous la vignette, en tout petit, ou elle reste lisible
   et cliquable sans abimer l'image. */
body.library-page[data-ex-biblio] .master-top .master-cover { overflow: visible !important; }
body.library-page[data-ex-biblio] .master-top .master-cover img { border-radius: 10px; }
body.library-page[data-ex-biblio] .master-top .master-cover-source {
  position: absolute !important;
  /* Deux lignes possibles : on descend assez pour qu'elles ne remontent pas
     sur le bas de la pochette. */
  right: auto !important; left: 0 !important; top: 100% !important; bottom: auto !important;
  margin-top: 6px;
  max-width: 132px !important;
  padding: 0 !important;
  background: none !important; backdrop-filter: none !important;
  border-radius: 0 !important;
  color: rgba(255, 253, 247, .34) !important;
  font-size: 8px !important; letter-spacing: .06em; line-height: 1.3 !important;
  /* Une attribution tronquee n'attribue rien : elle passe sur deux lignes
     plutot que de finir en « Cover Art Arc… ». */
  white-space: normal; overflow: visible;
}
/* Le liseré doré heritee de `.has-image` faisait lire la vignette comme un
   element selectionne. Un trait fin, comme les autres pochettes de la page. */
body.library-page[data-ex-biblio] .master-top .master-cover.has-image {
  border: 1px solid var(--mq-trait-doux) !important;
  outline: 0 !important;
}
body.library-page[data-ex-biblio] .master-top .parent-label {
  font-size: 11px; letter-spacing: .18em; text-transform: uppercase;
  color: var(--mq-or); font-weight: 400;
}
body.library-page[data-ex-biblio] .master-top h2 {
  font-size: clamp(28px, 2.8vw, 38px) !important;
  margin: 4px 0 6px !important; letter-spacing: -.035em;
}
body.library-page[data-ex-biblio] .master-top .master-artist { color: var(--mq-muted); }
body.library-page[data-ex-biblio] .master-top .master-meta {
  display: flex; align-items: baseline; gap: 24px; flex-wrap: wrap; margin-top: 10px;
}
body.library-page[data-ex-biblio] .exb-total-enfants .mmy-v { font-size: 14px; color: #d8d2c6; }
body.library-page[data-ex-biblio] .exb-total-enfants strong {
  font-size: 28px; color: white; margin-right: 7px; letter-spacing: -.03em;
}
/* La banniere de la maquette est PLATE : un libelle, un titre, une ligne, et
   le total a droite. Les pastilles et caissons herites la transformaient en
   tableau de bord. Les genres n'y figurent pas — ils appartiennent a la fiche
   de l'album, pas a l'etiquette du niveau. */
body.library-page[data-ex-biblio] .master-top .master-meta-stat {
  padding: 0 !important; border: 0 !important; background: none !important;
  box-shadow: none !important; border-radius: 0 !important;
}
body.library-page[data-ex-biblio] .master-top .master-meta-genres { display: none !important; }
/* L'ANNEE EN ENORME, AU CENTRE, EN DESSOUS.
   Elle quitte le flux et devient un chiffre monumental, dore et transparent,
   qui deborde de sa boite et se fait rogner par le cadre de la banniere. Le
   mot « ANNEE » disparait : a cette taille le chiffre se nomme tout seul.
   Elle passe SOUS les autres textes — titre, artiste, total — qui restent
   parfaitement lisibles par-dessus. `pointer-events: none` pour qu'elle
   n'attrape jamais un clic destine a la banniere. */
body.library-page[data-ex-biblio] .master-top .master-meta-stat:not(.exb-total-enfants) {
  position: absolute;
  left: 50%; top: 50%;
  transform: translate(-50%, -50%);
  z-index: 0;
  margin: 0; padding: 0;
  pointer-events: none;
}
body.library-page[data-ex-biblio] .master-top .master-meta-stat:not(.exb-total-enfants) .mmy-k {
  display: none !important;
}
body.library-page[data-ex-biblio] .master-top .master-meta-stat:not(.exb-total-enfants) .mmy-v {
  /* Assez grand pour que le cadre le rogne en haut et en bas : c'est le
     debordement qui fait l'effet, pas la taille seule. */
  font-size: clamp(150px, 21vw, 330px) !important;
  font-weight: var(--font-weight-emphasis);
  letter-spacing: -.055em;
  line-height: .78;
  white-space: nowrap;
  color: var(--mq-or-clair) !important;
  opacity: .17;
}
/* Les textes qui doivent rester devant. */
body.library-page[data-ex-biblio] .master-top .parent-label,
body.library-page[data-ex-biblio] .master-top h2,
body.library-page[data-ex-biblio] .master-top .master-artist,
body.library-page[data-ex-biblio] .master-top .exb-total-enfants {
  position: relative; z-index: 1;
}
body.library-page[data-ex-biblio] .master-top .mmy-k {
  font-size: 10px; letter-spacing: .14em; text-transform: uppercase; color: var(--mq-muted-2);
  margin-right: 7px;
}
body.library-page[data-ex-biblio] .master-top .mmy-v { color: #d8d2c6; font-size: 14px; }
/* La pochette du parent est masquee ici (elle est deja dans la scene du hero) :
   le bloc de texte devenait donc `:last-child` et `margin-left:auto` le
   poussait tout a droite, laissant la moitie gauche vide. Il reprend sa place
   a gauche, et seul le total va a droite, comme dans la maquette. */
/* Le bloc de texte OCCUPE la place restante : sans `flex: 1` il restait a
   262 px de large et laissait 1 046 px de vide a sa droite. Le total est
   pousse au bord droit par `margin-left: auto`, dans le flux — jamais en
   absolu, ou il s'ecrivait par-dessus « War ». */
body.library-page[data-ex-biblio] .master-top > div:last-child {
  flex: 1 1 auto; min-width: 0; margin-left: 0;
}
body.library-page[data-ex-biblio] .master-top .master-meta {
  display: flex; align-items: baseline; gap: 28px; margin-top: 6px;
}
body.library-page[data-ex-biblio] .master-top .master-artist { margin-top: 2px; }
body.library-page[data-ex-biblio] .exb-total-enfants { margin-left: auto; text-align: right; }
@media (max-width: 720px) {
  /* `!important` obligatoire : la regle de bureau en porte deja un, sans quoi
     la vignette restait a 132 px au doigt. */
  body.library-page[data-ex-biblio] .master-top .master-cover {
    width: 96px !important; height: 96px !important; max-width: 96px !important;
    /* Le credit est pose en absolu SOUS la vignette : sans cette reserve il
       s'ecrivait par-dessus « ALBUM PARENT ». */
    margin-bottom: 26px !important;
  }
  /* Empile a GAUCHE, pas centre : le reste de la page est aligne a gauche. */
  body.library-page[data-ex-biblio] .master-top { align-items: flex-start !important; }
  body.library-page[data-ex-biblio] .exb-total-enfants { margin-left: 0; text-align: left; }
}

/* --- 6 · le plan filtres + enfants ---------------------------------------- */
body.library-page[data-ex-biblio] .master {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 20px;
  align-items: start;
}
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] #detail > .master {
  grid-template-columns: minmax(0, 1fr);
  gap: 20px;
}
body.library-page[data-ex-biblio] .master > .master-top { grid-column: 1; }
body.library-page[data-ex-biblio] .master > .pressing-filter-shell {
  grid-column: 1;
  position: static;
  top: auto;
  z-index: auto;
  width: 100%;
  min-width: 0;
  margin: 0;
  padding: 0;
  background: transparent;
}
body.library-page[data-ex-biblio] .master > .lineage-branch { grid-column: 1; min-width: 0; }

body.library-page[data-ex-biblio] .pressing-filter-bar {
  display: grid !important;
  grid-template-columns: minmax(0, 1fr) !important;
  gap: 0 !important;
  padding: 22px !important;
  border: 1px solid var(--mq-trait-doux) !important;
  border-radius: 18px !important;
  background: #131310 !important;
  box-shadow: none !important;
  backdrop-filter: none !important;
}
body.library-page[data-ex-biblio] .pressing-filter-toggle { display: none !important; }
/* La croix de fermeture du tiroir de filtres n'a de sens que quand le tiroir
   est ouvert. En permanence a l'ecran, elle atterrissait dans le coin haut
   droit de la banniere album — une croix doree sur la pochette du parent, sans
   rien a fermer. */
body.library-page[data-ex-biblio] .pressing-filter-sheet-close { display: none !important; }
body.library-page[data-ex-biblio] .pressing-filter-shell.is-open .pressing-filter-sheet-close {
  display: block !important;
}
/* Le placage mobile abrege le credit en « MB · CAA » via un `::after`, en
   mettant le texte reel a `font-size: 0`. On reaffiche le texte reel : sans
   neutraliser le pseudo, les deux se cumulaient
   (« MusicBrainz · Cover Art ArchiveMB · CAA »). */
body.library-page[data-ex-biblio] .master-cover-source::after { content: none !important; }
body.library-page[data-ex-biblio] .pressing-filter-bar::before {
  content: "Filtrer & trier";
  grid-column: 1 / -1;
  font-size: 19px; letter-spacing: -.02em; margin-bottom: 2px;
}
body.library-page[data-ex-biblio] .pressing-filter-field {
  padding: 14px 0; border-top: 1px solid var(--mq-trait-doux);
  min-width: 0;
}
body.library-page[data-ex-biblio] .pressing-filter-field:first-of-type { border-top: 0; padding-top: 0; }
body.library-page[data-ex-biblio] .pressing-filter-field > span {
  display: block; margin-bottom: 8px;
  color: #8f8a7e; font-size: 10px; letter-spacing: .14em; text-transform: uppercase;
}
body.library-page[data-ex-biblio] .pressing-filter-field input,
body.library-page[data-ex-biblio] .pressing-filter-field select {
  width: 100%; height: 42px; min-width: 0;
  padding: 0 11px;
  background: #0b0b09 !important;
  border: 1px solid var(--mq-trait-doux) !important;
  border-radius: 8px !important;
  color: white !important;
}
body.library-page[data-ex-biblio] .pressing-filter-field input:focus,
body.library-page[data-ex-biblio] .pressing-filter-field select:focus {
  border-color: rgba(212, 180, 94, .62) !important;
}
body.library-page[data-ex-biblio] .pressing-filter-submit {
  width: 100%; height: 44px; margin-top: 18px;
  border-radius: 9px !important; border: 0 !important;
  background: linear-gradient(135deg, #f0d680, #bf9b3e) !important;
  color: #16130a !important; font-weight: 400 !important;
  box-shadow: none !important;
}
body.library-page[data-ex-biblio] .pressing-filter-bar .field-clear {
  width: 100% !important; height: 44px !important; margin-top: 8px;
  border-radius: 9px !important;
  border: 1px solid var(--mq-trait) !important;
  background: #0c0c0a !important; color: white !important;
  font-size: 15px !important; font-weight: 400 !important;
  box-shadow: none !important;
}

/* Le filtre appartient au parcours vertical : album parent, filtres, puis
   pressages. Sur grand ecran, ses champs forment un bandeau horizontal au
   lieu d'une colonne laterale qui comprimait inutilement les resultats. */
@media (min-width: 1081px) {
  body.library-page[data-ex-biblio] .pressing-filter-bar {
    grid-template-columns:
      minmax(82px, .62fr)
      minmax(72px, .5fr)
      minmax(124px, 1fr)
      minmax(124px, 1fr)
      minmax(132px, .9fr)
      minmax(138px, .95fr)
      minmax(138px, auto)
      minmax(78px, auto) !important;
    gap: 12px !important;
    align-items: end;
    padding: 18px 20px !important;
  }
  body.library-page[data-ex-biblio] .pressing-filter-field {
    padding: 0;
    border-top: 0;
  }
  body.library-page[data-ex-biblio] .pressing-filter-field:first-of-type { padding-top: 0; }
  body.library-page[data-ex-biblio] .pressing-filter-submit,
  body.library-page[data-ex-biblio] .pressing-filter-reset,
  body.library-page[data-ex-biblio] .pressing-filter-bar .field-clear {
    width: 100% !important;
    min-width: 0;
    margin-top: 0;
  }
  body.library-page[data-ex-biblio] .price-code-keyboard { grid-column: 1 / -1; }
}

/* Entre tablette et petit desktop, le meme bandeau respire sur trois
   colonnes plutot que de redevenir une barre laterale. */
@media (min-width: 721px) and (max-width: 1080px) {
  body.library-page[data-ex-biblio] .pressing-filter-bar {
    grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
    gap: 12px 16px !important;
  }
  body.library-page[data-ex-biblio] .pressing-filter-bar::before,
  body.library-page[data-ex-biblio] .price-code-keyboard { grid-column: 1 / -1; }
  body.library-page[data-ex-biblio] .pressing-filter-submit,
  body.library-page[data-ex-biblio] .pressing-filter-reset,
  body.library-page[data-ex-biblio] .pressing-filter-bar .field-clear {
    width: 100% !important;
    margin-top: 0;
  }
}

/* --- 7 · l'en-tete des enfants -------------------------------------------- */
body.library-page[data-ex-biblio] .pressings-head {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: 20px; flex-wrap: wrap;   /* <- le debordement de 51 px de la maquette */
  margin-bottom: 18px;
}
body.library-page[data-ex-biblio] .pressings-head .lineage-label {
  font-size: 11px; letter-spacing: .18em; text-transform: uppercase;
  color: var(--mq-or); font-weight: 400;
}
body.library-page[data-ex-biblio] .pressings-head h3 {
  font-size: clamp(22px, 2vw, 28px) !important; margin: 4px 0 0 !important;
  letter-spacing: -.03em;
}
body.library-page[data-ex-biblio] .pressings-tools { color: var(--mq-muted); font-size: 12px; min-width: 0; }
body.library-page[data-ex-biblio] .child-pagination { margin-top: 9px; justify-content: flex-end; flex-wrap: wrap; }
body.library-page[data-ex-biblio] .child-pagination button,
body.library-page[data-ex-biblio] .child-pagination span {
  width: 32px; height: 32px; border-radius: 50%;
  display: grid; place-items: center;
  border: 1px solid var(--mq-trait-doux); font-size: 11px;
  background: none; color: var(--mq-text);
}
body.library-page[data-ex-biblio] .child-pagination button.is-current {
  background: var(--mq-or); color: #17130a; font-weight: 400; border-color: transparent;
}
body.library-page[data-ex-biblio] .review-note,
body.library-page[data-ex-biblio] .pressings-signup-banner {
  padding: 14px 16px !important;
  border: 1px solid var(--mq-trait) !important;
  border-radius: 12px !important;
  background: rgba(212, 180, 94, .055) !important;
  color: #c9c0a9 !important; font-size: 12px !important;
  margin-bottom: 18px !important;
}

/* --- 8 · les cartes ENFANTS ----------------------------------------------- */
body.library-page[data-ex-biblio] .pressing-grid {
  display: grid !important;
  grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
  gap: 18px !important;
}
body.library-page[data-ex-biblio] .pressing-grid > .pressing {
  position: relative;
  padding: 0 !important;
  overflow: hidden;
  border: 1px solid var(--mq-trait-doux) !important;
  border-radius: 15px !important;
  background: #171714 !important;
  box-shadow: none !important;
  transition: transform .22s ease, border-color .22s ease, box-shadow .22s ease;
}
body.library-page[data-ex-biblio] .pressing-grid > .pressing:hover {
  transform: translateY(-5px);
  border-color: rgba(212, 180, 94, .38) !important;
  box-shadow: 0 20px 44px rgba(0, 0, 0, .34) !important;
}
@media (prefers-reduced-motion: reduce) {
  body.library-page[data-ex-biblio] .pressing-grid > .pressing { transition: none; }
  body.library-page[data-ex-biblio] .pressing-grid > .pressing:hover { transform: none; }
}
/* Le numero d'ordre de la maquette : il numerote la PAGE, pas la base. */
body.library-page[data-ex-biblio] .pressing-grid { counter-reset: exb-pressage; }
/* `counter-increment` sur l'ELEMENT, pas sur son pseudo : porte par le
   `::before`, les trois cartes affichaient toutes « 01 ». */
body.library-page[data-ex-biblio] .pressing-grid > .pressing { counter-increment: exb-pressage; }
body.library-page[data-ex-biblio] .pressing-grid > .pressing::before {
  content: counter(exb-pressage, decimal-leading-zero);
  position: absolute; z-index: 4; top: 13px; left: 13px;
  width: 34px; height: 34px; border-radius: 50%;
  display: grid; place-items: center;
  background: var(--mq-or); color: #17130a;
  font-size: 11px; font-weight: 400;
}
body.library-page[data-ex-biblio] .pressing-grid > .pressing .pressing-cover {
  aspect-ratio: 1.22 !important;
  border-radius: 0 !important;
  margin: 0 !important;
  width: 100% !important;
}
body.library-page[data-ex-biblio] .pressing-grid > .pressing .pressing-cover img {
  width: 100%; height: 100%; object-fit: cover;
  filter: saturate(.94) brightness(.91);
}
body.library-page[data-ex-biblio] .pressing-card-data { padding: 19px 18px 46px; }
body.library-page[data-ex-biblio] .pressing-card-heading span {
  font-size: 11px; color: var(--mq-or); text-transform: uppercase;
  letter-spacing: .12em; font-weight: 400;
}
body.library-page[data-ex-biblio] .pressing-card-heading h4 {
  font-size: 25px !important; line-height: 1 !important; margin: 6px 0 19px !important;
  letter-spacing: -.03em;
}
body.library-page[data-ex-biblio] .pressing-facts-grid,
body.library-page[data-ex-biblio] .pressing-runout-grid {
  display: grid !important;
  grid-template-columns: 1fr 1fr !important;
  gap: 14px 18px !important;
}
body.library-page[data-ex-biblio] .pressing-runout-grid { margin-top: 14px !important; }
body.library-page[data-ex-biblio] .pressing-facts-grid small,
body.library-page[data-ex-biblio] .pressing-runout-grid small {
  display: block; margin-bottom: 4px;
  color: var(--mq-muted-2); font-size: 9px; letter-spacing: .12em; text-transform: uppercase;
}
body.library-page[data-ex-biblio] .pressing-facts-grid strong,
body.library-page[data-ex-biblio] .pressing-runout-grid strong {
  font-size: 14px !important; line-height: 1.35 !important; font-weight: 400;
  overflow-wrap: anywhere;
}

/* --- 9 · le rappel editorial ---------------------------------------------- */
body.library-page[data-ex-biblio] .exb-rappel {
  grid-column: 1 / -1;
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  min-height: 210px;
  overflow: hidden; border-radius: 16px;
  border: 1px solid var(--mq-trait-doux);
  background: linear-gradient(110deg, #1d1c18, #0e0e0c);
}
body.library-page[data-ex-biblio] .exb-rappel--texte { grid-template-columns: minmax(0, 1fr); min-height: 0; }
body.library-page[data-ex-biblio] .exb-rappel-vue { position: relative; overflow: hidden; background: #111; }
body.library-page[data-ex-biblio] .exb-rappel-vue img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  filter: saturate(.72) brightness(.65);
}
/* Une pochette de parent qui illustre un guide reste une illustration du
   PARENT : elle ne prouve rien sur un enfant, et on l'ecrit. */
body.library-page[data-ex-biblio] .exb-rappel-source {
  position: absolute; left: 0; right: 0; bottom: 0;
  padding: 7px 12px;
  background: rgba(9, 9, 8, .84);
  font-size: 9px; letter-spacing: .1em; text-transform: uppercase; color: #d3cbb7;
}
body.library-page[data-ex-biblio] .exb-rappel-mot {
  padding: 30px 32px; display: flex; flex-direction: column; justify-content: center;
}
body.library-page[data-ex-biblio] .exb-rappel-mot small {
  color: var(--mq-or); letter-spacing: .16em; text-transform: uppercase; font-weight: 400; font-size: 10px;
}
body.library-page[data-ex-biblio] .exb-rappel-mot h4 { font-size: 25px; margin: 9px 0 10px; letter-spacing: -.03em; }
body.library-page[data-ex-biblio] .exb-rappel-mot p { color: var(--mq-muted); line-height: 1.55; margin: 0 0 15px; max-width: 520px; font-size: 14px; }
body.library-page[data-ex-biblio] .exb-album-tracks {
  margin-top: 4px; padding-top: 15px; border-top: 1px solid var(--mq-trait-doux);
}
body.library-page[data-ex-biblio] .exb-album-tracks h5 {
  margin: 6px 0 9px; font-size: 14px; font-weight: 400;
}
body.library-page[data-ex-biblio] .exb-album-track-list {
  display: grid; gap: 6px; margin: 0 0 10px; padding: 0; list-style: none;
}
body.library-page[data-ex-biblio] .exb-album-track {
  display: grid; grid-template-columns: 26px minmax(0, 1fr) auto auto;
  align-items: baseline; gap: 8px; color: #f5f2ea; font-size: 12px;
}
body.library-page[data-ex-biblio] .exb-album-track-side,
body.library-page[data-ex-biblio] .exb-album-track-duration { color: var(--mq-muted-2); }
body.library-page[data-ex-biblio] .exb-album-track-flag {
  color: var(--mq-or-clair); font-size: 9px; letter-spacing: .08em; text-transform: uppercase;
}
body.library-page[data-ex-biblio] .exb-album-track.is-low-confidence .exb-album-track-title { color: #d8cda9; }
body.library-page[data-ex-biblio] .exb-album-tracks > p {
  margin: 0; font-size: 11px; color: var(--mq-muted-2); line-height: 1.45;
}

/* --- 10 · le module verrouille -------------------------------------------- */
/* Un seul module, jamais quarante-huit fausses tuiles. Il dit le nombre reel
   et pourquoi trois seulement sont consultables. */
body.library-page[data-ex-biblio] .exb-verrou {
  display: block; margin-top: 18px;
  padding: 30px 34px;
  border: 1px solid var(--mq-trait); border-radius: 16px;
  background: linear-gradient(110deg, rgba(212, 180, 94, .10), rgba(255, 255, 255, .012) 62%);
}
body.library-page[data-ex-biblio] .exb-verrou-mot strong {
  display: block; font-size: 25px; letter-spacing: -.03em; margin-bottom: 8px;
}
body.library-page[data-ex-biblio] .exb-verrou-mot p {
  margin: 0 0 18px; max-width: 46ch; color: var(--mq-muted); line-height: 1.55; font-size: 14px;
}
body.library-page[data-ex-biblio] .exb-verrou-mot .exb-verrou-message {
  max-width: none;
  white-space: nowrap;
}
body.library-page[data-ex-biblio] .exb-verrou-actions { display: flex; gap: 10px; flex-wrap: wrap; }
body.library-page[data-ex-biblio] .exb-verrou-upgrade {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 18px;
  color: #f4efe3;
  font-size: 14px;
}
body.library-page[data-ex-biblio] .exb-btn {
  display: inline-flex; align-items: center; justify-content: center;
  height: 44px; padding: 0 22px; border-radius: 9px;
  border: 1px solid var(--mq-trait); background: #0c0c0a; color: white;
  font-weight: 400; font-size: 13px; text-decoration: none; cursor: pointer;
}
body.library-page[data-ex-biblio] .exb-btn--or {
  border: 0; background: linear-gradient(135deg, #f0d680, #bf9b3e); color: #16130a;
}

/* --- 11 · « ton pressage n'est pas dans la liste ? » ----------------------- */
body.library-page[data-ex-biblio] .pressing-add-cta {
  margin: 40px 0 0 !important;
  padding: 30px 34px !important;
  border: 1px solid var(--mq-trait) !important;
  border-radius: 18px !important;
  background: linear-gradient(90deg, #171612, #0d0d0b) !important;
  display: flex; align-items: center; justify-content: space-between; gap: 24px; flex-wrap: wrap;
}
body.library-page[data-ex-biblio] .pressing-add-cta strong { font-size: 24px; letter-spacing: -.03em; }
body.library-page[data-ex-biblio] .pressing-add-cta p { margin: 6px 0 0; color: var(--mq-muted); }

/* --- 11 bis · les fiches a verifier -----------------------------------------
   Elles partagent les cartes `.pressing` de la grille publique mais pas sa
   grille : laissees en colonne unique, elles etiraient la page sur vingt mille
   pixels (releve au 2026-08-18 sur War, cinq fiches). Meme grille, meme carte,
   mais PAS de numerotation : ce ne sont pas des pressages ordonnes, ce sont
   des dossiers a completer. */
body.library-page[data-ex-biblio] .review-pressing-grid {
  display: grid !important;
  grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
  gap: 18px !important;
}
body.library-page[data-ex-biblio] .review-pressing-grid > .pressing {
  padding: 0 !important;
  overflow: hidden;
  border: 1px solid var(--mq-trait-doux) !important;
  border-radius: 15px !important;
  background: #171714 !important;
  box-shadow: none !important;
}
body.library-page[data-ex-biblio] .review-pressing-grid > .pressing::before { content: none; }
body.library-page[data-ex-biblio] .review-pressing-grid > .pressing .pressing-cover {
  aspect-ratio: 1.22 !important;
  border-radius: 0 !important;
  margin: 0 !important;
  width: 100% !important;
}
body.library-page[data-ex-biblio] .review-pressing-grid > .pressing .pressing-cover img {
  width: 100%; height: 100%; object-fit: cover;
}
@media (max-width: 1050px) {
  body.library-page[data-ex-biblio] .review-pressing-grid { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; }
}
@media (max-width: 720px) {
  body.library-page[data-ex-biblio] .review-pressing-grid { grid-template-columns: minmax(0, 1fr) !important; }
}

/* --- 11 ter · le panneau de suggestions au doigt ----------------------------
   Releve par le smoke du 2026-08-18 a 390 px : `.suggestion-artist` debordait
   son parent de 29 px et `.suggestion-kind` de 17. La pile de repli pouvait
   elargir ces libelles, et `.suggestion-text` n'avait pas de
   plancher a zero — dans une boite flex, un enfant refuse de retrecir sous sa
   largeur de contenu tant qu'on ne le lui dit pas. On le lui dit, et on coupe
   proprement plutot que de deborder. */
body.library-page[data-ex-biblio] .suggestion-main,
body.library-page[data-ex-biblio] .suggestion-text { min-width: 0; }
/* `display: block` est la partie qui compte : `overflow` n'a AUCUN effet sur
   un element inline. Ma premiere version posait `overflow: hidden` sans lui,
   et le `nowrap` a simplement allonge la ligne — le debordement est passe de
   66 px a 169. On rend les enfants blocs avant de leur demander de couper. */
body.library-page[data-ex-biblio] .suggestion-text > * {
  display: block;
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* --- 12 · au doigt --------------------------------------------------------- */
@media (max-width: 1050px) {
  body.library-page[data-ex-biblio] .exb-verrou-mot .exb-verrou-message { white-space: normal; }
  body.library-page[data-ex-biblio] .exb-entree {
    grid-template-columns: minmax(0, 1fr);
    padding: 40px;
  }
  body.library-page[data-ex-biblio] .exb-scene { grid-column: 1; max-width: 620px; }
  body.library-page[data-ex-biblio] .master { grid-template-columns: minmax(0, 1fr); }
  body.library-page[data-ex-biblio] .master > .pressing-filter-shell,
  body.library-page[data-ex-biblio] .master > .lineage-branch { grid-column: 1; }
  body.library-page[data-ex-biblio] .master > .pressing-filter-shell { position: static; }
  body.library-page[data-ex-biblio] .pressing-grid { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; }
}
@media (max-width: 720px) {
  body.library-page[data-ex-biblio] .exb-verrou-upgrade { align-items: flex-start; flex-direction: column; }
  body.library-page[data-ex-biblio] .exb-entree {
    margin-top: 22px; padding: 28px 22px; border-radius: 20px;
    /* Variante mobile : 30 ko au lieu de 75. Le PNG source (2,2 Mo) reste
       dans le depot, il n'est simplement plus servi. */
    background:
      linear-gradient(100deg, rgba(9, 9, 8, .94) 0 26%, rgba(9, 9, 8, .62) 48%, rgba(9, 9, 8, .28) 100%),
      linear-gradient(135deg, rgba(28, 27, 23, .18), rgba(10, 10, 9, .34)),
      url("/blueprints/assets/exkave-analog80-hero-820.webp") center 42% / cover no-repeat,
      #0b0b09;
  }
  body.library-page[data-ex-biblio] .exb-scene-carte { position: static; width: 100%; padding: 14px; margin-top: 14px; }
  body.library-page[data-ex-biblio] .exb-stats,
  body.library-page[data-ex-biblio] .exb-contexte { gap: 18px; flex-wrap: wrap; }
  body.library-page[data-ex-biblio] .album-panel { padding: 22px 18px !important; }
  body.library-page[data-ex-biblio] .master-top { padding: 24px !important; flex-direction: column; align-items: flex-start; }
  body.library-page[data-ex-biblio] .pressing-grid { grid-template-columns: minmax(0, 1fr) !important; }
  body.library-page[data-ex-biblio] .exb-rappel { grid-template-columns: minmax(0, 1fr); }
  body.library-page[data-ex-biblio] .exb-rappel-vue { height: 170px; }
  /* Le defaut de la maquette a 390 : `.pressings-head` ne passait pas a la
     ligne et sa pagination poussait la page de 51 px. */
  body.library-page[data-ex-biblio] .pressings-tools { width: 100%; }
  body.library-page[data-ex-biblio] .child-pagination { justify-content: flex-start; }
  body.library-page[data-ex-biblio] .pressing-add-cta { padding: 24px !important; flex-direction: column; align-items: flex-start; }
}

/* --------------------------------------------------------------------------
   Cartes de pressage : l'image reste une illustration lisible, tandis que les
   preuves techniques vivent avec les metadonnees. Une reserve basse dediee a
   l'appel empêche celui-ci de recouvrir la derniere valeur de la grille.
   -------------------------------------------------------------------------- */
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing .pressing-cover.is-parent-cover::after {
  content: none !important;
  display: none !important;
}
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing .pressing-cover img {
  filter: none !important;
}
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing .pressing-card-data {
  padding: 19px 18px 18px !important;
}
/* Les longues gravures restent dans la fiche detaillee. Leur ancien panneau
   absolu au survol recouvrait les faits et devenait illisible sur une carte. */
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing .pressing-runout-grid,
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing:hover .pressing-runout-grid,
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing:focus-visible .pressing-runout-grid {
  display: none !important;
  opacity: 0 !important;
  transform: none !important;
}
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing:hover {
  transform: translateY(-2px);
}
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing::after {
  position: static !important;
  right: auto !important;
  bottom: auto !important;
  left: auto !important;
  align-self: flex-start !important;
  margin: auto 18px 18px !important;
  box-sizing: border-box;
  max-width: calc(100% - 36px);
}
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-barcode-value {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-barcode-fact {
  grid-column: 1 / -1;
}
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-barcode-value .barcode-presence {
  position: static !important;
  width: 30px !important;
  height: 24px !important;
  flex: 0 0 30px;
}
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-barcode-value .barcode-presence svg {
  width: 18px !important;
  height: 13px !important;
}

/* A largeur tablette, les trois pressages gratuits doivent former un rang
   complet. L'ancien palier a deux colonnes agrandissait chaque pochette et
   laissait la troisieme carte seule sur la ligne suivante. Trois colonnes
   ramenent naturellement le visuel a environ 70 % de sa largeur precedente.
   `align-items: start` empeche en plus une carte courte d'etre etiree jusqu'a
   la hauteur de sa voisine. */
@media (min-width: 780px) and (max-width: 1050px) {
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-grid {
    grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
    align-items: start !important;
    gap: 14px !important;
  }
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-grid > .pressing {
    align-self: start !important;
    min-height: 0 !important;
    height: auto !important;
  }
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing .pressing-card-data {
    padding: 14px 14px 12px !important;
  }
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-card-heading h4 {
    margin: 5px 0 14px !important;
    font-size: 20px !important;
    line-height: 1.08 !important;
  }
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-facts-grid {
    gap: 10px 12px !important;
  }
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-facts-grid strong {
    font-size: 13px !important;
  }
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing::after {
    margin: 10px 14px 14px !important;
    max-width: calc(100% - 28px);
  }
}

/* Entre le mobile et le rang de trois cartes, conserve deux colonnes mais
   reduit reellement l'illustration pour eviter l'effet de tuile geante. */
@media (min-width: 721px) and (max-width: 779px) {
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-grid {
    align-items: start !important;
    gap: 14px !important;
  }
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-grid > .pressing {
    align-self: start !important;
    min-height: 0 !important;
    height: auto !important;
  }
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-grid > .pressing .pressing-cover {
    width: 70% !important;
    max-width: 70% !important;
    align-self: center;
  }
}

/* Une pochette de disque reste carree et visible en entier. La largeur de
   81,967 % correspond exactement a la hauteur de l'ancien cadre 1,22:1 :
   on restaure donc la forme sans augmenter la hauteur validee. */
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-grid > .pressing .pressing-cover {
  width: 81.967213% !important;
  max-width: 81.967213% !important;
  aspect-ratio: 1 / 1 !important;
  align-self: center;
  margin-inline: auto !important;
  background: #0b0b09;
}
body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-grid > .pressing .pressing-cover img {
  object-fit: contain !important;
}
@media (min-width: 721px) and (max-width: 779px) {
  body.library-page[data-ex-biblio] .workspace[data-desktop-layout="catalog-flow"] .pressing-grid > .pressing .pressing-cover {
    width: 57.377049% !important;
    max-width: 57.377049% !important;
  }
}

/* Le rail doit garder la selection dans sa zone de peinture. L'ancien zoom
   de 4,5 % depassait le padding et rognait surtout la premiere pochette. */
body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail {
  box-sizing: border-box;
  padding: 12px 14px 18px !important;
  scroll-padding-inline: 14px;
}
body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail .result.active {
  transform: none !important;
}
@media (min-width: 721px) {
  body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail {
    grid-auto-columns: 180px !important;
  }
  /* Le titre reel du rail est rendu a 21,12 px. Une boite de 44 px coupait
     donc la deuxieme ligne (notamment « Die Mensch-Maschine »). Le rail
     desktop grandit avec son contenu : deux lignes entieres pour le titre,
     puis une rangee de 30 px pour l'annee, affichee deux fois plus grande. */
  body.library-page[data-ex-biblio] #results .result > div:not(.result-side) {
    grid-template-rows: 54px 30px;
  }
  body.library-page[data-ex-biblio] #results .result h3 {
    max-height: 54px;
    -webkit-mask-image: none;
    mask-image: none;
  }
  body.library-page[data-ex-biblio] #results .result .album-range {
    font-size: 24px !important;
  }
  body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail .cover-placeholder,
  body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) > .album-panel .album-rail .result.active .cover-placeholder {
    width: min(180px, 100%) !important;
  }
}

/* Le plateau catalogue doit continuer apres sa derniere tuile : le fond noir
   sert de socle visuel et ne doit pas s'arreter au ras du CTA final. */
body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) {
  box-sizing: border-box;
  padding-bottom: 32px;
}

@media (max-width: 720px) {
  body.library-page[data-ex-biblio] #catalog-layout:not(.is-neutral) {
    padding-bottom: 24px;
  }
}

/* Le bouton garde son libelle au centre quelle que soit la largeur disponible.
   La peau mobile le repasse en `display: block` et la feuille editoriale lui
   retirait son rayon : ce composant final reprend uniquement ces deux choix. */
body.library-page[data-ex-biblio] #search-submit.search-submit {
  box-sizing: border-box;
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  min-height: 42px;
  border-radius: 11px !important;
  line-height: 1.15 !important;
  text-align: center !important;
  white-space: nowrap;
}

/* La scene actuelle n'a que deux colonnes. Les vestiges de l'ancienne grille
   a douze colonnes (`1 / 8`, `9 / 13`) creaient cinq pistes implicites nulles
   et limitaient le rail ainsi que la tuile editoriale a 951 px sur 1121 px. */
@media (min-width: 761px) {
  body.library-page[data-ex-biblio] #artist-stage:not([data-has-artist]) {
    grid-template-columns: minmax(0, 1fr) auto !important;
  }
  body.library-page[data-ex-biblio] #artist-stage:not([data-has-artist]) > .artist-stage-copy {
    grid-column: 1 !important;
  }
  body.library-page[data-ex-biblio] #artist-stage:not([data-has-artist]) > .artist-stage-route {
    grid-column: 2 !important;
  }
  body.library-page[data-ex-biblio] #artist-stage:not([data-has-artist]) > :is(#artist-discovery, .artist-discovery-editorial) {
    grid-column: 1 / -1 !important;
    box-sizing: border-box;
    width: 100%;
    margin-inline: auto;
  }
}

/* Hero neutre compact : une promesse à gauche, son explication à droite.
   Toutes les lignes partagent le même repère au lieu de flotter chacune selon
   une ancienne grille de douze colonnes. */
body.library-page[data-ex-biblio] #artist-stage:not([data-has-artist]) {
  grid-template-columns: minmax(0, 1fr) !important;
  padding-top: 0 !important;
}

body.library-page[data-ex-biblio] #artist-stage:not([data-has-artist]) > .artist-stage-copy {
  grid-column: 1 / -1 !important;
  display: grid !important;
  grid-template-columns: minmax(240px, .8fr) minmax(300px, 1.2fr) !important;
  grid-template-rows: auto auto !important;
  align-items: center !important;
  column-gap: clamp(28px, 5vw, 72px) !important;
  min-height: 116px !important;
  padding: 20px var(--reprise-section-gutter) !important;
  text-align: left !important;
}

body.library-page[data-ex-biblio] #artist-stage:not([data-has-artist]) .artist-stage-kicker {
  grid-column: 1;
  grid-row: 1;
}

body.library-page[data-ex-biblio] #artist-stage:not([data-has-artist]) h2 {
  grid-column: 1;
  grid-row: 2;
}

body.library-page[data-ex-biblio] #artist-stage:not([data-has-artist]) .artist-stage-meta {
  grid-column: 2;
  grid-row: 1 / 3;
  width: 100%;
  margin: 0 !important;
  text-align: left !important;
}

body.library-page[data-ex-biblio] #artist-stage:not([data-has-artist]) > :is(#artist-discovery, .artist-discovery-editorial) {
  grid-column: 1 / -1 !important;
}

@media (max-width: 760px) {
  body.library-page[data-ex-biblio] #artist-stage:not([data-has-artist]) > .artist-stage-copy {
    grid-template-columns: minmax(0, 1fr) !important;
    grid-template-rows: auto auto auto !important;
    row-gap: 6px !important;
  }
  body.library-page[data-ex-biblio] #artist-stage:not([data-has-artist]) .artist-stage-meta {
    grid-column: 1;
    grid-row: 3;
  }
}

/* ===========================================================================
   MARQUEUR DE FIN DE FEUILLE — NE PAS DEPLACER, NE PAS SUPPRIMER
   Doit rester la DERNIERE regle du fichier. `deploy/verifier-css.sh` la cherche
   ici, et le smoke navigateur la cherche dans `cssRules` : si elle manque, la
   feuille a ete coupee en route et des regles sont ignorees en silence.
   Ajoute le 2026-08-18 : la garde refusait ces deux feuilles neuves, faute de
   marqueur. Aucune autre ligne de leur contenu n'est touchee.
   =========================================================================== */
:root { --ex-fin-exkave-library-grid: 1; }
