/* ============================================================
   Bibliothèque — notes de lecture
   Esthétique « salle de lecture » : ivoire, serif éditorial,
   labels mono façon fiche cartonnée de bibliothèque.
   S'appuie sur les tokens de landings-shared.css.
   ============================================================ */

/* ---------- Fiche livre : en-tête (couverture + méta) ---------- */

.book-header {
    background: var(--color-ivory-soft, #faf6ee);
    border-bottom: 1px solid var(--color-rule, rgba(15,25,35,0.12));
    padding: 56px 0;
}

.book-header-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: 36px;
    align-items: start;
    max-width: 980px;
    margin: 0 auto;
    padding: 0 var(--section-h-padding, 24px);
}

@media (min-width: 768px) {
    .book-header-grid {
        grid-template-columns: 240px 1fr;
        gap: 48px;
    }
}

/* Couverture : effet livre posé (tranche + ombre portée) */
.book-cover {
    position: relative;
    width: 200px;
    margin: 0 auto;
}

@media (min-width: 768px) {
    .book-cover { width: 240px; margin: 0; }
}

.book-cover img {
    display: block;
    width: 100%;
    height: auto;
    border-radius: 3px 8px 8px 3px;
    box-shadow:
        inset 4px 0 6px -3px rgba(0,0,0,0.35),   /* pli de reliure */
        0 1px 2px rgba(15,25,35,0.18),
        0 12px 28px -8px rgba(15,25,35,0.35);
}

/* Tranche de pages sur le côté droit */
.book-cover::after {
    content: "";
    position: absolute;
    top: 3px;
    right: -5px;
    bottom: 3px;
    width: 5px;
    border-radius: 0 2px 2px 0;
    background: repeating-linear-gradient(
        to bottom,
        #f2ede2 0px, #f2ede2 2px,
        #ddd5c4 2px, #ddd5c4 3px
    );
    box-shadow: 1px 1px 3px rgba(15,25,35,0.2);
}

