/* =========================================================
   ludovic-celerier — feuille de style unique
   Design : sobre, éditorial, professionnel.
   Aucune dépendance externe : ni CDN, ni Google Fonts, ni tracker.
   ========================================================= */

/* ---------- 1. Jetons de design ---------- */

:root {
  --bg:            #fbfaf8;
  --bg-elevated:   #ffffff;
  --bg-subtle:     #f2f0ec;
  --text:          #1c1d20;
  --text-muted:    #5b5e63;
  --text-faint:    #85888d;
  --accent:        #2c4a6e;
  --accent-hover:  #1b3a5c;
  --accent-soft:   #eaeff5;
  --gold:          #b8892b;
  --rule:          #e2ded7;
  --rule-strong:   #cfcac1;

  --font-serif: "Iowan Old Style", "Palatino Linotype", Palatino, "Book Antiqua", Georgia, "Times New Roman", serif;
  --font-sans:  -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, Roboto, "Helvetica Neue", Arial, sans-serif;
  --font-mono:  ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;

  --measure: 46rem;
  --gutter:  1.5rem;
  --radius:  4px;

  color-scheme: light dark;
}

@media (prefers-color-scheme: dark) {
  :root {
    --bg:          #14161a;
    --bg-elevated: #1b1e23;
    --bg-subtle:   #21252b;
    --text:        #e9e7e3;
    --text-muted:  #a6aab0;
    --text-faint:  #7c8086;
    --accent:      #8fb3d9;
    --accent-hover:#b6d0ea;
    --accent-soft: #1e2833;
    --gold:        #d8ab55;
    --rule:        #2b2f36;
    --rule-strong: #3d434b;
  }
}

/* ---------- 2. Base ---------- */

*, *::before, *::after { box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-sans);
  font-size: 1.0625rem;
  line-height: 1.65;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

img { max-width: 100%; height: auto; display: block; }

a {
  color: var(--accent);
  text-decoration: none;
  border-bottom: 1px solid transparent;
  transition: color .15s ease, border-color .15s ease;
}
a:hover { color: var(--accent-hover); border-bottom-color: currentColor; }

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

h1, h2, h3, h4 {
  font-family: var(--font-serif);
  font-weight: 600;
  line-height: 1.2;
  letter-spacing: -.01em;
  margin: 0 0 .5rem;
  color: var(--text);
}
h1 { font-size: clamp(1.9rem, 1.4rem + 2.2vw, 2.7rem); }
h2 { font-size: clamp(1.3rem, 1.15rem + .7vw, 1.55rem); }
h3 { font-size: 1.0625rem; }

p { margin: 0 0 1.1rem; }
p:last-child { margin-bottom: 0; }

/* ---------- 3. Structure ---------- */

.wrap {
  width: 100%;
  max-width: var(--measure);
  margin-inline: auto;
  padding-inline: var(--gutter);
}
.wrap--wide { max-width: 56rem; }

.skip-link {
  position: absolute; left: -9999px; top: 0;
  background: var(--accent); color: #fff;
  padding: .6rem 1rem; z-index: 100;
}
.skip-link:focus { left: .5rem; top: .5rem; }

main { padding-block: 3rem 4rem; }

.section { margin-block: 3rem; }
.section:first-child { margin-top: 0; }

.section-title {
  font-family: var(--font-sans);
  font-size: .75rem;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--text-faint);
  margin: 0 0 1.25rem;
  padding-bottom: .6rem;
  border-bottom: 1px solid var(--rule);
}

.lead { font-size: 1.1875rem; line-height: 1.6; color: var(--text-muted); }
.page-intro { margin-bottom: 2.25rem; }

/* ---------- 4. En-tête ---------- */

.site-header {
  border-bottom: 1px solid var(--rule);
  background: color-mix(in srgb, var(--bg) 88%, transparent);
  position: sticky; top: 0; z-index: 20;
  backdrop-filter: saturate(1.6) blur(10px);
}

.site-header .wrap {
  display: flex; align-items: center; justify-content: space-between;
  gap: 1rem; min-height: 3.75rem;
}

