/* Accessibility — focus indicator (WCAG 2.4.7 Level AA). Without this,
   keyboard users can't see which control they've tabbed to. Browser
   defaults disappear against custom button styling on the warm-paper
   palette. :focus-visible avoids the ring on mouse clicks. Both apps
   import this file. */
:focus-visible {
  outline: 2px solid var(--accent, #a8442a);
  outline-offset: 2px;
  border-radius: 4px;
}

:root{
  /* Warm "paper and ink" palette. The dark variant under
     :root[data-theme="dark"] mirrors each hue (NOT a black/grey flip) —
     same hue families, inverted luminance. The early-paint script in each
     HTML <head> sets data-theme from localStorage + prefers-color-scheme. */
  --paper:#f4ecdd;
  --paper-deep:#ece0c9;
  --paper-translucent:rgba(244,236,221,.86);
  --appbar-bg:rgba(244,236,221,.92);
  --accent-tint:rgba(168,68,42,.08);
  --accent-tint-strong:rgba(168,68,42,.12);
  --ink:#2a2622;
  --ink-soft:#5d564c;
  --rule:#d8c9a9;
  --accent:#a8442a;          /* terracotta */
  --accent-soft:#c2724f;
  --vocab:#1f5e54;           /* deep teal for vocab */
  --vocab-tint:rgba(31,94,84,.10);
  --vocab-tint-strong:rgba(31,94,84,.16);
  --vocab-tint-hover:rgba(31,94,84,.22);
  --vocab-loading:rgba(31,94,84,.08);
  --hl:#f6d365;              /* highlighter amber */
  --hl-edge:#e9b53c;
  --hl-stop:#f3c84a;
  --hl-fg:#2a2014;           /* dark text on highlighter — stays dark in both modes */
  --hl-hover:rgba(233,181,60,.18);
  --card:#fbf6ec;            /* raised surface — one elevation up from paper */
  --warn-bg:#fbeee6;
  --warn-fg:#8a3a23;
  --seg-active:#6b4f2a;       /* warm wood — segmented "on" state, save-button border */
  --seg-active-fg:#f4ecdd;
  --success:#2f7d32;          /* "saved" green */
  --success-fg:#ffffff;
  --banner-bg:#fff7e3;        /* attention banner — Save-all */
  --progress-bg:#ede1c4;      /* in-progress saving */
  --progress-edge:#c9a35a;
  --shadow-rgb:42,38,34;     /* warm dark for box-shadows */
  --body-wash:rgba(168,68,42,.06); /* subtle terracotta wash in body bg */
  --body-light:rgba(255,255,255,.45); /* corner highlight in body bg */
  --noise-opacity:.04;       /* SVG noise overlay opacity */
}

:root[data-theme="dark"]{
  /* Candlelit-leather-notebook dark mode. Same hue families as light,
     luminance flipped. Accent + vocab get a luminance boost so they pop
     against the dark paper without losing identity. Highlighter slightly
     darkened to avoid retina blowout. */
  --paper:#1c1813;
  --paper-deep:#13110e;
  --paper-translucent:rgba(28,24,19,.86);
  --appbar-bg:rgba(28,24,19,.92);
  --accent-tint:rgba(224,140,99,.10);
  --accent-tint-strong:rgba(224,140,99,.16);
  --ink:#ece1cf;
  --ink-soft:#a89c87;
  --rule:#3d342a;
  --accent:#e08c63;
  --accent-soft:#f0a988;
  --vocab:#5fc9b6;
  --vocab-tint:rgba(95,201,182,.12);
  --vocab-tint-strong:rgba(95,201,182,.20);
  --vocab-tint-hover:rgba(95,201,182,.28);
  --vocab-loading:rgba(95,201,182,.10);
  --hl:#c9a242;
  --hl-edge:#a88433;
  --hl-stop:#a88030;
  --hl-fg:#1a1408;           /* still dark — amber stays light enough */
  --hl-hover:rgba(201,162,66,.22);
  --card:#27211b;
  --warn-bg:#3a221a;
  --warn-fg:#f0a988;
  --seg-active:#d4ad6e;       /* warm wood, brightened for dark */
  --seg-active-fg:#1c1813;
  --success:#4eb853;          /* brightened green so it pops on dark */
  --success-fg:#0a1a0c;
  --banner-bg:#2d2418;        /* warm dark amber banner */
  --progress-bg:#3a2f1f;
  --progress-edge:#8a6f30;
  --shadow-rgb:0,0,0;
  --body-wash:rgba(224,140,99,.05);
  --body-light:rgba(255,235,200,.04);
  --noise-opacity:.06;
}

*{box-sizing:border-box;}
html,body{margin:0;padding:0;}
body{
  background:
    radial-gradient(circle at 18% 12%, var(--body-light), transparent 38%),
    radial-gradient(circle at 85% 90%, var(--body-wash), transparent 45%),
    var(--paper);
  color:var(--ink);
  font-family:"Noto Serif TC", serif;
  -webkit-font-smoothing:antialiased;
  min-height:100vh;
}
body::before{
  content:"";position:fixed;inset:0;pointer-events:none;z-index:0;opacity:var(--noise-opacity);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
}
.wrap{position:relative;z-index:1;max-width:760px;margin:0 auto;padding:0 20px 180px;}

/* Default link color — keep links themed (NOT browser default blue) anywhere
   that doesn't have its own override. Pages that want a different link color
   (.kicker a, .invite a, .defcard, etc.) still win at higher specificity. */
a{color:var(--accent);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px;}
a:hover{color:var(--accent-soft);}

header{padding:34px 0 18px;}
.kicker{
  font-family:"Newsreader",serif;font-style:italic;font-size:15px;letter-spacing:.02em;
  color:var(--accent);margin-bottom:6px;
}
.kicker a{color:inherit;text-decoration:none;border-bottom:1px dotted var(--accent-soft);}
h1{
  font-family:"Noto Serif TC",serif;font-weight:700;font-size:34px;line-height:1.2;
  margin:0 0 4px;letter-spacing:.04em;
}
.sub{font-family:"Newsreader",serif;color:var(--ink-soft);font-size:15px;margin:0;}

/* ---------- article picker ---------- */
.cards{display:flex;flex-direction:column;gap:16px;margin-top:8px;}
a.card{
  display:block;text-decoration:none;color:inherit;
  background:var(--card);border:1px solid var(--rule);border-radius:14px;
  padding:18px 20px;box-shadow:0 6px 22px -16px rgba(var(--shadow-rgb),.5);
  transition:.18s;
}
a.card:hover{border-color:var(--accent-soft);transform:translateY(-2px);
  box-shadow:0 12px 28px -16px rgba(var(--shadow-rgb),.55);}
a.card .ckicker{font-family:"Newsreader",serif;font-style:italic;font-size:13px;color:var(--accent);}
a.card h2{font-family:"Noto Serif TC",serif;font-weight:700;font-size:26px;margin:4px 0 6px;letter-spacing:.03em;}
a.card .cblurb{font-family:"Newsreader",serif;font-size:14.5px;color:var(--ink-soft);line-height:1.5;margin:0;}
a.card .meta{margin-top:10px;font-family:"Newsreader",serif;font-size:12.5px;color:var(--accent-soft);
  display:flex;gap:14px;}
.empty{font-family:"Newsreader",serif;color:var(--ink-soft);font-style:italic;margin-top:20px;}

/* ---------- controls ---------- */
.panel{
  position:sticky;top:0;z-index:30;margin:14px 0 26px;
  background:var(--paper-translucent);backdrop-filter:blur(8px);
  border:1px solid var(--rule);border-radius:14px;
  box-shadow:0 6px 22px -14px rgba(var(--shadow-rgb),.5);
  padding:12px 14px;
}
.row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.row + .row{margin-top:10px;}
button.ctrl{
  font-family:"Newsreader",serif;font-size:15px;cursor:pointer;
  border:1px solid var(--rule);background:var(--card);color:var(--ink);
  padding:9px 16px;border-radius:10px;transition:.18s;
  display:inline-flex;align-items:center;gap:7px;
}
button.ctrl:hover{border-color:var(--accent-soft);color:var(--accent);}
button.ctrl:active{transform:translateY(1px);}
button.primary{background:var(--accent);color:var(--card);border-color:var(--accent);}
button.primary:hover{background:var(--accent-soft);color:var(--paper);}
button.ctrl[disabled]{opacity:.4;cursor:not-allowed;}
.seg-ctrl{display:flex;align-items:center;gap:8px;flex:1;min-width:170px;}
label.lbl{font-family:"Newsreader",serif;font-size:13px;color:var(--ink-soft);white-space:nowrap;}
input[type=range]{flex:1;accent-color:var(--accent);min-width:90px;}
select{
  font-family:"Newsreader",serif;font-size:13px;color:var(--ink);
  background:var(--card);border:1px solid var(--rule);border-radius:8px;padding:6px 8px;max-width:100%;
}
.rate-val{font-family:"Newsreader",serif;font-size:13px;color:var(--accent);min-width:34px;text-align:right;}
.spin{
  display:inline-block;width:13px;height:13px;border:2px solid var(--accent-soft);
  border-top-color:transparent;border-radius:50%;animation:sp .7s linear infinite;vertical-align:-2px;
}
@keyframes sp{to{transform:rotate(360deg);}}

.notice{
  background:var(--warn-bg);border:1px solid var(--accent-soft);color:var(--warn-fg);
  border-radius:10px;padding:10px 12px;font-family:"Newsreader",serif;font-size:14px;
  margin-top:10px;display:none;
}

/* ---------- article body ---------- */
.divider{display:flex;align-items:center;gap:14px;margin:26px 4px;color:var(--rule);}
.divider::before,.divider::after{content:"";height:1px;background:var(--rule);flex:1;}
.divider span{font-family:"Newsreader",serif;font-style:italic;font-size:12px;color:var(--accent-soft);letter-spacing:.18em;}

p.para{margin:0 0 22px;line-height:2.15;font-size:20px;position:relative;padding-left:34px;}
.pnum{
  position:absolute;left:0;top:4px;font-family:"Newsreader",serif;font-style:italic;
  font-size:14px;color:var(--accent-soft);
}
.seg{border-radius:5px;transition:background .25s,color .25s,box-shadow .25s;padding:1px 0;cursor:pointer;}
.seg:hover{background:var(--hl-hover);}
.seg.loading{background:var(--vocab-loading);box-shadow:inset 0 -2px 0 var(--vocab);}
.seg.active{
  background:linear-gradient(180deg,var(--hl) 0%, var(--hl-stop) 100%);
  box-shadow:0 0 0 1px var(--hl-edge), 0 2px 0 var(--hl-edge);
  color:var(--hl-fg);
}
.vocab{
  color:var(--vocab);background:var(--vocab-tint);
  border-bottom:2px dotted var(--vocab);border-radius:3px 3px 0 0;
  padding:0 1px;cursor:pointer;
}
.seg.active .vocab{background:var(--vocab-tint-strong);}
.vocab:hover{background:var(--vocab-tint-hover);}

/* ---------- definition card ---------- */
.defcard{
  position:fixed;left:50%;bottom:18px;transform:translate(-50%,140%);
  width:min(560px,calc(100% - 32px));z-index:40;
  background:var(--card);border:1px solid var(--rule);
  border-radius:16px;box-shadow:0 18px 50px -18px rgba(var(--shadow-rgb),.65);
  padding:18px 20px;transition:transform .32s cubic-bezier(.2,.8,.25,1);
}
.defcard.show{transform:translate(-50%,0);}
.defcard .han{font-size:30px;font-weight:700;letter-spacing:.04em;}
.defcard .alt{font-size:15px;color:var(--ink-soft);margin-left:8px;}
.defcard .py{font-family:"Newsreader",serif;font-style:italic;font-size:18px;color:var(--accent);margin:6px 0 8px;}
.defcard .en{font-family:"Newsreader",serif;font-size:16px;line-height:1.45;color:var(--ink);}
.defcard .close{
  position:absolute;top:10px;right:12px;border:none;background:none;cursor:pointer;
  font-size:22px;color:var(--ink-soft);line-height:1;
}
.legend{font-family:"Newsreader",serif;font-size:13px;color:var(--ink-soft);margin-top:10px;display:flex;gap:16px;flex-wrap:wrap;}
.legend i{font-style:normal;}
.swatch{display:inline-block;width:13px;height:13px;border-radius:3px;vertical-align:-2px;margin-right:5px;}

/* estimated-level footnote, shown only on our own (non-GLOSS) homework articles */
.levelnote{
  font-family:"Newsreader",serif;font-style:italic;font-size:14px;line-height:1.6;
  color:var(--ink-soft);border-top:1px solid var(--rule);margin-top:30px;padding-top:14px;
}