/* Bloc méta : façon fiche cartonnée */
.book-meta .book-title {
    font-family: var(--font-edito, 'Fraunces', serif);
    font-size: clamp(1.5rem, 3vw, 2rem);
    font-weight: 600;
    color: var(--color-ink, #2a2a2e);
    margin: 0 0 4px;
    line-height: 1.15;
    text-wrap: balance;
}

.book-meta .book-title-vo {
    font-family: var(--font-body, 'Inter', sans-serif);
    font-size: var(--text-sm, 0.88rem);
    color: var(--color-text-muted, #5a6270);
    font-style: italic;
    margin: 0 0 20px;
}

.book-facts {
    list-style: none;
    margin: 0 0 20px;
    padding: 0;
    border-top: 1px solid var(--color-rule, rgba(15,25,35,0.12));
}

.book-facts li {
    display: flex;
    align-items: baseline;
    gap: 12px;
    padding: 9px 0;
    border-bottom: 1px solid var(--color-rule, rgba(15,25,35,0.12));
    font-size: var(--text-sm, 0.88rem);
}

.book-facts .fact-label {
    font-family: var(--font-mono, 'JetBrains Mono', monospace);
    font-size: var(--text-2xs, 0.70rem);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--color-text-muted, #5a6270);
    flex: 0 0 110px;
}

.book-facts .fact-value {
    color: var(--color-ink, #2a2a2e);
    font-weight: 500;
}

/* Note personnelle : pastille mono */
.book-rating {
    display: inline-flex;
    align-items: baseline;
    gap: 6px;
    font-family: var(--font-mono, 'JetBrains Mono', monospace);
    background: var(--color-hero-bg, #0f1923);
    color: #fff;
    border-radius: 8px;
    padding: 8px 14px;
    margin-bottom: 16px;
}

.book-rating strong {
    font-size: 1.3rem;
    color: var(--color-accent, #3aaa64);
}

.book-rating span { font-size: var(--text-xs, 0.78rem); opacity: 0.75; }

/* Punchline personnelle sous la note */
.rating-punchline {
    font-family: var(--font-edito, 'Fraunces', serif);
    font-style: italic;
    font-size: var(--text-md, 1.12rem);
    line-height: 1.45;
    color: var(--color-ink, #2a2a2e);
    margin: -6px 0 18px;
    text-wrap: pretty;
}

/* Boutons Favori / À lire (état persisté en localStorage) */
.book-marks {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin: 0 0 20px;
}

.mark-btn {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    padding: 8px 16px;
    border: 1.5px solid var(--color-card-border, #e8ecf0);
    border-radius: 999px;
    background: #fff;
    font-family: var(--font-heading, 'Montserrat', sans-serif);
    font-size: var(--text-xs, 0.78rem);
    font-weight: 600;
    color: var(--color-ink, #2a2a2e);
    cursor: pointer;
    transition: border-color 0.2s, background 0.2s, color 0.2s;
}

.mark-btn svg {
    width: 15px;
    height: 15px;
    fill: none;
    stroke: currentColor;
    stroke-width: 2;
}

.mark-btn:hover { border-color: var(--color-accent, #3aaa64); }

.mark-btn[aria-pressed="true"] {
    border-color: var(--color-accent, #3aaa64);
    background: rgba(58,170,100,0.10);
    color: var(--color-accent-dark, #267d42);
}

.mark-btn[aria-pressed="true"] svg { fill: currentColor; stroke: none; }

/* Tags */
.book-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin: 0;
    padding: 0;
    list-style: none;
}

.book-tags li {
    font-family: var(--font-mono, 'JetBrains Mono', monospace);
    font-size: var(--text-2xs, 0.70rem);
    background: rgba(58,170,100,0.10);
    border: 1px solid rgba(58,170,100,0.25);
    border-radius: 999px;
    transition: background 0.2s, border-color 0.2s;
}

.book-tags li a {
    display: inline-block;
    padding: 4px 12px;
    color: var(--color-accent-dark, #267d42);
    text-decoration: none;
}

.book-tags li:hover {
    background: rgba(58,170,100,0.20);
    border-color: var(--color-accent, #3aaa64);
}

/* ---------- Corps de la fiche ---------- */

.book-body {
    max-width: 760px;
    margin: 0 auto;
    padding: 48px var(--section-h-padding, 24px) 24px;
}

.book-body > p,
.book-body section > p {
    font-family: var(--font-body, 'Inter', sans-serif);
    font-size: 1.05rem;
    line-height: 1.75;
    color: var(--color-ink, #2a2a2e);
    margin: 0 0 20px;
    text-wrap: pretty;
}

.book-body h2 {
    font-family: var(--font-heading, 'Montserrat', sans-serif);
    font-size: var(--text-xl, 1.6rem);
    font-weight: 700;
    color: var(--color-ink, #2a2a2e);
    margin: 48px 0 16px;
    text-wrap: balance;
}

.book-body h2 em {
    font-family: var(--font-edito, 'Fraunces', serif);
    font-style: italic;
    font-weight: 600;
    color: var(--color-accent-dark, #267d42);
}

/* La phrase d'accroche du livre */
.book-oneliner {
    font-family: var(--font-edito, 'Fraunces', serif);
    font-size: clamp(1.2rem, 2.6vw, 1.45rem);
    font-style: italic;
    line-height: 1.5;
    color: var(--color-ink, #2a2a2e);
    border-left: 3px solid var(--color-accent, #3aaa64);
    padding: 4px 0 4px 22px;
    margin: 0 0 36px;
}

/* ---------- Chapitres du résumé ---------- */

.book-chapter {
    margin: 0 0 36px;
}

.book-chapter h3 {
    display: flex;
    align-items: baseline;
    gap: 14px;
    font-family: var(--font-heading, 'Montserrat', sans-serif);
    font-size: var(--text-lg, 1.32rem);
    font-weight: 700;
    color: var(--color-ink, #2a2a2e);
    margin: 36px 0 12px;
}

.book-chapter h3 .chapter-num {
    font-family: var(--font-edito, 'Fraunces', serif);
    font-size: 1.9rem;
    font-weight: 600;
    font-style: italic;
    color: var(--color-accent, #3aaa64);
    line-height: 1;
    flex-shrink: 0;
}

.book-chapter p {
    font-size: 1.02rem;
    line-height: 1.75;
    color: var(--color-ink, #2a2a2e);
    margin: 0 0 14px;
    text-wrap: pretty;
}

.book-chapter ul {
    margin: 0 0 16px;
    padding-left: 22px;
}

.book-chapter ul li {
    font-size: 0.98rem;
    line-height: 1.7;
    color: var(--color-ink, #2a2a2e);
    margin-bottom: 8px;
    text-wrap: pretty;
}

.book-chapter code {
    font-family: var(--font-mono, 'JetBrains Mono', monospace);
    font-size: 0.85em;
    background: var(--color-light-bg, #f7f8fa);
    border: 1px solid var(--color-card-border, #e8ecf0);
    border-radius: 4px;
    padding: 1px 6px;
    color: var(--color-accent-dark, #267d42);
}

/* ---------- Blocs de code dans les fiches ----------
   Même thème éditeur sombre que les cours /apprendre/ (learn.css) :
   le code est identifié d'un coup d'œil, la lecture du texte
   autour garde son rythme. */

.book-code-block {
    background: #1a1a2e;
    color: #e4e4ef;
    border: none;
    border-radius: 8px;
    padding: 20px;
    font-family: var(--font-mono, 'JetBrains Mono', monospace);
    font-size: 0.88rem;
    line-height: 1.6;
    overflow-x: auto;
    margin: 20px 0;
    white-space: pre;
}

.book-code-block .hl-cmd    { color: #7ee2a8; font-weight: 600; }
.book-code-block .hl-flag   { color: #c4a7f5; }
.book-code-block .hl-sha    { color: #8b93a7; }
.book-code-block .hl-output { color: #8b93a7; }
.book-code-block .hl-kw     { color: #c4a7f5; }
.book-code-block .hl-str    { color: #f5c97e; }
.book-code-block .hl-def    { color: #7ee2a8; }

/* ---------- Nuggets : les surprises de lecture ---------- */

.book-nuggets {
    list-style: none;
    margin: 0 0 36px;
    padding: 0;
}

.book-nuggets li {
    position: relative;
    padding: 14px 18px 14px 46px;
    margin-bottom: 12px;
    background: var(--color-light-bg, #f7f8fa);
    border: 1px solid var(--color-card-border, #e8ecf0);
    border-radius: var(--card-radius, 14px);
    font-size: 0.98rem;
    line-height: 1.65;
    color: var(--color-ink, #2a2a2e);
    text-wrap: pretty;
}

.book-nuggets li::before {
    content: "✦";
    position: absolute;
    left: 18px;
    top: 13px;
    color: var(--color-accent, #3aaa64);
    font-size: 1.05rem;
}

/* ---------- Mon avis : panneau ivoire signé ---------- */

.book-opinion {
    background: var(--color-ivory-soft, #faf6ee);
    border: 1px solid rgba(15,25,35,0.08);
    border-radius: var(--card-radius, 14px);
    padding: 32px 28px;
    margin: 48px 0;
}

.book-opinion h2 {
    margin-top: 0;
}

.book-opinion p {
    font-size: 1.02rem;
    line-height: 1.75;
    margin: 0 0 16px;
    text-wrap: pretty;
}

.book-opinion .opinion-sign {
    font-family: var(--font-edito, 'Fraunces', serif);
    font-style: italic;
    color: var(--color-text-muted, #5a6270);
    margin: 20px 0 0;
    text-align: right;
}

/* ---------- Lisez-le si / Passez si ---------- */

.book-verdict-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: 20px;
    margin: 28px 0 40px;
}

@media (min-width: 640px) {
    .book-verdict-grid { grid-template-columns: 1fr 1fr; }
}

.verdict-card {
    border: 1px solid var(--color-card-border, #e8ecf0);
    border-radius: var(--card-radius, 14px);
    background: #fff;
    padding: 22px;
}

.verdict-card h3 {
    font-family: var(--font-heading, 'Montserrat', sans-serif);
    font-size: var(--text-base, 1rem);
    font-weight: 700;
    margin: 0 0 12px;
}

.verdict-card--yes h3 { color: var(--color-accent-dark, #267d42); }
.verdict-card--no h3  { color: var(--color-warm, #c9663e); }

.verdict-card ul { margin: 0; padding-left: 20px; }

.verdict-card li {
    font-size: var(--text-sm, 0.88rem);
    line-height: 1.65;
    margin-bottom: 8px;
    color: var(--color-ink, #2a2a2e);
}

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

.book-github {
    display: flex;
    align-items: center;
    gap: 18px;
    border: 1.5px solid var(--color-card-border, #e8ecf0);
    border-radius: var(--card-radius, 14px);
    background: #fff;
    padding: 20px 24px;
    margin: 36px 0;
    text-decoration: none;
    transition: border-color 0.2s, box-shadow 0.2s;
}

.book-github:hover {
    border-color: var(--color-accent, #3aaa64);
    box-shadow: 0 8px 24px rgba(58,170,100,0.08);
}

.book-github svg {
    width: 36px;
    height: 36px;
    flex-shrink: 0;
    fill: var(--color-ink, #2a2a2e);
}

.book-github .gh-text strong {
    display: block;
    font-family: var(--font-heading, 'Montserrat', sans-serif);
    font-size: var(--text-base, 1rem);
    color: var(--color-ink, #2a2a2e);
    margin-bottom: 2px;
}

.book-github .gh-text span {
    font-size: var(--text-sm, 0.88rem);
    color: var(--color-text-muted, #5a6270);
}

/* ---------- Fil d'Ariane ---------- */

.book-breadcrumb {
    max-width: 980px;
    margin: 0 auto;
    padding: 18px var(--section-h-padding, 24px) 0;
    font-family: var(--font-mono, 'JetBrains Mono', monospace);
    font-size: var(--text-xs, 0.78rem);
}

.book-breadcrumb a {
    color: var(--color-accent-dark, #267d42);
    text-decoration: none;
}

.book-breadcrumb a:hover { text-decoration: underline; }

.book-breadcrumb span { color: var(--color-text-muted, #5a6270); }

/* ---------- Hub : grille + recherche ---------- */

.biblio-search {
    max-width: 520px;
    margin: 0 auto 40px;
    padding: 0 var(--section-h-padding, 24px);
}

.biblio-search input {
    width: 100%;
    padding: 14px 18px;
    border: 1.5px solid var(--color-card-border, #e8ecf0);
    border-radius: 8px;
    font-family: var(--font-body, 'Inter', sans-serif);
    font-size: var(--text-base, 1rem);
    color: var(--color-ink, #2a2a2e);
    background: #fff;
    transition: border-color 0.2s, box-shadow 0.2s;
}

.biblio-search input:focus {
    outline: none;
    border-color: var(--color-accent, #3aaa64);
    box-shadow: 0 0 0 3px rgba(58,170,100,0.12);
}

/* Filtres Mes favoris / À lire */
.biblio-filters {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 8px;
    margin-top: 14px;
}

.filter-btn {
    padding: 7px 16px;
    border: 1.5px solid var(--color-card-border, #e8ecf0);
    border-radius: 999px;
    background: #fff;
    font-family: var(--font-heading, 'Montserrat', sans-serif);
    font-size: var(--text-xs, 0.78rem);
    font-weight: 600;
    color: var(--color-text-muted, #5a6270);
    cursor: pointer;
    transition: border-color 0.2s, background 0.2s, color 0.2s;
}

.filter-btn:hover { border-color: var(--color-accent, #3aaa64); }

.filter-btn.active {
    border-color: var(--color-accent, #3aaa64);
    background: rgba(58,170,100,0.10);
    color: var(--color-accent-dark, #267d42);
}

.biblio-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: 24px;
    max-width: 980px;
    margin: 0 auto;
    padding: 0 var(--section-h-padding, 24px) 56px;
}

/* 2 colonnes max : laisse de la place au résumé dans chaque carte */
@media (min-width: 700px) { .biblio-grid { grid-template-columns: 1fr 1fr; } }

.biblio-card-wrap {
    position: relative;
}

.biblio-card {
    display: flex;
    height: 100%;
    gap: 18px;
    border: 1px solid var(--color-card-border, #e8ecf0);
    border-radius: var(--card-radius, 14px);
    background: #fff;
    padding: 20px;
    text-decoration: none;
    transition: border-color 0.2s, box-shadow 0.2s, transform 0.2s;
}

.biblio-card-wrap:hover .biblio-card {
    border-color: var(--color-accent, #3aaa64);
    box-shadow: 0 8px 24px rgba(58,170,100,0.08);
    transform: translateY(-2px);
}

/* Boutons ♥ / 🔖 en haut à droite de chaque carte */
.bc-actions {
    position: absolute;
    top: 10px;
    right: 10px;
    display: flex;
    gap: 6px;
    opacity: 0;
    transition: opacity 0.15s;
}

.biblio-card-wrap:hover .bc-actions,
.bc-actions:focus-within,
.bc-actions:has(.bc-action[aria-pressed="true"]) {
    opacity: 1;
}

/* Tactile (pas de hover) : toujours visibles */
@media (hover: none) {
    .bc-actions { opacity: 1; }
}

.bc-action {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    border: 1.5px solid var(--color-card-border, #e8ecf0);
    border-radius: 50%;
    background: #fff;
    color: var(--color-text-muted, #5a6270);
    cursor: pointer;
    box-shadow: 0 2px 6px rgba(15,25,35,0.10);
    transition: border-color 0.2s, color 0.2s, background 0.2s;
}

.bc-action svg {
    width: 15px;
    height: 15px;
    fill: none;
    stroke: currentColor;
    stroke-width: 2;
}

.bc-action:hover {
    border-color: var(--color-accent, #3aaa64);
    color: var(--color-accent-dark, #267d42);
}

.bc-action[aria-pressed="true"] {
    border-color: var(--color-accent, #3aaa64);
    background: rgba(58,170,100,0.12);
    color: var(--color-accent-dark, #267d42);
}

.bc-action[aria-pressed="true"] svg { fill: currentColor; stroke: none; }

.biblio-card img {
    width: 76px;
    height: auto;
    align-self: flex-start;
    border-radius: 2px 5px 5px 2px;
    box-shadow:
        inset 2px 0 4px -2px rgba(0,0,0,0.3),
        0 4px 12px -4px rgba(15,25,35,0.3);
}

.biblio-card .bc-title {
    display: block;
    font-family: var(--font-heading, 'Montserrat', sans-serif);
    font-size: var(--text-base, 1rem);
    font-weight: 700;
    color: var(--color-ink, #2a2a2e);
    margin: 0 0 2px;
    line-height: 1.3;
    padding-right: 64px; /* espace pour les boutons ♥ / 🔖 */
}

.biblio-card .bc-author {
    font-size: var(--text-xs, 0.78rem);
    color: var(--color-text-muted, #5a6270);
    margin: 0 0 8px;
}

.biblio-card .bc-desc {
    font-size: var(--text-sm, 0.88rem);
    line-height: 1.55;
    color: var(--color-ink, #2a2a2e);
    margin: 0 0 10px;
}

.biblio-card .bc-rating {
    font-family: var(--font-mono, 'JetBrains Mono', monospace);
    font-size: var(--text-xs, 0.78rem);
    color: var(--color-accent-dark, #267d42);
    font-weight: 600;
}

.biblio-card .bc-marks {
    margin-left: 8px;
    font-size: var(--text-xs, 0.78rem);
    color: var(--color-warm, #c9663e);
}

/* Fiche à venir : carte non cliquable, couverture adoucie, badge */
.biblio-card-wrap--upcoming .biblio-card { cursor: default; }

.biblio-card-wrap--upcoming:hover .biblio-card {
    border-color: var(--color-card-border, #e8ecf0);
    box-shadow: none;
    transform: none;
}

.biblio-card-wrap--upcoming img { opacity: 0.72; filter: saturate(0.8); }

.bc-upcoming {
    display: inline-block;
    font-family: var(--font-mono, 'JetBrains Mono', monospace);
    font-size: var(--text-2xs, 0.70rem);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--color-text-muted, #5a6270);
    background: var(--color-light-bg, #f7f8fa);
    border: 1px solid var(--color-card-border, #e8ecf0);
    border-radius: 999px;
    padding: 3px 10px;
}

.biblio-empty {
    text-align: center;
    color: var(--color-text-muted, #5a6270);
    padding: 24px 0 56px;
    display: none;
}

/* ---------- CTA bas de fiche ---------- */

.book-next {
    text-align: center;
    padding: 8px var(--section-h-padding, 24px) 64px;
}

.book-next p {
    color: var(--color-text-muted, #5a6270);
    font-size: var(--text-sm, 0.88rem);
    margin-top: 12px;
}

/* ---------- Radar de notation ---------- */

.book-radar {
    margin: 22px 0 6px;
}

/* ---------- Commentaires ---------- */

.book-comments {
    border-top: 1px solid var(--color-rule, rgba(15,25,35,0.12));
    padding-top: 36px;
    margin-top: 12px;
}

.book-comments h2 {
    font-family: var(--font-heading, 'Montserrat', sans-serif);
    font-size: var(--text-lg, 1.32rem);
    color: var(--color-ink, #2a2a2e);
    margin: 0 0 20px;
}

.comment-flash {
    border-radius: 8px;
    padding: 12px 16px;
    font-size: var(--text-sm, 0.88rem);
    margin-bottom: 20px;
}

.comment-flash--ok {
    background: rgba(58,170,100,0.10);
    border: 1px solid rgba(58,170,100,0.35);
    color: var(--color-accent-dark, #267d42);
}

.comment-flash--err {
    background: #fdecea;
    border: 1px solid #e0a89e;
    color: #c0392b;
}

.comment-list { margin-bottom: 28px; }

.comment-item {
    border: 1px solid var(--color-card-border, #e8ecf0);
    border-radius: var(--card-radius, 14px);
    background: #fff;
    padding: 16px 18px;
    margin-bottom: 12px;
}

.comment-head {
    display: flex;
    align-items: baseline;
    gap: 10px;
    margin-bottom: 6px;
}

.comment-head strong {
    font-family: var(--font-heading, 'Montserrat', sans-serif);
    font-size: var(--text-sm, 0.88rem);
    color: var(--color-ink, #2a2a2e);
}

.comment-head span {
    font-family: var(--font-mono, 'JetBrains Mono', monospace);
    font-size: var(--text-2xs, 0.70rem);
    color: var(--color-text-muted, #5a6270);
}

.comment-body {
    font-size: var(--text-sm, 0.88rem);
    line-height: 1.65;
    color: var(--color-ink, #2a2a2e);
}

.comment-form {
    max-width: 640px;
}

.comment-form .comment-field { margin-bottom: 18px; }

.comment-form label {
    display: block;
    font-family: var(--font-heading, 'Montserrat', sans-serif);
    font-size: var(--text-xs, 0.78rem);
    font-weight: 600;
    color: var(--color-ink, #2a2a2e);
    margin-bottom: 7px;
}

.comment-form input[type="text"],
.comment-form input[type="number"],
.comment-form textarea {
    width: 100%;
    padding: 13px 16px;
    border: 1.5px solid var(--color-card-border, #e8ecf0);
    border-radius: 8px;
    font-family: var(--font-body, 'Inter', sans-serif);
    font-size: var(--text-base, 1rem);
    color: var(--color-ink, #2a2a2e);
    background: #fff;
    transition: border-color 0.2s, box-shadow 0.2s;
}

.comment-form textarea {
    resize: vertical;
    min-height: 110px;
    line-height: 1.6;
}

.comment-form input::placeholder,
.comment-form textarea::placeholder {
    color: #9aa3b0;
    font-family: var(--font-body, 'Inter', sans-serif);
}

.comment-form input:focus,
.comment-form textarea:focus {
    outline: none;
    border-color: var(--color-accent, #3aaa64);
    box-shadow: 0 0 0 3px rgba(58,170,100,0.12);
}

.comment-field--captcha input { max-width: 140px; }

.comment-submit {
    padding: 13px 36px;
    font-size: 0.95rem;
    border: none;
    cursor: pointer;
}

/* Honeypot : invisible pour les humains */
.hp-field {
    position: absolute;
    left: -9999px;
    width: 1px;
    height: 1px;
    overflow: hidden;
}

@media (prefers-reduced-motion: reduce) {
    .biblio-card, .book-github { transition: none; }
    .biblio-card:hover { transform: none; }
}
