/* ================================================================
   English Literature Revision — shared styles
   Design: ink & manuscript. Dark "ink" ground by default, warm
   parchment type, each text carries its own accent (rose / brass /
   frost-gold). Light mode available via [data-theme="light"] on <html>.
   ================================================================ */

@import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600;9..144,700&family=Literata:ital,wght@0,400;0,500;0,600;1,400&display=swap');

:root{
  --ink:        #121019;
  --ink-2:      #1b1826;
  --ink-3:      #241f33;
  --paper:      #f4ecdb;
  --text:       #eae4d8;
  --muted:      #948d9c;
  --hairline:   #322c42;
  --shadow:     rgba(0,0,0,.55);

  /* default accent (home page); text pages override */
  --accent:     #c9506f;
  --accent-ink: #1c1520;

  --radius: 14px;
  --serif: 'Fraunces', 'Iowan Old Style', Georgia, serif;
  --body:  'Literata', Georgia, serif;
}

:root[data-theme="light"]{
  --ink:        #f7f1e3;
  --ink-2:      #ffffff;
  --ink-3:      #efe6cf;
  --paper:      #201a2b;
  --text:       #2c2636;
  --muted:      #746c85;
  --hairline:   #e3d8bd;
  --shadow:     rgba(80,60,30,.14);
}