.brand {
  font-family: var(--font-serif);
  font-size: 1.0625rem; letter-spacing: .01em;
  color: var(--text); border: 0; white-space: nowrap;
}
.brand:hover { color: var(--accent); border: 0; }

.header-right {
  display: flex; align-items: center; gap: 1.25rem;
  min-width: 0;
}

.site-nav {
  display: flex; align-items: center; gap: 1.15rem;
  font-size: .875rem;
  overflow-x: auto;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
.site-nav::-webkit-scrollbar { display: none; }

.site-nav a {
  color: var(--text-muted); border: 0;
  padding-block: .3rem; white-space: nowrap;
  border-bottom: 1px solid transparent;
}
.site-nav a:hover { color: var(--text); border-bottom-color: var(--rule-strong); }
.site-nav a[aria-current="page"] { color: var(--text); border-bottom-color: var(--accent); }

.lang-switch {
  display: inline-flex; align-items: center; gap: .4rem;
  font-size: .75rem; color: var(--text-faint);
  letter-spacing: .05em; text-transform: uppercase;
}
.lang-switch strong { color: var(--text); font-weight: 600; }
.lang-switch a { color: var(--text-faint); border: 0; }
.lang-switch a:hover { color: var(--accent); }
.lang-switch .sep { color: var(--rule-strong); }

@media (max-width: 46rem) {
  .site-header .wrap { flex-wrap: wrap; padding-block: .6rem; row-gap: .4rem; }
  .header-right { width: 100%; justify-content: space-between; gap: .75rem; }
}

/* ---------- 5. Bandeau de couverture ---------- */

.cover {
  /* La photo source fait 1500 × 500 (3:1). Le bandeau étant plus large que haut,
     « cover » rogne en hauteur : le cadrage est calé vers le bas pour conserver
     l'orateur et le bandeau de logos, qui sont dans la moitié basse de l'image.
     Le dégradé sert de repli si le fichier est absent. */
  height: clamp(150px, 26vw, 260px);
  background-color: var(--accent-soft);
  background-image:
    url("../img/cover.jpg"),
    linear-gradient(115deg, var(--accent-soft) 0%, var(--bg-subtle) 55%, var(--accent-soft) 100%);
  background-size: cover, auto;
  background-position: center 78%;
  background-repeat: no-repeat;
  border-bottom: 1px solid var(--rule);
}

/* Chaque page a sa couverture ; le dégradé reste le repli si le fichier manque.

   La photo de l'équipage est en 3:1 et porte une banderole d'un bord à l'autre :
   elle ne doit jamais être rognée horizontalement, sinon le texte est coupé en
   plein milieu d'un mot. D'où une hauteur égale au tiers de la largeur — le
   bandeau épouse alors exactement le ratio de la photo — plafonnée à 380 px
   pour qu'un grand écran n'affiche pas une bannière démesurée. Au-delà de
   1140 px de large, le bandeau devient plus large que 3:1 et « cover » rogne
   en hauteur, jamais en largeur : la banderole reste entière.

   Ne pas remplacer par « aspect-ratio: 3/1 + max-height » : quand le navigateur
   plafonne la hauteur d'une boîte à ratio fixe, il en déduit la largeur et le
   bandeau cesse d'occuper toute la page (bande noire à droite). */
.cover--sailing {
  height: clamp(150px, 33.34vw, 380px);
  background-image:
    url("../img/cover-voile.jpg"),
    linear-gradient(115deg, var(--accent-soft) 0%, var(--bg-subtle) 55%, var(--accent-soft) 100%);
  background-position: center bottom;
}
.cover--music {
  background-image:
    url("../img/cover-music.jpg"),
    linear-gradient(115deg, var(--accent-soft) 0%, var(--bg-subtle) 55%, var(--accent-soft) 100%);
  background-position: center 40%;
}


/* ---------- 6. Hero ---------- */

.hero { display: flex; align-items: flex-start; gap: 2rem; margin-bottom: 2.5rem; }

.hero-portrait {
  flex: 0 0 auto;
  width: 132px; height: 132px;
  border-radius: 50%; object-fit: cover;
  background: var(--bg-subtle);
  border: 3px solid var(--bg);
  box-shadow: 0 0 0 1px var(--rule);
}

/* Vignette carrée : utilisée pour la photo de DJ set, un cadrage rond y
   couperait maladroitement les platines. */
.hero-portrait--square { border-radius: var(--radius); }

.cover + main .hero { margin-top: -4.5rem; }
.cover + main .hero-body { padding-top: 4.5rem; }

.hero-role {
  font-size: .8125rem; font-weight: 600;
  letter-spacing: .09em; text-transform: uppercase;
  color: var(--accent); margin: 0 0 .5rem;
}
.hero-body { min-width: 0; }
.hero h1 { margin-bottom: .75rem; }

.hero-meta {
  list-style: none; margin: 1rem 0 0; padding: 0;
  display: flex; flex-wrap: wrap; gap: .35rem 1.15rem;
  font-size: .875rem; color: var(--text-faint);
}

@media (max-width: 38rem) {
  .hero { flex-direction: column; gap: 1.25rem; }
  .hero-portrait { width: 108px; height: 108px; }
  .cover + main .hero { margin-top: -3.5rem; }
  .cover + main .hero-body { padding-top: 0; }
}

/* ---------- 7. Chiffres clés ---------- */

.stat-row {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
  gap: 0;
  background: var(--bg-elevated);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  overflow: hidden;
}

.stat-row li {
  padding: 1rem 1.1rem;
  box-shadow: inset -1px -1px 0 var(--rule);
}

.stat-value {
  display: block;
  font-family: var(--font-serif);
  font-size: 1.6rem; line-height: 1.1;
  color: var(--text);
}
.stat-label {
  display: block; margin-top: .25rem;
  font-size: .75rem; letter-spacing: .06em;
  text-transform: uppercase; color: var(--text-faint);
}

/* ---------- 8. Étiquettes ---------- */

.tag-list { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: .5rem; }
.tag-list li {
  font-size: .8125rem; color: var(--text-muted);
  background: var(--bg-subtle); border: 1px solid var(--rule);
  border-radius: 999px; padding: .3rem .75rem; line-height: 1.4;
}

/* ---------- 9. Cartes ---------- */

.card-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); gap: 1rem; }

.doc-card {
  display: block; background: var(--bg-elevated);
  border: 1px solid var(--rule); border-radius: var(--radius);
  padding: 1.15rem 1.25rem; color: inherit;
  transition: border-color .15s ease, transform .15s ease;
}
.doc-card:hover { border-color: var(--rule-strong); color: inherit; transform: translateY(-1px); }

.doc-card-kicker {
  font-size: .6875rem; font-weight: 600; letter-spacing: .12em;
  text-transform: uppercase; color: var(--text-faint);
  display: block; margin-bottom: .4rem;
}
.doc-card-title { font-family: var(--font-serif); font-size: 1.125rem; display: block; margin-bottom: .35rem; }
.doc-card-desc { font-size: .875rem; color: var(--text-muted); margin: 0; }
.doc-card-action { display: inline-block; margin-top: .75rem; font-size: .8125rem; color: var(--accent); font-weight: 500; }
.doc-card:hover .doc-card-action { text-decoration: underline; }

/* ---------- 10. Liens en liste ---------- */

.link-list { list-style: none; margin: 0; padding: 0; display: grid; gap: .1rem; }
.link-list li { border-bottom: 1px solid var(--rule); }
.link-list li:first-child { border-top: 1px solid var(--rule); }

.link-row {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 1rem; padding: .85rem .25rem; border: 0; color: var(--text);
}
.link-row:hover { color: var(--accent); border: 0; }
.link-row-label { font-size: .9375rem; font-weight: 500; }
.link-row-value { font-size: .875rem; color: var(--text-faint); text-align: right; overflow-wrap: anywhere; }
.link-row:hover .link-row-value { color: var(--text-muted); }

/* ---------- 11. CV : parcours ---------- */

.cv-job { padding: 1.6rem 0; border-bottom: 1px solid var(--rule); }
.cv-job:last-child { border-bottom: 0; }