/* per-text accent themes, applied via body[data-text="..."] */
body[data-text="romeo-juliet"]     { --accent:#c9506f; --accent-ink:#2a1420; }
body[data-text="inspector-calls"]  { --accent:#b98a3e; --accent-ink:#241d10; }
body[data-text="christmas-carol"]  { --accent:#d4af6a; --accent-ink:#101a2e; }
:root[data-theme="light"] body[data-text="christmas-carol"] { --accent-ink:#fff8ea; }

*{ box-sizing:border-box; }
html{ scroll-behavior:smooth; }
body{
  margin:0; background:var(--ink); color:var(--text);
  font-family:var(--body); font-size:16px; line-height:1.6;
  -webkit-font-smoothing:antialiased; transition:background .2s, color .2s;
}
h1,h2,h3,h4{ font-family:var(--serif); font-weight:600; margin:0 0 .5em; letter-spacing:.01em; }
a{ color:inherit; text-decoration:none; }
p{ margin:0 0 1em; color:var(--text); }
button{ font-family:var(--body); }
:focus-visible{ outline:2px solid var(--accent); outline-offset:3px; }
@media (prefers-reduced-motion: reduce){
  *{ animation-duration:.001ms !important; transition-duration:.001ms !important; }
}

.wrap{ max-width:1080px; margin:0 auto; padding:0 1.5rem; }
.section{ padding:4.5rem 0; }
.section-alt{ background:var(--ink-2); border-top:1px solid var(--hairline); border-bottom:1px solid var(--hairline); }

/* ---------- nav ---------- */
nav.site-nav{
  display:flex; align-items:center; justify-content:space-between;
  padding:1.1rem 1.5rem; border-bottom:1px solid var(--hairline);
  position:sticky; top:0; background:color-mix(in srgb, var(--ink) 92%, transparent); backdrop-filter:blur(6px);
  z-index:50;
}
.brand{ font-family:var(--serif); font-size:1.15rem; font-weight:700; color:var(--paper); }
.brand .brand-highlight{ color:var(--accent); font-style:italic; font-weight:600; }
.brand small{ display:block; font-family:var(--body); font-weight:400; font-size:.66rem; color:var(--muted); letter-spacing:.12em; text-transform:uppercase; margin-top:2px; }

.nav-links-inline{ display:none; align-items:center; gap:1.6rem; font-size:.88rem; }
.nav-links-inline a{ color:var(--muted); transition:color .15s; }
.nav-links-inline a:hover, .nav-links-inline a.active{ color:var(--accent); }
.theme-toggle-inline{
  width:36px; height:36px; border-radius:50%; border:1px solid var(--hairline);
  background:var(--ink-2); cursor:pointer; display:flex; align-items:center; justify-content:center;
  font-size:1rem;
}
.theme-toggle-inline:hover{ border-color:var(--accent); }

@media (min-width:860px){
  .nav-links-inline{ display:flex; }
  .hamburger-btn{ display:none; }
}

.hamburger-btn{
  width:44px; height:44px; border-radius:12px; border:1px solid var(--hairline);
  background:var(--ink-2); cursor:pointer; display:flex; flex-direction:column;
  align-items:center; justify-content:center; gap:5px; flex-shrink:0;
}
.hamburger-btn span{ width:20px; height:2px; background:var(--text); display:block; transition:transform .2s, opacity .2s; }
.hamburger-btn:hover{ border-color:var(--accent); }
.hamburger-btn[aria-expanded="true"] span:nth-child(1){ transform:translateY(7px) rotate(45deg); }
.hamburger-btn[aria-expanded="true"] span:nth-child(2){ opacity:0; }
.hamburger-btn[aria-expanded="true"] span:nth-child(3){ transform:translateY(-7px) rotate(-45deg); }

.nav-overlay{
  position:fixed; inset:0; background:rgba(0,0,0,.5); opacity:0; pointer-events:none;
  transition:opacity .2s; z-index:60;
}
.nav-overlay.open{ opacity:1; pointer-events:auto; }

.nav-panel{
  position:fixed; top:0; right:0; height:100%; width:min(320px, 86vw);
  background:var(--ink-2); border-left:1px solid var(--hairline);
  transform:translateX(100%); transition:transform .25s ease;
  z-index:61; padding:1.5rem; display:flex; flex-direction:column; gap:1.4rem;
  box-shadow:-20px 0 50px -20px var(--shadow);
}
.nav-panel.open{ transform:translateX(0); }
.nav-panel-close{
  align-self:flex-end; width:34px; height:34px; border-radius:50%; border:1px solid var(--hairline);
  background:transparent; color:var(--text); font-size:1.2rem; cursor:pointer; line-height:1;
}
.nav-panel-close:hover{ border-color:var(--accent); color:var(--accent); }
.nav-panel-links{ display:flex; flex-direction:column; gap:1.1rem; margin-top:.5rem; }
.nav-panel-links a{ font-family:var(--serif); font-size:1.15rem; color:var(--text); }
.nav-panel-links a:hover, .nav-panel-links a.active{ color:var(--accent); }
.theme-toggle-btn{
  margin-top:auto; display:flex; align-items:center; gap:.6rem; justify-content:center;
  padding:.8rem 1rem; border-radius:999px; border:1px solid var(--hairline);
  background:var(--ink-3); color:var(--text); cursor:pointer; font-size:.9rem;
}
.theme-toggle-btn:hover{ border-color:var(--accent); }

/* ---------- welcome modal ---------- */
.modal-overlay{
  position:fixed; inset:0; background:rgba(0,0,0,.6); display:flex; align-items:center; justify-content:center;
  padding:1.5rem; z-index:80; opacity:0; pointer-events:none; transition:opacity .2s;
}
.modal-overlay.show{ opacity:1; pointer-events:auto; }
.modal{
  background:var(--ink-2); border:1px solid var(--hairline); border-radius:18px;
  max-width:440px; width:100%; padding:2rem; position:relative;
  transform:translateY(10px); transition:transform .2s;
}
.modal-overlay.show .modal{ transform:translateY(0); }
.modal-close{
  position:absolute; top:1rem; right:1rem; width:32px; height:32px; border-radius:50%;
  border:1px solid var(--hairline); background:transparent; color:var(--text); font-size:1.1rem; cursor:pointer;
}
.modal-close:hover{ border-color:var(--accent); color:var(--accent); }
.welcome-list{ margin:1.1rem 0 1.4rem; padding-left:1.1rem; color:var(--text); font-size:.9rem; }
.welcome-list li{ margin-bottom:.55rem; }

/* ---------- accounts ---------- */
.account-btn{
  padding:.4rem 1.1rem .4rem .4rem; border-radius:999px; border:1px solid var(--hairline); background:var(--ink-2);
  color:var(--text); font-size:.85rem; cursor:pointer; white-space:nowrap;
  display:inline-flex; align-items:center; gap:.55rem;
}
.account-btn:hover{ border-color:var(--accent); }
.avatar-circle{
  display:inline-flex; align-items:center; justify-content:center; flex-shrink:0;
  border-radius:50%; overflow:hidden; background:var(--ink-3);
}
.avatar-circle img{ width:100%; height:100%; object-fit:cover; display:block; }
.avatar-fallback-text{ font-family:var(--serif); color:var(--accent); }
.avatar-tiny{ width:24px; height:24px; }
.avatar-tiny .avatar-fallback-text{ font-size:.62rem; }
.avatar-medium{ width:64px; height:64px; }
.avatar-medium .avatar-fallback-text{ font-size:1.3rem; }
.avatar-large{ width:110px; height:110px; }
.avatar-large .avatar-fallback-text{ font-size:2.2rem; }

/* ---------- public profile page ---------- */
.profile-wrap{ max-width:640px; margin:0 auto; }
.profile-head{ display:flex; align-items:center; gap:1.6rem; margin-bottom:2rem; flex-wrap:wrap; }
.profile-head h1{ font-size:2rem; color:var(--paper); margin-bottom:.3rem; }
.profile-head .joined{ color:var(--muted); font-size:.85rem; }
.member-number-tag{
  display:inline-block; margin-left:.6rem; padding:.15rem .6rem; border-radius:999px;
  border:1px solid var(--hairline); color:var(--accent); font-size:.72rem; font-weight:700;
  letter-spacing:.02em; vertical-align:middle;
}
.profile-stat-grid{ display:grid; grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); gap:1rem; margin-bottom:2rem; }
.profile-stat-card{ background:var(--ink-2); border:1px solid var(--hairline); border-radius:12px; padding:1.2rem; text-align:center; }
.profile-stat-card .num{ font-family:var(--serif); font-size:1.7rem; color:var(--accent); display:block; }
.profile-stat-card .label{ font-size:.76rem; color:var(--muted); text-transform:uppercase; letter-spacing:.06em; margin-top:.3rem; display:block; }
.profile-graphs{ margin-top:1rem; }
.profile-graphs h3{ font-size:1rem; color:var(--paper); margin-bottom:1rem; }
.graph-row{ margin-bottom:1.1rem; }
.graph-row-label{ display:flex; justify-content:space-between; font-size:.85rem; color:var(--text); margin-bottom:.4rem; }
.graph-row-label .value{ color:var(--accent); font-weight:600; }
.graph-track{ height:10px; border-radius:999px; background:var(--ink-3); border:1px solid var(--hairline); overflow:hidden; }
.graph-fill{ height:100%; background:var(--accent); border-radius:999px; transition:width .4s ease; }
.account-avatar-row{ display:flex; align-items:center; gap:1rem; margin-bottom:1.4rem; }
.auth-field{ display:flex; flex-direction:column; gap:.4rem; margin-bottom:1rem; }
.auth-field label{ font-size:.78rem; color:var(--muted); }
.auth-field input{
  background:var(--ink-3); border:1px solid var(--hairline); border-radius:10px; padding:.7rem .9rem;
  color:var(--text); font-family:var(--body); font-size:.95rem;
}
.auth-field input:focus{ outline:none; border-color:var(--accent); }
.auth-error{ color:#e0738a; font-size:.82rem; margin:0 0 1rem; display:none; }
.auth-error.show{ display:block; }
.auth-switch{ text-align:center; font-size:.85rem; color:var(--muted); margin-top:1.1rem; }
.auth-switch a{ color:var(--accent); cursor:pointer; text-decoration:underline; }
.newsletter-toggle-row{
  display:flex; align-items:center; gap:.7rem; margin:1.2rem 0; font-size:.88rem; color:var(--text); cursor:pointer;
}
.newsletter-toggle-row input{ width:16px; height:16px; accent-color:var(--accent); cursor:pointer; }

/* ---------- buttons ---------- */
.btn{
  display:inline-flex; align-items:center; gap:.5rem;
  padding:.7rem 1.3rem; border-radius:999px; border:1px solid var(--hairline);
  background:var(--ink-2); color:var(--text); cursor:pointer; font-size:.9rem;
  transition:transform .15s, border-color .15s, background .15s;
}
.btn:hover{ border-color:var(--accent); transform:translateY(-1px); }
.btn.primary{ background:var(--accent); color:var(--accent-ink); border-color:var(--accent); font-weight:600; }
.btn.primary:hover{ filter:brightness(1.08); }
.btn.ghost{ background:transparent; }
.btn.lg{ padding:.9rem 1.8rem; font-size:1rem; }

.badge{
  display:inline-flex; align-items:center; gap:.4rem; padding:.35rem .8rem; border-radius:999px;
  border:1px solid var(--hairline); font-size:.72rem; letter-spacing:.1em; text-transform:uppercase;
  color:var(--accent); margin-bottom:1rem;
}

/* ---------- home: hero ---------- */
.hero{ padding:4rem 0 3rem; text-align:center; }
.hero h1{ font-size:clamp(2.2rem, 5vw, 3.4rem); max-width:22ch; color:var(--paper); margin-left:auto; margin-right:auto; }
.hero p.lead{ max-width:62ch; color:var(--muted); font-size:1.1rem; margin-left:auto; margin-right:auto; }
.hero-actions{ display:flex; gap:.9rem; margin-top:1.6rem; flex-wrap:wrap; justify-content:center; }

/* ---------- home: horizontal book list ---------- */
.section-eyebrow{ text-transform:uppercase; letter-spacing:.16em; font-size:.72rem; color:var(--muted); margin-bottom:.6rem; display:block; }
.book-list{ display:flex; flex-direction:column; gap:1.2rem; margin:2rem 0; }
.book-card{
  --spine-c: #c9506f;
  display:flex; align-items:stretch; gap:1.6rem; border-radius:var(--radius);
  border:1px solid var(--hairline); background:var(--ink-2); overflow:hidden;
  transition:transform .2s, border-color .2s;
}
.book-card:hover{ transform:translateY(-3px); border-color:var(--spine-c); }
.book-cover{
  flex:0 0 160px; background:linear-gradient(155deg, var(--spine-c), color-mix(in srgb, var(--spine-c) 45%, black));
  display:flex; align-items:center; justify-content:center; position:relative;
}
.book-cover::after{ content:''; position:absolute; inset:0; background:linear-gradient(100deg, rgba(255,255,255,.14), transparent 40%); }
.book-cover span{ font-family:var(--serif); font-size:2.4rem; color:rgba(255,255,255,.92); }
.book-info{ flex:1; padding:1.6rem 1.8rem 1.6rem 0; display:flex; flex-direction:column; justify-content:center; gap:.4rem; }
.book-info .book-author{ text-transform:uppercase; letter-spacing:.1em; font-size:.72rem; color:var(--spine-c); }
.book-info h3{ font-size:1.5rem; margin:0; color:var(--paper); }
.book-info p{ color:var(--muted); font-size:.92rem; margin:.2rem 0 .8rem; max-width:56ch; }
.book-info .btn{ align-self:flex-start; }

@media (max-width:640px){
  .book-card{ flex-direction:column; }
  .book-cover{ flex-basis:110px; }
  .book-info{ padding:1.2rem; }
}

/* ---------- feature grid (home) ---------- */
.feature-grid{ display:grid; grid-template-columns:repeat(auto-fit,minmax(230px,1fr)); gap:1rem; margin:1.5rem 0; }
.feature-card{
  background:var(--ink-2); border:1px solid var(--hairline); border-radius:var(--radius);
  padding:1.4rem; transition:border-color .15s, transform .15s;
}
.feature-card:hover{ border-color:var(--accent); transform:translateY(-3px); }
.feature-card .num{ font-family:var(--serif); color:var(--accent); font-size:.8rem; letter-spacing:.1em; }
.feature-card h3{ font-size:1.05rem; margin:.4rem 0 .5rem; }
.feature-card p{ font-size:.88rem; color:var(--muted); margin:0; }

/* ---------- home: how it works ---------- */
.steps{ display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:1.4rem; margin:2rem 0; }
.step{ text-align:left; }
.step .step-num{
  width:40px; height:40px; border-radius:50%; border:1px solid var(--accent); color:var(--accent);
  display:flex; align-items:center; justify-content:center; font-family:var(--serif); margin-bottom:.8rem;
}
.step h4{ font-size:1rem; margin-bottom:.3rem; }
.step p{ font-size:.86rem; color:var(--muted); }

.cta-banner{
  text-align:center; padding:3.5rem 1.5rem; border-radius:20px; margin:2rem auto 0; max-width:1080px;
  background:linear-gradient(160deg, var(--ink-3), var(--ink-2)); border:1px solid var(--hairline);
}
.cta-banner h2{ font-size:1.8rem; }
.cta-banner p{ color:var(--muted); max-width:50ch; margin:0 auto 1.4rem; }

/* ---------- text hub ---------- */
.text-hero{ padding:3rem 0 1.5rem; border-bottom:1px solid var(--hairline); margin-bottom:2rem; }
.text-hero h1{ font-size:2.4rem; color:var(--paper); }
.text-hero .tagline{ color:var(--muted); font-size:1rem; max-width:60ch; }
.game-grid{ display:grid; grid-template-columns:repeat(auto-fit,minmax(240px,1fr)); gap:1.2rem; margin-bottom:3rem; }
.game-card{
  background:var(--ink-2); border:1px solid var(--hairline); border-radius:var(--radius);
  padding:1.6rem; display:flex; flex-direction:column; gap:.7rem;
  transition:transform .18s, border-color .18s;
}
.game-card:hover{ transform:translateY(-4px); border-color:var(--accent); }
.game-card .icon{ font-size:1.6rem; }
.game-card h3{ font-size:1.1rem; margin:0; }
.game-card p{ font-size:.86rem; color:var(--muted); margin:0; flex:1; }
.game-card .btn{ align-self:flex-start; }

/* ---------- shared game chrome ---------- */
.game-topbar{
  display:flex; align-items:center; gap:1rem;
  padding:1rem 1.5rem; border-bottom:1px solid var(--hairline);
}
.game-topbar .back{ color:var(--muted); font-size:.85rem; }
.game-topbar .back:hover{ color:var(--accent); }

.stage{ min-height:calc(100vh - 130px); padding:2rem 1.5rem 4rem; }
.empty-state{ text-align:center; color:var(--muted); padding:4rem 1rem; }

/* ---------- prominent theme step (used by match/deep-analysis/who-said) ---------- */
.theme-step{ max-width:760px; margin:0 auto 2.4rem; text-align:center; }
.theme-step h2{ font-size:1.35rem; margin-bottom:1rem; }
.theme-step .switch-note{ font-size:.8rem; color:var(--muted); margin-top:.7rem; }
.pill-row{ display:flex; gap:.6rem; flex-wrap:wrap; justify-content:center; }
.pill{
  padding:.45rem .95rem; border-radius:999px; border:1px solid var(--hairline);
  background:transparent; color:var(--muted); font-size:.82rem; cursor:pointer; transition:.15s;
}
.pill.active, .pill:hover{ border-color:var(--accent); color:var(--text); }
.pill.active{ background:var(--accent); color:var(--accent-ink); font-weight:600; }
.pill-lg{ padding:.75rem 1.4rem; font-size:.95rem; border-radius:999px; }

/* ---------- flashcards (match theme to quotes) ---------- */
.flash-wrap{ max-width:640px; margin:0 auto 2rem; display:flex; flex-direction:column; align-items:center; gap:1.2rem; }
.flashcard{ width:100%; min-height:280px; perspective:1400px; cursor:pointer; }
.flashcard-inner{
  position:relative; width:100%; height:100%; min-height:280px; text-align:center;
  transition:transform .5s cubic-bezier(.4,.2,.2,1); transform-style:preserve-3d;
}
.flashcard.flipped .flashcard-inner{ transform:rotateY(180deg); }
.flash-face{
  position:absolute; inset:0; backface-visibility:hidden; border-radius:18px;
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  padding:2.2rem; border:1px solid var(--hairline);
  background:linear-gradient(160deg, var(--ink-2), var(--ink-3));
}
.flash-face.back{ transform:rotateY(180deg); }
.flash-face .eyebrow{ text-transform:uppercase; letter-spacing:.14em; font-size:.7rem; color:var(--accent); margin-bottom:1rem; }
.flash-face blockquote{ font-family:var(--serif); font-size:1.35rem; line-height:1.45; margin:0; color:var(--paper); font-style:italic; }
.flash-face .source{ margin-top:1.1rem; font-size:.82rem; color:var(--muted); }
.flash-face .explain{ font-size:.95rem; color:var(--text); }
.flash-nav{ display:flex; gap:1rem; align-items:center; }
.flash-count{ font-size:.82rem; color:var(--muted); }

/* ---------- deep quote analysis ---------- */
.analysis-picker{ max-width:760px; margin:0 auto; display:flex; flex-direction:column; gap:.6rem; }
.quote-pick{
  text-align:left; padding:1rem 1.2rem; border-radius:12px; border:1px solid var(--hairline);
  background:var(--ink-2); cursor:pointer; font-family:var(--serif); font-style:italic; color:var(--paper);
}
.quote-pick:hover{ border-color:var(--accent); }
.quote-pick .meta{ display:block; font-family:var(--body); font-style:normal; font-size:.75rem; color:var(--muted); margin-top:.3rem; }

.explosion-stage{ position:relative; width:100%; overflow:auto; touch-action:none; cursor:grab; }
.explosion-stage.panning{ cursor:grabbing; }
.explosion-canvas{
  position:relative; width:1400px; height:820px; margin:0 auto;
  transform-origin:top center; transition:transform .15s ease;
}
.explosion-core{
  position:absolute; left:50%; top:50%; transform:translate(-50%,-50%);
  width:420px; padding:1.8rem; border-radius:18px; text-align:center;
  background:linear-gradient(160deg, var(--ink-3), var(--ink-2));
  border:1px solid var(--accent); box-shadow:0 0 60px -10px color-mix(in srgb, var(--accent) 45%, transparent);
  z-index:2;
}
.explosion-core blockquote{ font-family:var(--serif); font-style:italic; font-size:1.5rem; color:var(--paper); margin:0 0 .6rem; }
.explosion-core .source{ font-size:.8rem; color:var(--muted); }
.annotation-node{
  position:absolute; width:210px; padding:1rem 1.1rem; border-radius:12px;
  background:var(--ink-2); border:1px solid var(--hairline); font-size:.84rem; cursor:pointer;
  transition:border-color .15s, transform .15s; z-index:3; user-select:none;
}
.annotation-node:hover, .annotation-node.open{ border-color:var(--accent); transform:scale(1.03); }
.annotation-node .tag{ font-size:.68rem; text-transform:uppercase; letter-spacing:.1em; color:var(--accent); display:block; margin-bottom:.4rem; }
.annotation-node .note{ display:none; color:var(--text); margin-top:.5rem; }
.annotation-node.open .note{ display:block; }
@media (hover:hover) and (pointer:fine){
  .annotation-node{ cursor:default; }
  .annotation-node .note{ display:block; }
}
.connector{ position:absolute; z-index:1; stroke:var(--hairline); stroke-width:1.5; fill:none; }
.zoom-controls{
  position:fixed; bottom:1.5rem; right:1.5rem; display:flex; gap:.5rem; z-index:45;
  background:var(--ink-2); border:1px solid var(--hairline); border-radius:999px; padding:.4rem;
}
.zoom-controls button{
  width:38px; height:38px; border-radius:50%; border:none; background:transparent; color:var(--text);
  font-size:1.1rem; cursor:pointer;
}
.zoom-controls button:hover{ background:var(--accent); color:var(--accent-ink); }

/* ---------- heatmap ---------- */
.heatmap-wrap{ max-width:900px; margin:0 auto; }
.heatmap-grid{ display:grid; border:1px solid var(--hairline); border-radius:12px; overflow:hidden; }
.heat-row{ display:contents; }
.heat-cell, .heat-head{
  padding:.75rem .5rem; text-align:center; font-size:.8rem; border-bottom:1px solid var(--hairline); border-right:1px solid var(--hairline);
}
.heat-head{ background:var(--ink-3); color:var(--muted); font-weight:600; position:sticky; top:0; }
.heat-theme-label{ text-align:left; padding-left:1rem; color:var(--paper); font-family:var(--serif); background:var(--ink-3); white-space:nowrap; }
.heat-cell{ color:var(--paper); font-weight:600; }
.act-summaries{ display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:1rem; margin-top:2rem; }
.act-summary-card{ background:var(--ink-2); border:1px solid var(--hairline); border-radius:12px; padding:1.2rem; }
.act-summary-card h4{ color:var(--accent); font-size:.95rem; margin-bottom:.5rem; }
.act-summary-card p{ font-size:.85rem; color:var(--muted); margin:0; }

/* ---------- heatmap: key events timeline (zigzag flow) ---------- */
.timeline-section{ max-width:1100px; margin:3.5rem auto 0; }
.timeline-wrap{ padding:.5rem; }

.timeline-flow-wrap{ position:relative; padding:1.5rem .5rem; }
.timeline-flow-path{ position:absolute; inset:0; width:100%; height:100%; overflow:visible; pointer-events:none; }
.timeline-flow-path path{ fill:none; stroke:var(--accent); stroke-width:2; stroke-dasharray:2 8; stroke-linecap:round; opacity:.6; }

.timeline-flow-grid{ display:flex; flex-direction:column; gap:2.2rem; position:relative; z-index:2; }
.timeline-flow-row{ display:flex; gap:.9rem; justify-content:space-evenly; align-items:flex-start; }
.timeline-flow-row.reverse{ flex-direction:row-reverse; }

.timeline-flow-node{
  flex:1 1 0; min-width:0; max-width:200px; display:flex; flex-direction:column; align-items:center;
  text-align:center; gap:.55rem; cursor:pointer; position:relative;
}
.timeline-flow-dot{
  width:16px; height:16px; border-radius:50%; background:var(--accent); border:3px solid var(--ink);
  box-shadow:0 0 0 2px var(--accent); flex-shrink:0; transition:transform .15s;
}
.timeline-flow-node:hover .timeline-flow-dot, .timeline-flow-node.open .timeline-flow-dot{ transform:scale(1.15); }
.timeline-flow-node.minor .timeline-flow-dot{
  width:11px; height:11px; border-width:2px; background:var(--ink-3); box-shadow:0 0 0 2px var(--hairline);
}
.timeline-flow-label{
  font-size:.76rem; font-family:var(--serif); color:var(--paper); line-height:1.3;
}
.timeline-flow-node.minor .timeline-flow-label{ display:none; }

.timeline-flow-tooltip{
  display:none; position:absolute; top:100%; left:50%; transform:translateX(-50%); margin-top:.6rem;
  width:200px; background:var(--ink-2); border:1px solid var(--accent); border-radius:12px;
  padding:.8rem .9rem; font-size:.78rem; z-index:20; box-shadow:0 14px 30px -12px var(--shadow); text-align:left;
}
.timeline-flow-node.open .timeline-flow-tooltip{ display:block; }
.timeline-flow-tooltip .tt-title{ font-family:var(--serif); color:var(--paper); display:block; margin-bottom:.3rem; }
.timeline-flow-tooltip .tt-meta{ color:var(--accent); font-size:.7rem; text-transform:uppercase; letter-spacing:.08em; display:block; margin-bottom:.4rem; }

.timeline-legend{ display:flex; gap:1.4rem; justify-content:center; margin-top:1.6rem; font-size:.78rem; color:var(--muted); flex-wrap:wrap; }
.timeline-legend span{ display:inline-flex; align-items:center; gap:.4rem; }
.legend-dot{ width:10px; height:10px; border-radius:50%; background:var(--accent); display:inline-block; }
.legend-dot.minor{ background:var(--ink-3); border:2px solid var(--hairline); }

/* ---------- who said the quote ---------- */
.quiz-wrap{ max-width:640px; margin:0 auto; text-align:center; }
.quiz-quote{
  background:var(--ink-2); border:1px solid var(--hairline); border-radius:18px; padding:2.2rem;
  margin-bottom:1.6rem;
}
.quiz-quote blockquote{ font-family:var(--serif); font-style:italic; font-size:1.4rem; color:var(--paper); margin:0; }
.quiz-options{ display:grid; grid-template-columns:1fr 1fr; gap:.8rem; }
.quiz-option{
  padding:1rem; border-radius:12px; border:1px solid var(--hairline); background:var(--ink-2);
  color:var(--text); cursor:pointer; font-size:.95rem; transition:.15s;
}
.quiz-option:hover{ border-color:var(--accent); }
.quiz-option.correct{ border-color:#5fae7a; background:color-mix(in srgb,#5fae7a 18%, var(--ink-2)); }
.quiz-option.wrong{ border-color:#c9506f; background:color-mix(in srgb,#c9506f 18%, var(--ink-2)); }
.quiz-score{ margin-top:1.4rem; color:var(--muted); font-size:.88rem; }
.quiz-progress-label{ display:flex; justify-content:space-between; font-size:.76rem; color:var(--muted); margin-bottom:.4rem; }
.quiz-progress-track{ height:8px; border-radius:999px; background:var(--ink-3); border:1px solid var(--hairline); overflow:hidden; margin-bottom:1.6rem; }
.quiz-progress-fill{ height:100%; background:var(--accent); border-radius:999px; transition:width .25s ease; }

/* ---------- character overviews ---------- */
.character-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(170px,1fr)); gap:1.1rem; }
.character-card{
  background:var(--ink-2); border:1px solid var(--hairline); border-radius:var(--radius);
  padding:1rem; cursor:pointer; text-align:center; transition:transform .15s, border-color .15s;
}
.character-card:hover{ transform:translateY(-3px); border-color:var(--accent); }
.character-card h3{ font-size:.98rem; margin:.8rem 0 .2rem; color:var(--paper); }
.character-card .role{ font-size:.72rem; color:var(--muted); text-transform:uppercase; letter-spacing:.06em; }

.character-avatar{
  position:relative; width:100%; aspect-ratio:1; border-radius:12px; overflow:hidden;
  background:linear-gradient(160deg, var(--ink-3), var(--ink-2));
}
.character-avatar img{ width:100%; height:100%; object-fit:cover; display:block; }
.avatar-fallback{
  position:absolute; inset:0; display:flex; align-items:center; justify-content:center;
  font-family:var(--serif); font-size:1.7rem; color:var(--accent);
}
.character-detail-avatar .avatar-fallback{ font-size:2.6rem; }

.character-detail{ max-width:820px; margin:0 auto; }
.character-detail-head{ display:flex; gap:1.8rem; align-items:flex-start; margin-bottom:2.2rem; flex-wrap:wrap; }
.character-detail-avatar{ width:160px; flex-shrink:0; border-radius:14px; overflow:hidden; }
.character-detail-info{ flex:1; min-width:220px; }
.character-detail-info h2{ font-size:1.9rem; color:var(--paper); margin-bottom:.3rem; }
.character-detail-info .role{ color:var(--accent); text-transform:uppercase; font-size:.78rem; letter-spacing:.1em; display:block; margin-bottom:.9rem; }
.character-traits{ display:flex; gap:.5rem; flex-wrap:wrap; margin-top:.9rem; }
.trait-chip{ padding:.35rem .85rem; border-radius:999px; border:1px solid var(--hairline); font-size:.76rem; color:var(--text); }

.character-section{ margin-bottom:2.2rem; }
.character-section h3{ font-size:1.02rem; color:var(--paper); margin-bottom:.9rem; }
.character-quote-list{ display:flex; flex-direction:column; gap:.8rem; }
.character-quote{ background:var(--ink-2); border:1px solid var(--hairline); border-radius:12px; padding:1rem 1.2rem; }
.character-quote blockquote{ font-family:var(--serif); font-style:italic; color:var(--paper); margin:0; }
.character-quote .meta{ display:block; font-size:.74rem; color:var(--muted); margin-top:.5rem; }
.character-relationships{ display:flex; flex-direction:column; gap:.7rem; }
.relationship-item{ font-size:.9rem; color:var(--text); }
.relationship-item strong{ color:var(--paper); font-family:var(--serif); }

/* ---------- poetry ---------- */
body[data-poetry="true"]{ --accent:#7d8bc9; --accent-ink:#12142a; }

.poem-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(190px,1fr)); gap:1.1rem; }
.poem-card{
  background:var(--ink-2); border:1px solid var(--hairline); border-radius:var(--radius);
  padding:1.2rem 1.3rem; cursor:pointer; transition:transform .15s, border-color .15s;
}
.poem-card:hover{ transform:translateY(-3px); border-color:var(--accent); }
.poem-card h3{ font-size:1.02rem; color:var(--paper); margin:0 0 .3rem; }
.poem-card .poet{ font-size:.76rem; color:var(--muted); }
.poem-card .theme-tags{ display:flex; gap:.4rem; flex-wrap:wrap; margin-top:.8rem; }

.poem-detail{ max-width:820px; margin:0 auto; }
.poem-detail-head{ margin-bottom:1.6rem; }
.poem-detail-head h2{ font-size:1.9rem; color:var(--paper); margin-bottom:.2rem; }
.poem-detail-head .poet{ color:var(--accent); text-transform:uppercase; font-size:.78rem; letter-spacing:.1em; }

.poetry-showcase-chips{ display:flex; gap:.55rem; flex-wrap:wrap; margin:1.6rem 0 2rem; }
.poetry-chip{
  padding:.5rem 1rem; border-radius:999px; border:1px solid var(--hairline); background:var(--ink-2);
  font-size:.8rem; color:var(--muted);
}

/* ---------- poem full-text deep analysis ---------- */
.poem-text-wrap{ max-width:640px; margin:0 auto 6rem; }
.poem-text-head{ text-align:center; margin-bottom:2rem; }
.poem-text-head h2{ font-size:1.7rem; color:var(--paper); margin-bottom:.2rem; }
.poem-text-head .poet{ color:var(--accent); text-transform:uppercase; font-size:.78rem; letter-spacing:.1em; }

.poem-text{ font-family:var(--serif); font-size:1.15rem; line-height:1.9; color:var(--text); }
.poem-stanza{ margin-bottom:1.6rem; }
.poem-line{ white-space:pre-wrap; }

.poem-highlight{
  background:color-mix(in srgb, var(--accent) 22%, transparent);
  border-bottom:2px solid var(--accent); cursor:pointer; border-radius:3px; padding:0 .1em;
  transition:background .15s;
}
.poem-highlight:hover, .poem-highlight.active{ background:color-mix(in srgb, var(--accent) 42%, transparent); }

.poem-note-panel{
  position:fixed; left:0; right:0; bottom:0; max-height:48vh; overflow-y:auto;
  background:var(--ink-2); border-top:1px solid var(--accent); border-radius:18px 18px 0 0;
  padding:1.5rem 1.7rem 2.2rem; transform:translateY(105%); transition:transform .25s ease;
  z-index:70; box-shadow:0 -20px 50px -20px var(--shadow); max-width:640px; margin:0 auto;
}
.poem-note-panel.open{ transform:translateY(0); }
.poem-note-close{
  position:absolute; top:1rem; right:1.2rem; width:32px; height:32px; border-radius:50%;
  border:1px solid var(--hairline); background:transparent; color:var(--text); font-size:1.1rem; cursor:pointer;
}
.poem-note-close:hover{ border-color:var(--accent); color:var(--accent); }
.poem-note-phrase{ font-family:var(--serif); font-style:italic; color:var(--paper); font-size:1.1rem; display:block; margin-bottom:.7rem; padding-right:2rem; }
.poem-note-text{ color:var(--text); margin:0; }

/* ---------- leaderboard ---------- */
.leaderboard-wrap{ max-width:720px; margin:0 auto; }
.your-rank-banner{
  display:flex; align-items:center; justify-content:space-between; gap:1rem;
  background:var(--ink-2); border:1px solid var(--accent); border-radius:14px;
  padding:1.1rem 1.4rem; margin-bottom:2rem;
}
.your-rank-banner .rank-num{ font-family:var(--serif); font-size:1.6rem; color:var(--accent); }
.leaderboard-table{ width:100%; border-collapse:collapse; }
.leaderboard-table th{
  text-align:left; font-size:.72rem; text-transform:uppercase; letter-spacing:.08em; color:var(--muted);
  padding:.7rem .9rem; border-bottom:1px solid var(--hairline);
}
.leaderboard-table td{ padding:.9rem; border-bottom:1px solid var(--hairline); font-size:.92rem; }
.leaderboard-table tr:last-child td{ border-bottom:none; }
.leaderboard-table tr.you{ background:color-mix(in srgb, var(--accent) 10%, transparent); }
.rank-cell{ font-family:var(--serif); color:var(--paper); width:2.5rem; }
.rank-cell.top-1{ color:#e3b341; }
.rank-cell.top-2{ color:#c7c7d1; }
.rank-cell.top-3{ color:#c98a54; }
.username-cell{ color:var(--paper); font-weight:600; display:flex; align-items:center; gap:.6rem; }
.role-colored-name.gradient{
  background-image:var(--role-gradient); -webkit-background-clip:text; background-clip:text; color:transparent;
}
.role-badge-row{ display:flex; gap:.5rem; flex-wrap:wrap; margin-top:.7rem; }
.role-badge{
  padding:.3rem .8rem; border-radius:999px; font-size:.72rem; font-weight:600;
  border:1px solid color-mix(in srgb, var(--badge-color, var(--accent)) 55%, var(--hairline));
  color:var(--badge-color, var(--text));
}
.stat-cell{ color:var(--muted); }

/* ---------- friends ---------- */
.friends-wrap{ max-width:640px; margin:0 auto; }
.add-friend-form{ display:flex; gap:.7rem; margin-bottom:2.5rem; }
.add-friend-form input{
  flex:1; background:var(--ink-3); border:1px solid var(--hairline); border-radius:10px;
  padding:.7rem .9rem; color:var(--text); font-family:var(--body); font-size:.95rem;
}
.add-friend-form input:focus{ outline:none; border-color:var(--accent); }
.friends-section{ margin-bottom:2.4rem; }
.friends-section h3{ font-size:.95rem; color:var(--paper); margin-bottom:1rem; }
.friend-card{
  display:flex; align-items:center; justify-content:space-between; gap:1rem;
  background:var(--ink-2); border:1px solid var(--hairline); border-radius:12px;
  padding:.9rem 1.1rem; margin-bottom:.7rem;
}
.friend-card .name{ color:var(--paper); font-family:var(--serif); font-size:1.02rem; display:inline-flex; align-items:center; gap:.6rem; }
.friend-card .actions{ display:flex; gap:.5rem; }
.friend-card .btn{ padding:.45rem .9rem; font-size:.8rem; }

/* ---------- admin: roles ---------- */
.admin-wrap{ max-width:720px; margin:0 auto; }
.role-form{ display:grid; grid-template-columns:1fr 1fr 1fr auto; gap:.7rem; align-items:end; margin-bottom:2.5rem; }
.role-form .auth-field{ margin-bottom:0; }
.role-form input{
  background:var(--ink-3); border:1px solid var(--hairline); border-radius:10px; padding:.6rem .8rem;
  color:var(--text); font-family:var(--body); font-size:.88rem; width:100%;
}
.role-card{
  background:var(--ink-2); border:1px solid var(--hairline); border-radius:12px; padding:1.2rem 1.4rem; margin-bottom:1rem;
}
.role-card-head{ display:flex; align-items:center; justify-content:space-between; gap:1rem; margin-bottom:.9rem; }
.role-card-head .preview{ font-family:var(--serif); font-size:1.1rem; font-weight:700; }
.role-card-meta{ font-size:.76rem; color:var(--muted); }
.role-assign-row{ display:flex; gap:.6rem; margin-top:.8rem; }
.role-assign-row input{
  flex:1; background:var(--ink-3); border:1px solid var(--hairline); border-radius:10px; padding:.55rem .8rem;
  color:var(--text); font-family:var(--body); font-size:.85rem;
}
.role-members{ display:flex; gap:.5rem; flex-wrap:wrap; margin-top:.8rem; }
.role-member-chip{
  display:inline-flex; align-items:center; gap:.5rem; padding:.3rem .5rem .3rem .8rem; border-radius:999px;
  background:var(--ink-3); border:1px solid var(--hairline); font-size:.8rem;
}
.role-member-chip button{
  background:none; border:none; color:var(--muted); cursor:pointer; font-size:.9rem; line-height:1; padding:0 .2rem;
}
.role-member-chip button:hover{ color:#e0738a; }

/* ---------- achievements ---------- */
.achievements-section{ margin-top:1rem; }
.achievements-section h3{ font-size:1rem; color:var(--paper); margin-bottom:1rem; }
.achievement-grid{ display:flex; gap:.8rem; flex-wrap:wrap; }
.achievement-badge{
  width:64px; height:64px; border-radius:14px; background:var(--ink-2); border:1px solid var(--hairline);
  display:flex; align-items:center; justify-content:center; font-size:1.7rem; position:relative; cursor:default;
}
.achievement-badge:hover{ border-color:var(--accent); }
.achievement-badge .tooltip{
  display:none; position:absolute; bottom:calc(100% + .5rem); left:50%; transform:translateX(-50%);
  width:180px; background:var(--ink-2); border:1px solid var(--accent); border-radius:10px; padding:.7rem .8rem;
  font-size:.76rem; text-align:center; z-index:20; box-shadow:0 14px 30px -12px var(--shadow);
}
.achievement-badge .tooltip strong{ display:block; color:var(--paper); font-family:var(--serif); margin-bottom:.25rem; }
.achievement-badge:hover .tooltip{ display:block; }
.achievement-empty{ color:var(--muted); font-size:.85rem; }

footer.site-footer{ text-align:center; padding:2.5rem 1rem; color:var(--muted); font-size:.8rem; border-top:1px solid var(--hairline); margin-top:3rem; }

@media (max-width:640px){
  .quiz-options{ grid-template-columns:1fr; }
  .text-hero h1{ font-size:1.8rem; }
}