.cv-job-head {
  display: flex; flex-wrap: wrap; align-items: baseline;
  justify-content: space-between; gap: .35rem 1rem; margin-bottom: .15rem;
}
.cv-job-title { font-family: var(--font-serif); font-size: 1.1875rem; margin: 0; }
.cv-job-org { color: var(--accent); }
.cv-job-when {
  font-size: .8125rem; color: var(--text-faint);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.cv-job-where { font-size: .8125rem; color: var(--text-faint); margin: 0 0 .7rem; }

.cv-bullets { margin: 0; padding-left: 1.1rem; }
.cv-bullets li { margin-bottom: .4rem; }
.cv-bullets li:last-child { margin-bottom: 0; }
.cv-bullets li::marker { color: var(--rule-strong); }

.cv-line {
  display: flex; flex-wrap: wrap; align-items: baseline;
  justify-content: space-between; gap: .25rem 1rem;
  padding: .75rem 0; border-bottom: 1px solid var(--rule);
}
.cv-line:last-child { border-bottom: 0; }
.cv-line-main { font-size: .9375rem; }
.cv-line-side { font-size: .8125rem; color: var(--text-faint); white-space: nowrap; }

.skill-block { margin-bottom: 1.1rem; }
.skill-block:last-child { margin-bottom: 0; }
.skill-block dt {
  font-size: .75rem; font-weight: 600; letter-spacing: .08em;
  text-transform: uppercase; color: var(--text-faint); margin-bottom: .2rem;
}
.skill-block dd { margin: 0; font-size: .9375rem; color: var(--text-muted); }

/* ---------- 12. Voile : accordéons par année ---------- */

.year-block {
  border-bottom: 1px solid var(--rule);
}
.year-block[open] { background: color-mix(in srgb, var(--bg-subtle) 45%, transparent); }

.year-summary {
  display: flex; align-items: baseline; gap: .9rem;
  padding: .95rem .5rem .95rem 1.9rem;
  cursor: pointer; list-style: none;
  position: relative;
  transition: background .15s ease;
}
.year-summary::-webkit-details-marker { display: none; }
.year-summary:hover { background: var(--bg-subtle); }

.year-summary::before {
  content: "";
  position: absolute; left: .55rem; top: 50%;
  width: .42rem; height: .42rem;
  border-right: 1.5px solid var(--text-faint);
  border-bottom: 1.5px solid var(--text-faint);
  transform: translateY(-70%) rotate(-45deg);
  transition: transform .18s ease;
}
.year-block[open] > .year-summary::before { transform: translateY(-25%) rotate(45deg); }

.year-number {
  font-family: var(--font-serif); font-size: 1.3rem;
  color: var(--text); font-variant-numeric: tabular-nums;
  min-width: 3.2rem;
}
.year-count { font-size: .8125rem; color: var(--text-faint); white-space: nowrap; }
.year-best {
  font-size: .8125rem; color: var(--text-muted);
  margin-left: auto; text-align: right;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
@media (max-width: 34rem) {
  .year-best { display: none; }
}

.race-list { list-style: none; margin: 0; padding: 0 .5rem 1.1rem 1.9rem; }

.race {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: .15rem 1.2rem;
  padding: .7rem 0;
  border-top: 1px solid var(--rule);
}
.race:first-child { border-top: 0; }

.race-rank {
  grid-column: 2; grid-row: 1;
  font-family: var(--font-serif); font-size: 1.05rem;
  color: var(--text-muted); font-variant-numeric: tabular-nums;
  white-space: nowrap; text-align: right;
}
.race--podium .race-rank { color: var(--gold); font-weight: 600; }
.race-rank small { font-size: .75rem; color: var(--text-faint); font-family: var(--font-sans); }

.race-name { grid-column: 1; grid-row: 1; font-size: .9375rem; font-weight: 500; margin: 0; }
.race-sub {
  grid-column: 1; grid-row: 2;
  font-size: .8125rem; color: var(--text-faint); margin: 0;
}
.race-when {
  grid-column: 2; grid-row: 2;
  font-size: .8125rem; color: var(--text-faint);
  white-space: nowrap; text-align: right; font-variant-numeric: tabular-nums;
}
@media (max-width: 30rem) {
  .race { grid-template-columns: 1fr; }
  .race-rank, .race-when { grid-column: 1; text-align: left; }
  .race-rank { grid-row: 2; }
  .race-sub  { grid-row: 3; }
  .race-when { grid-row: 4; }
}

.toolbar {
  display: flex; flex-wrap: wrap; gap: .5rem;
  align-items: center; margin-bottom: 1.5rem;
}

.btn-plain {
  font: inherit; font-size: .8125rem; cursor: pointer;
  background: transparent; color: var(--text-muted);
  border: 1px solid var(--rule); border-radius: 999px;
  padding: .3rem .85rem;
  transition: border-color .15s ease, color .15s ease, background .15s ease;
}
.btn-plain:hover { color: var(--text); border-color: var(--rule-strong); }
.btn-plain[aria-pressed="true"] {
  color: var(--bg-elevated); background: var(--accent); border-color: var(--accent);
}
@media (prefers-color-scheme: dark) {
  .btn-plain[aria-pressed="true"] { color: #14161a; }
}

.source-note {
  font-size: .8125rem; color: var(--text-faint);
  margin-top: 1.75rem; padding-top: 1rem;
  border-top: 1px solid var(--rule);
}

/* ---------- 13. Parutions et publications ---------- */

.section-sub {
  font-size: .875rem; color: var(--text-muted);
  margin: -.5rem 0 1.25rem;
}

.pub-count {
  font-size: .8125rem; color: var(--text-faint);
  margin-top: .75rem;
}

.pub-year {
  font-family: var(--font-serif); font-size: 1.1rem; color: var(--text-faint);
  margin: 1.75rem 0 .75rem; padding-bottom: .4rem; border-bottom: 1px solid var(--rule);
  font-weight: 400;
}
.pub-year:first-child { margin-top: 0; }

.pub-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(19rem, 1fr));
  gap: 1.25rem;
  margin-bottom: 1.75rem;
}
.pub-grid:last-child { margin-bottom: 0; }

.pub-card {
  display: flex; flex-direction: column;
  background: var(--bg-elevated);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  overflow: hidden;
  transition: border-color .15s ease, transform .15s ease;
}
.pub-card:hover { border-color: var(--rule-strong); transform: translateY(-1px); }

/* Bandeau visuel : photo si elle est fournie, sinon plaque au nom du média. */
.pub-card-media {
  display: block; border: 0;
  aspect-ratio: 16 / 7;
  background: var(--accent-soft);
  overflow: hidden;
}
/* Sans photo, le bandeau est plus bas : il porte un nom, pas une image. */
.pub-card-media--plate { aspect-ratio: 16 / 4.5; }
.pub-card-media:hover { border: 0; }
.pub-card-media img { width: 100%; height: 100%; object-fit: cover; }

.pub-plate {
  display: flex; align-items: center; justify-content: center;
  width: 100%; height: 100%; padding: 1rem;
  background-image: repeating-linear-gradient(
    115deg,
    color-mix(in srgb, var(--accent) 7%, transparent) 0 1px,
    transparent 1px 9px);
}
.pub-plate-name {
  font-family: var(--font-serif); font-size: 1.2rem; line-height: 1.25;
  color: var(--accent); text-align: center; text-wrap: balance;
}

.pub-card-body { padding: .95rem 1.15rem 1.15rem; }

.pub-meta {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: .4rem .6rem; margin-bottom: .4rem;
}
.pub-type {
  font-size: .625rem; font-weight: 600; letter-spacing: .09em;
  text-transform: uppercase; color: var(--accent);
  border: 1px solid var(--rule-strong); border-radius: 2px;
  padding: .1rem .4rem; white-space: nowrap;
}
.pub-role {
  font-size: .625rem; font-weight: 600; letter-spacing: .09em;
  text-transform: uppercase; color: var(--text-faint);
}
.pub-source { font-size: .8125rem; color: var(--text-muted); }
.pub-date   { font-size: .8125rem; color: var(--text-faint); }

.pub-title {
  font-family: var(--font-serif); font-size: 1.0625rem; line-height: 1.3;
  margin: 0 0 .35rem; text-wrap: balance;
}
.pub-title a { color: var(--text); border: 0; }
.pub-title a:hover { color: var(--accent); }
.pub-title a[target="_blank"]::after {
  content: "↗"; font-size: .7em; margin-left: .3em; color: var(--text-faint); vertical-align: super;
}
.pub-desc { font-size: .875rem; color: var(--text-muted); margin: 0; }

.empty-note { color: var(--text-faint); font-style: italic; padding: 1.5rem 0; }

/* ---------- 14. Musique ---------- */

.embed-notice {
  font-size: .8125rem; line-height: 1.55; color: var(--text-muted);
  background: var(--bg-subtle);
  border: 1px solid var(--rule); border-left: 3px solid var(--accent);
  border-radius: var(--radius);
  padding: .85rem 1.1rem; margin-bottom: 2.5rem;
}
.embed-notice em { font-style: normal; font-family: var(--font-mono); font-size: .95em; }

.embed-grid {
  display: grid; grid-template-columns: 1fr; gap: 2rem;
  max-width: 46rem;
}
.embed-stack { display: grid; gap: 1.5rem; }

figure.embed { margin: 0; }
figure.embed iframe {
  display: block; width: 100%; border: 0;
  border-radius: var(--radius); background: var(--bg-subtle);
}
.embed--video iframe { aspect-ratio: 16 / 9; }
.embed--track iframe { height: 300px; }

figure.embed figcaption {
  font-size: .8125rem; color: var(--text-faint); margin-top: .5rem;
}

/* ---------- 16. Pied de page ---------- */

.site-footer {
  border-top: 1px solid var(--rule);
  margin-top: 4rem; padding-block: 2rem 2.5rem;
  font-size: .8125rem; color: var(--text-faint);
}
.site-footer .wrap { display: flex; flex-wrap: wrap; justify-content: space-between; gap: .75rem; }
.site-footer a { color: var(--text-faint); }
.site-footer a:hover { color: var(--accent); }

/* ---------- 17. Impression ---------- */

@media print {
  :root {
    --bg: #fff; --bg-elevated: #fff; --bg-subtle: #fff;
    --text: #000; --text-muted: #333; --text-faint: #555;
    --accent: #1b3a5c; --rule: #ccc; --rule-strong: #999;
  }
  .site-header, .site-footer, .cover, .toolbar, .lang-switch,
  .skip-link, .doc-card, .source-note { display: none !important; }
  body { background: #fff; font-size: 10.5pt; line-height: 1.45; }
  main { padding-block: 0; }
  .wrap { max-width: none; padding-inline: 0; }
  h1 { font-size: 20pt; }
  h2 { font-size: 12pt; }
  .lead { font-size: 11pt; }
  .section { margin-block: 1.1rem; break-inside: avoid; }
  .cv-job, .race, .pub-item, .ref-group { break-inside: avoid; }
  .hero { margin-bottom: 1rem; gap: 1.2rem; }
  .hero-portrait { width: 92px; height: 92px; border: 0; box-shadow: none; }
  .year-block { break-inside: avoid; }
  /* Force l'ouverture des accordéons : le PDF doit contenir tout le palmarès. */
  details.year-block > *:not(summary) { display: block !important; }
  .year-summary::before { display: none; }
  .race-list { display: block !important; padding-left: .25rem; }
  a { color: #000; border: 0; }
  .pub-title a[target="_blank"]::after { content: ""; }
}

/* ---------- 18. Utilitaires ---------- */

.card-grid--spaced { margin-bottom: 2.5rem; }
.pub-count { font-size: .8125rem; color: var(--text-faint); margin-bottom: 1.5rem; }
.footnote { margin-top: 1.25rem; font-size: .9375rem; color: var(--text-muted); }
.cv-line-note { display: block; font-size: .8125rem; color: var(--text-faint); }

/* Un conteneur rempli par JavaScript ne doit pas laisser d'espace s'il reste vide. */
.toolbar:empty, .stat-row:empty { display: none; }
