/* AP101 自学门户 + 自学大纲页 · 同源样式（CSP 安全，无外部字体）。设计令牌与在线课程 app.css 保持一致。 */
:root{
  --bg:#f7f6f2; --bg-2:#efede6; --surface:#ffffff; --surface-2:#f4f2ec; --surface-3:#ebe8df;
  --ink:#1c1e22; --ink-2:#464b53; --ink-3:#737983; --ink-4:#9aa0a8;
  --line:#e3e0d6; --line-2:#d2cec1;
  --accent:#1f5f8b; --accent-2:#2c77ab; --accent-ink:#ffffff; --accent-soft:#e2edf5; --accent-softer:#f0f6fa;
  --ok:#2b7a4b; --ok-soft:#e3f2e8; --warn:#9a5b06; --warn-soft:#fbefd9; --bad:#b4372f; --bad-soft:#fbe7e4;
  --gold:#a8790b; --gold-soft:#f8efd6; --micro:#1f6f8b; --micro-soft:#e1f0f4; --macro:#4d4fa3; --macro-soft:#ecebf8;
  --code-bg:#f2f0e9; --mark:#fff2b8;
  --shadow-1:0 1px 2px rgba(20,24,30,.04),0 2px 8px rgba(20,24,30,.04);
  --shadow-2:0 2px 6px rgba(20,24,30,.05),0 12px 34px rgba(20,24,30,.09);
  --radius:14px; --radius-sm:9px; --maxw:1180px; --prose:46rem;
  --sans: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans CJK SC", "Source Han Sans SC", "Segoe UI", Roboto, sans-serif;
  --mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
  --ease: cubic-bezier(.2,.7,.2,1);
  color-scheme: light dark;
}
@media (prefers-color-scheme: dark){
  :root{
    --bg:#141619; --bg-2:#1a1d21; --surface:#1c1f24; --surface-2:#22262c; --surface-3:#2a2f36;
    --ink:#e8e6e1; --ink-2:#bcc0c6; --ink-3:#8d929a; --ink-4:#6c7178;
    --line:#2d3137; --line-2:#3a3f47;
    --accent:#7fb6dc; --accent-2:#9ccaea; --accent-ink:#0d1820; --accent-soft:#1b2b37; --accent-softer:#18222b;
    --ok:#79c597; --ok-soft:#18291f; --warn:#e3ac5c; --warn-soft:#2e2517; --bad:#ef8a80; --bad-soft:#331d1b;
    --gold:#e2bd5b; --gold-soft:#2e2814; --micro:#79c3d8; --micro-soft:#16282e; --macro:#a9abef; --macro-soft:#22223a;
    --code-bg:#20242a; --mark:#4a4220;
    --shadow-1:0 1px 2px rgba(0,0,0,.3); --shadow-2:0 8px 30px rgba(0,0,0,.35);
  }
}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-padding-top:80px;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(--ink);font:16px/1.75 var(--sans);text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline;text-underline-offset:3px}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:6px}
button,input{font:inherit;color:inherit}
.skip{position:absolute;left:-999px;top:0;background:var(--accent);color:var(--accent-ink);padding:.5rem 1rem;z-index:99;border-radius:0 0 8px 0}
.skip:focus{left:0}
.vh{position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
svg.ic{width:1.05em;height:1.05em;vertical-align:-.16em;flex:none;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.eyebrow{margin:0 0 .45rem;color:var(--accent);font-size:.78rem;font-weight:700;letter-spacing:.1em}
h1,h2,h3,h4{line-height:1.35;color:var(--ink)}

/* ---------- top bar ---------- */
.topbar{position:sticky;top:0;z-index:40;background:color-mix(in srgb,var(--bg) 86%,transparent);backdrop-filter:saturate(1.4) blur(12px);-webkit-backdrop-filter:saturate(1.4) blur(12px);border-bottom:1px solid var(--line)}
.topbar-inner{max-width:var(--maxw);margin:0 auto;padding:.55rem 1.25rem;display:flex;align-items:center;gap:.6rem;min-height:58px;font-size:.93rem}
.brand{display:inline-flex;align-items:center;gap:.5rem;font-weight:780;color:var(--ink);letter-spacing:.02em;white-space:nowrap}
.brand:hover{text-decoration:none;color:var(--accent)}
.brand-mark{width:1.9rem;height:1.9rem;border-radius:9px;display:grid;place-items:center;background:var(--accent);color:var(--accent-ink);font-size:.72rem;font-weight:850;letter-spacing:.03em}
.sep{color:var(--ink-4)}
.crumb{color:var(--ink-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.crumb.current{color:var(--ink);font-weight:600}
.topnav{display:flex;gap:.1rem;margin-left:auto}
.topnav a{padding:.4rem .7rem;border-radius:999px;color:var(--ink-2);white-space:nowrap}
.topnav a:hover{background:var(--surface-2);color:var(--ink);text-decoration:none}
.topnav a.active{color:var(--accent);background:var(--accent-soft);font-weight:600}
.top-cta{display:inline-flex;align-items:center;gap:.4rem;margin-left:auto;padding:.42rem .9rem;border-radius:999px;background:var(--accent);color:var(--accent-ink);font-weight:650;white-space:nowrap}
.topnav+.top-cta{margin-left:.4rem}
.top-cta:hover{text-decoration:none;background:var(--accent-2)}
@media (max-width: 980px){.topnav{display:none}.topnav+.top-cta{margin-left:auto}}

/* ---------- buttons & chips ---------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;padding:.62rem 1.1rem;border-radius:11px;border:1px solid var(--line-2);background:var(--surface);color:var(--ink);font-weight:650;font-size:.95rem;cursor:pointer;transition:background .15s,border-color .15s,box-shadow .15s,transform .1s;white-space:nowrap}
.btn:hover{border-color:var(--accent);color:var(--accent);text-decoration:none}
.btn:active{transform:translateY(1px)}
.btn-primary{background:var(--accent);border-color:var(--accent);color:var(--accent-ink)}
.btn-primary:hover{background:var(--accent-2);border-color:var(--accent-2);color:var(--accent-ink);box-shadow:0 6px 18px color-mix(in srgb,var(--accent) 28%,transparent)}
.btn-ghost{background:transparent;border-color:transparent;color:var(--ink-2)}
.btn-ghost:hover{background:var(--surface-2);border-color:transparent}
.btn-lg{padding:.85rem 1.45rem;font-size:1.04rem;border-radius:13px}
.chip{display:inline-flex;align-items:center;gap:.3rem;font-size:.78rem;line-height:1.5;padding:.14rem .6rem;border-radius:999px;background:var(--surface);border:1px solid var(--line);color:var(--ink-2);white-space:nowrap}
.chip.code{font-family:var(--mono);font-weight:650;color:var(--ink)}
.chip.accent{background:var(--accent-soft);border-color:transparent;color:var(--accent)}
.chip.online{background:var(--ok-soft);border-color:transparent;color:var(--ok);font-weight:650}
.chip.sg{background:var(--gold-soft);border-color:transparent;color:var(--gold);font-weight:650}
.chips{display:flex;flex-wrap:wrap;gap:.45rem;align-items:center;margin-bottom:1rem}

/* ---------- portal ---------- */
.portal{display:block}
.p-hero{position:relative;overflow:hidden;border-bottom:1px solid var(--line);background:radial-gradient(900px 420px at 85% -10%,color-mix(in srgb,var(--accent) 16%,transparent),transparent 60%),radial-gradient(700px 380px at -10% 110%,color-mix(in srgb,var(--gold) 14%,transparent),transparent 60%),var(--bg)}
.p-hero-in{max-width:var(--maxw);margin:0 auto;padding:4.2rem 1.25rem 3.4rem}
.p-hero h1{font-size:clamp(1.9rem,4.6vw,3.1rem);line-height:1.22;letter-spacing:-.015em;margin:.2rem 0 1rem;max-width:22em}
.p-hero .lede{font-size:clamp(1rem,1.6vw,1.13rem);color:var(--ink-2);max-width:44rem;margin:0 0 1.6rem}
.cta-row{display:flex;flex-wrap:wrap;gap:.7rem;margin-bottom:2.2rem}
.kpis{list-style:none;padding:0;margin:0;display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:.7rem;max-width:62rem}
.kpis li{background:color-mix(in srgb,var(--surface) 82%,transparent);border:1px solid var(--line);border-radius:var(--radius);padding:.75rem .9rem;display:flex;flex-direction:column;box-shadow:var(--shadow-1)}
.kpis b{font-size:1.55rem;line-height:1.15;font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.kpis span{font-size:.8rem;color:var(--ink-3)}
.sec{max-width:var(--maxw);margin:0 auto;padding:3.6rem 1.25rem 0}
.sec-head{max-width:46rem;margin-bottom:1.6rem}
.sec-head h2{font-size:clamp(1.45rem,3vw,2rem);margin:.1rem 0 .5rem;letter-spacing:-.01em}
.sec-head p{color:var(--ink-2);margin:0}

/* 在线课程卡 */
.oc-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1.1rem}
.oc{--oc:var(--micro);--oc-soft:var(--micro-soft);position:relative;background:var(--surface);border:1px solid var(--line);border-radius:20px;padding:1.5rem 1.5rem 1.3rem;box-shadow:var(--shadow-2);display:flex;flex-direction:column;gap:.75rem;overflow:hidden}
.oc.macro{--oc:var(--macro);--oc-soft:var(--macro-soft)}
.oc::before{content:"";position:absolute;inset:0 0 auto 0;height:5px;background:linear-gradient(90deg,var(--oc),color-mix(in srgb,var(--oc) 40%,var(--gold)))}
.oc-top{display:flex;align-items:center;justify-content:space-between;gap:.6rem}
.badge{display:inline-flex;align-items:center;gap:.35rem;font-size:.76rem;font-weight:700;padding:.18rem .6rem;border-radius:999px}
.badge.lockb{background:var(--oc-soft);color:var(--oc)}
.oc-code{font:700 .78rem var(--mono);color:var(--ink-3)}
.oc h3{margin:0;font-size:1.5rem;line-height:1.25}
.oc h3 .en{display:block;font-size:.88rem;font-weight:500;color:var(--ink-3);margin-top:.2rem}
.oc-tag{margin:0;color:var(--ink-2);font-size:.95rem}
.oc-stats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.45rem;margin:.2rem 0}
.oc-stats div{background:var(--oc-soft);border-radius:11px;padding:.5rem .7rem}
.oc-stats dt{font-size:.74rem;color:var(--ink-3)}
.oc-stats dd{margin:0;font-weight:800;font-size:1.2rem;font-variant-numeric:tabular-nums;color:var(--ink)}
.oc-stats dd small{font-size:.72rem;font-weight:500;color:var(--ink-3)}
.oc-feat{list-style:none;margin:.1rem 0;padding:0;display:flex;flex-direction:column;gap:.35rem;font-size:.9rem;color:var(--ink-2)}
.oc-feat li{display:flex;gap:.5rem;align-items:flex-start;line-height:1.55}
.oc-feat svg{color:var(--oc);margin-top:.2rem}
.oc-feat b{color:var(--ink)}
.oc-exam{display:flex;flex-wrap:wrap;gap:.3rem .8rem;align-items:center;font-size:.86rem;color:var(--ink-2);padding:.6rem .8rem;border-radius:11px;background:var(--surface-2)}
.cd-inline{font-weight:700;color:var(--oc)}
.oc-actions{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:auto;padding-top:.3rem}
.oc .btn-primary{background:var(--oc);border-color:var(--oc)}
.oc .btn-primary:hover{background:color-mix(in srgb,var(--oc) 85%,#000);border-color:transparent;box-shadow:0 6px 18px color-mix(in srgb,var(--oc) 30%,transparent)}
@media (prefers-color-scheme: dark){.oc .btn-primary{color:#0d1418}}
.soon-row{margin-top:1.4rem}
.soon-row h3{font-size:1rem;margin:0 0 .6rem;color:var(--ink-2)}
.soon-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:.8rem}
.soon{display:flex;flex-direction:column;gap:.2rem;background:var(--surface);border:1px dashed var(--line-2);border-radius:var(--radius);padding:.9rem 1.05rem;color:var(--ink)}
.soon:hover{text-decoration:none;border-color:var(--accent);border-style:solid}
.soon-k{font-size:.72rem;font-weight:700;color:var(--gold);letter-spacing:.05em}
.soon b{font-size:1.02rem}
.soon-s{font-size:.82rem;color:var(--ink-3)}
.soon-go{font-size:.84rem;color:var(--accent);margin-top:.2rem}

/* 路线图 */
.stepper{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:.7rem;counter-reset:s;position:relative}
.stepper li{position:relative;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:1rem .95rem 1.05rem;box-shadow:var(--shadow-1);display:flex;flex-direction:column;gap:.55rem}
.stepper li:not(:last-child)::after{content:"";position:absolute;top:1.65rem;right:-.75rem;width:.8rem;height:2px;background:var(--line-2)}
.st-no{width:2.1rem;height:2.1rem;border-radius:50%;display:grid;place-items:center;font-weight:800;background:var(--accent-soft);color:var(--accent);font-variant-numeric:tabular-nums}
.stepper li:nth-child(4) .st-no,.stepper li:nth-child(5) .st-no{background:var(--gold-soft);color:var(--gold)}
.stepper li:last-child .st-no{background:var(--ok-soft);color:var(--ok)}
.stepper b{font-size:.98rem;line-height:1.4}
.stepper p{margin:.25rem 0 0;font-size:.84rem;color:var(--ink-2);line-height:1.6}

/* 关键日期 */
.dates-wrap{display:grid;grid-template-columns:18rem minmax(0,1fr);gap:1.2rem;align-items:start}
.next-box{position:sticky;top:80px;background:linear-gradient(160deg,var(--accent) 0%,color-mix(in srgb,var(--accent) 70%,#000) 100%);color:var(--accent-ink);border-radius:20px;padding:1.4rem 1.3rem;box-shadow:var(--shadow-2);display:flex;flex-direction:column;gap:.3rem}
.nb-k{font-size:.78rem;opacity:.85;letter-spacing:.06em;font-weight:700}
.nb-days{font-size:2.8rem;line-height:1.05;font-weight:850;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.nb-days small{font-size:1rem;font-weight:600;margin-left:.2rem}
.nb-what{font-size:.92rem;line-height:1.5;opacity:.95}
.timeline{list-style:none;margin:0;padding:0;position:relative}
.timeline::before{content:"";position:absolute;left:.62rem;top:.6rem;bottom:.6rem;width:2px;background:var(--line)}
.ms{position:relative;display:grid;grid-template-columns:1.25rem 11.5rem minmax(0,1fr) auto;gap:.3rem .9rem;align-items:baseline;padding:.75rem .9rem .75rem .1rem;border-radius:12px;transition:opacity .2s}
.ms+.ms{margin-top:.2rem}
.ms-dot{width:1.25rem;height:1.25rem;border-radius:50%;background:var(--surface);border:3px solid var(--accent);position:relative;top:.22rem;z-index:1}
.ms-date{font:650 .88rem var(--mono);color:var(--ink-2);font-variant-numeric:tabular-nums}
.ms-body{display:flex;flex-direction:column;gap:.1rem}
.ms-body b{font-size:.98rem}
.ms-body span{font-size:.84rem;color:var(--ink-3)}
.ms-cd{font-size:.8rem;color:var(--ink-3);white-space:nowrap;font-variant-numeric:tabular-nums}
.ms.past{opacity:.45}
.ms.past .ms-dot{border-color:var(--ink-4);background:var(--surface-2)}
.ms.now{background:var(--accent-softer);outline:1px solid color-mix(in srgb,var(--accent) 30%,transparent)}
.ms.now .ms-dot{background:var(--accent)}
.ms.now .ms-cd{color:var(--accent);font-weight:700}

/* 方向 */
.dir-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}
.dir{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:1.1rem 1.15rem;box-shadow:var(--shadow-1);display:flex;flex-direction:column;gap:.6rem}
.dir header{display:flex;align-items:center;justify-content:space-between;gap:.6rem}
.dir h3{margin:0;font-size:1.12rem}
.years{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.5rem}
.years li{display:grid;grid-template-columns:3.7rem minmax(0,1fr);gap:.5rem;align-items:start}
.yr{font:700 .74rem var(--mono);color:var(--ink-3);padding-top:.28rem;letter-spacing:.03em}
.aps{display:flex;flex-wrap:wrap;gap:.35rem}
.ap{display:inline-flex;align-items:center;font-size:.82rem;padding:.16rem .55rem;border-radius:8px;background:var(--surface-2);border:1px solid var(--line);color:var(--ink-2);white-space:nowrap}
a.ap:hover{border-color:var(--accent);color:var(--accent);text-decoration:none}
.ap.core{font-weight:750;color:var(--ink);background:var(--accent-softer);border-color:color-mix(in srgb,var(--accent) 30%,var(--line))}
.ap.ext{border-style:dashed}
.dir-note{margin:.1rem 0 0;font-size:.82rem;color:var(--ink-3);line-height:1.6}
.foot-note{margin:1rem 0 0;font-size:.84rem;color:var(--ink-3);max-width:60rem}

/* 目录 */
.filter{position:sticky;top:58px;z-index:20;background:color-mix(in srgb,var(--bg) 94%,transparent);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);padding:.75rem 0 .55rem;margin-bottom:.4rem;display:flex;flex-direction:column;gap:.55rem}
.f-search{position:relative;max-width:34rem}
.f-search svg{position:absolute;left:.85rem;top:50%;transform:translateY(-50%);color:var(--ink-3)}
.f-search input{width:100%;padding:.68rem .9rem .68rem 2.4rem;border:1px solid var(--line-2);border-radius:12px;background:var(--surface);font-size:.98rem}
.f-search input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 22%,transparent)}
.f-chips,.f-toggles{display:flex;flex-wrap:wrap;gap:.35rem;align-items:center}
.f-lbl{font-size:.8rem;color:var(--ink-3);margin-right:.15rem}
.fchip,.ftog{border:1px solid var(--line);background:var(--surface);border-radius:999px;padding:.24rem .75rem;font-size:.82rem;color:var(--ink-2);cursor:pointer;white-space:nowrap}
.fchip:hover,.ftog:hover{border-color:var(--accent);color:var(--accent)}
.fchip[aria-pressed="true"]{background:var(--accent);border-color:var(--accent);color:var(--accent-ink);font-weight:650}
.ftog[aria-pressed="true"]{background:var(--accent-soft);border-color:transparent;color:var(--accent);font-weight:650}
.filter-note{margin:0;color:var(--ink-3);font-size:.82rem;min-height:1.2em}
.group{margin:1.6rem 0 0}
.group h3{font-size:1.08rem;margin:0 0 .75rem;display:flex;align-items:baseline;gap:.6rem}
.group .count{color:var(--ink-3);font-size:.84rem;font-weight:400}
.cards{list-style:none;padding:0;margin:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:.8rem}
.card a{display:flex;flex-direction:column;gap:.15rem;height:100%;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:.95rem 1.05rem;color:var(--ink);transition:border-color .15s,transform .18s var(--ease),box-shadow .18s}
.card a:hover{text-decoration:none;border-color:color-mix(in srgb,var(--accent) 55%,var(--line));transform:translateY(-2px);box-shadow:var(--shadow-2)}
.card-code{font:650 .78rem/1.4 var(--mono);color:var(--ink-3)}
.card-title{font-weight:680;font-size:1.04rem;line-height:1.4}
.card-en{color:var(--ink-3);font-size:.84rem}
.card-meta{margin-top:.55rem;display:flex;flex-wrap:wrap;gap:.35rem;font-size:.75rem}
.card-meta span{background:var(--surface-2);color:var(--ink-2);padding:.12rem .5rem;border-radius:6px;white-space:nowrap}
.card-meta .b-online{background:var(--ok-soft);color:var(--ok);font-weight:700}
.card-meta .b-sg{background:var(--gold-soft);color:var(--gold);font-weight:700}
.card-meta .b-core{background:var(--accent-soft);color:var(--accent);font-weight:650}
.card.hidden,.group.hidden{display:none}
.empty-note{color:var(--ink-3);text-align:center;padding:2rem 0}

/* FAQ */
.faq{display:flex;flex-direction:column;gap:.6rem;max-width:52rem}
.faq details{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-1);transition:border-color .15s}
.faq details[open]{border-color:color-mix(in srgb,var(--accent) 35%,var(--line))}
.faq summary{cursor:pointer;list-style:none;padding:.95rem 1.15rem;font-weight:650;display:flex;justify-content:space-between;gap:1rem;align-items:center}
.faq summary::-webkit-details-marker{display:none}
.faq summary::after{content:"+";font-size:1.3rem;line-height:1;color:var(--ink-3);transition:transform .2s;flex:none}
.faq details[open] summary::after{transform:rotate(45deg);color:var(--accent)}
.faq p{margin:0;padding:0 1.15rem 1.05rem;color:var(--ink-2);font-size:.94rem;line-height:1.8}

/* 资源 */
.res-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.8rem;margin-bottom:3.6rem}
.res{display:flex;flex-direction:column;gap:.25rem;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:1rem 1.1rem;color:var(--ink);box-shadow:var(--shadow-1);transition:border-color .15s,transform .18s var(--ease)}
.res:hover{text-decoration:none;border-color:var(--accent);transform:translateY(-2px)}
.res b{display:flex;align-items:center;gap:.4rem}
.res b svg{color:var(--ink-3)}
.res span{font-size:.88rem;color:var(--ink-2)}
.res small{font-family:var(--mono);font-size:.74rem;color:var(--ink-3)}

/* ---------- course page ---------- */
.course{max-width:var(--maxw);margin:0 auto;padding:2rem 1.25rem 3rem}
.hero{max-width:60rem;margin-bottom:1.5rem}
.hero h1{font-size:clamp(1.7rem,3.6vw,2.4rem);margin:.1rem 0 .9rem;letter-spacing:-.01em}
.hero h1 .en{display:block;font-size:.5em;font-weight:500;color:var(--ink-3);letter-spacing:0;margin-top:.3rem}
.online-band{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;margin:0 0 1rem;padding:1rem 1.2rem;border-radius:16px;background:linear-gradient(135deg,var(--micro-soft),var(--surface));border:1px solid color-mix(in srgb,var(--micro) 35%,var(--line));color:var(--ink);box-shadow:var(--shadow-1)}
.online-band.macro{background:linear-gradient(135deg,var(--macro-soft),var(--surface));border-color:color-mix(in srgb,var(--macro) 35%,var(--line))}
.online-band:hover{text-decoration:none;box-shadow:var(--shadow-2)}
.ob-text{display:flex;flex-direction:column;gap:.2rem;min-width:0}
.ob-k{font-size:.82rem;color:var(--ink-2);display:inline-flex;align-items:center;gap:.35rem}
.ob-text b{font-size:.98rem}
.ob-go{display:inline-flex;align-items:center;gap:.4rem;padding:.55rem 1rem;border-radius:11px;background:var(--micro);color:#fff;font-weight:700;white-space:nowrap}
.online-band.macro .ob-go{background:var(--macro)}
@media (prefers-color-scheme: dark){.ob-go{color:#0d1418}}
.sg-note,.old-note{display:flex;gap:.6rem;align-items:flex-start;margin:0 0 1rem;padding:.75rem 1rem;border-radius:12px;font-size:.9rem}
.sg-note{background:var(--gold-soft);color:var(--ink-2)}
.old-note{background:var(--surface-2);color:var(--ink-2);border:1px solid var(--line)}
.sg-note p,.old-note p{margin:0}
.sg-note svg{color:var(--gold);margin-top:.25rem}
.old-note svg{color:var(--ink-3);margin-top:.25rem}
.meta{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:.2rem 1rem}
.meta summary{cursor:pointer;padding:.6rem 0;font-weight:650;color:var(--ink-2)}
.meta dl{margin:0 0 .6rem;display:grid;grid-template-columns:1fr;gap:0}
.meta-row{display:grid;grid-template-columns:9.5rem 1fr;gap:1rem;padding:.45rem 0;border-top:1px solid var(--line);font-size:.92rem}
.meta-row dt{color:var(--ink-3)} .meta-row dd{margin:0}
.layout{display:grid;grid-template-columns:16rem minmax(0,1fr);gap:2.5rem;align-items:start}
.toc{position:sticky;top:72px;max-height:calc(100vh - 88px);overflow:auto;font-size:.86rem;padding-right:.25rem}
.toc-box summary{cursor:pointer;font-weight:650;color:var(--ink-2);padding:.3rem 0;list-style:none}
.toc-box summary::-webkit-details-marker{display:none}
.toc ol{list-style:none;margin:.4rem 0 0;padding:0;border-left:1px solid var(--line)}
.toc li a{display:block;padding:.22rem .75rem;color:var(--ink-3);line-height:1.45;border-left:2px solid transparent;margin-left:-1px}
.toc li.l3 a{padding-left:1.6rem;font-size:.82rem}
.toc li a:hover{color:var(--ink);text-decoration:none}
.toc li a.active{color:var(--accent);border-left-color:var(--accent);font-weight:600}

/* prose */
.prose{min-width:0;max-width:var(--prose);line-height:1.85}
.prose h2{font-size:1.45rem;margin:2.6rem 0 .9rem;padding-top:.9rem;border-top:1px solid var(--line)}
.prose h2:first-child{margin-top:0}
.prose h3{font-size:1.15rem;margin:2rem 0 .6rem}
.prose h4{font-size:1rem;margin:1.5rem 0 .5rem}
.prose p,.prose ul,.prose ol{margin:.7rem 0}
.prose ul,.prose ol{padding-left:1.4rem}
.prose li{margin:.25rem 0}
.prose li>ul,.prose li>ol{margin:.2rem 0}
.prose strong{font-weight:650}
.prose blockquote{margin:1rem 0;padding:.75rem 1.1rem;background:var(--surface);border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:0 var(--radius-sm) var(--radius-sm) 0;color:var(--ink-2)}
.prose blockquote p{margin:.35rem 0}
.prose hr{border:0;border-top:1px solid var(--line);margin:2rem 0}
.prose code{font-family:var(--mono);font-size:.86em;background:var(--code-bg);padding:.1em .35em;border-radius:4px}
.prose a.lesson-link{background:var(--micro-soft);border-radius:6px;padding:0 .3rem}
.link-text{color:var(--ink-2)}
.math-display{overflow-x:auto;overflow-y:hidden;margin:1rem 0;padding:.4rem 0}
.code{position:relative;margin:1rem 0}
.code pre{margin:0;background:var(--code-bg);border:1px solid var(--line);border-radius:var(--radius-sm);padding:1rem 1.1rem;overflow:auto;font-size:.86rem;line-height:1.6;white-space:pre-wrap;word-break:break-word}
.code pre code{background:none;padding:0;font-size:inherit}
.copy{position:absolute;top:.45rem;right:.45rem;font:600 .75rem var(--sans);color:var(--ink-2);background:var(--surface);border:1px solid var(--line-2);border-radius:6px;padding:.2rem .55rem;cursor:pointer;opacity:.85}
.copy:hover{opacity:1;border-color:var(--accent);color:var(--accent)}
.copy.done{color:var(--ok);border-color:var(--ok)}
.table-wrap{overflow-x:auto;margin:1rem 0;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface)}
.table-wrap table{border-collapse:collapse;width:100%;font-size:.88rem;line-height:1.6}
.table-wrap th,.table-wrap td{padding:.55rem .75rem;border-bottom:1px solid var(--line);text-align:left;vertical-align:top;min-width:6rem}
.table-wrap th{background:var(--surface-2);font-weight:650;white-space:nowrap;position:sticky;top:0}
.table-wrap tr:last-child td{border-bottom:0}
.prose li.task{list-style:none;margin-left:-1.4rem;display:flex;gap:.5rem}
.prose li.task .box{flex:none;width:1em;height:1em;margin-top:.35em;border:1.5px solid var(--ink-3);border-radius:3px;font-size:.8em;line-height:1;text-align:center}
.katex{font-size:1.05em}
.pager{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin:3rem 0 0;padding-top:1.5rem;border-top:1px solid var(--line)}
.pager a{display:block;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:.8rem 1rem;color:var(--ink)}
.pager a:hover{border-color:var(--accent);text-decoration:none}
.pager a span{display:block;font-size:.78rem;color:var(--ink-3)}
.pager .next{text-align:right}

/* footer */
.site-footer{border-top:1px solid var(--line);margin-top:2rem;background:var(--bg-2)}
.footer-inner{max-width:var(--maxw);margin:0 auto;padding:1.6rem 1.25rem 2.6rem;color:var(--ink-3);font-size:.82rem}
.footer-inner p{margin:.3rem 0}
.footer-inner b{color:var(--ink-2)}

/* responsive */
@media (max-width: 1100px){
  .stepper{grid-template-columns:repeat(3,minmax(0,1fr))}
  .stepper li:nth-child(3)::after{display:none}
  .dir-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .kpis{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media (max-width: 960px){
  .layout{grid-template-columns:1fr;gap:1rem}
  .toc{position:static;max-height:none;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:.4rem 1rem}
  .toc-box summary{list-style:revert}
  .prose{max-width:none}
  .oc-grid{grid-template-columns:1fr}
  .dates-wrap{grid-template-columns:1fr}
  .next-box{position:static}
  .res-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width: 640px){
  body{font-size:15.5px}
  .p-hero-in{padding:2.6rem 1rem 2.4rem}
  .br-wide{display:none}
  .kpis{grid-template-columns:repeat(2,minmax(0,1fr));gap:.5rem}
  .kpis b{font-size:1.3rem}
  .sec{padding:2.8rem 1rem 0}
  .oc{padding:1.2rem 1.05rem 1.1rem;border-radius:16px}
  .oc-stats{grid-template-columns:repeat(2,minmax(0,1fr))}
  .stepper{grid-template-columns:1fr;gap:0}
  .stepper li{flex-direction:row;gap:.8rem;border-radius:0;border-width:0 0 0 2px;border-color:var(--line);box-shadow:none;background:transparent;padding:.2rem 0 1.1rem 1.1rem;margin-left:1rem}
  .stepper li .st-no{position:absolute;left:-1.1rem;top:0;box-shadow:0 0 0 4px var(--bg)}
  .stepper li:not(:last-child)::after{display:none}
  .stepper li>div{padding-left:.6rem}
  .ms{grid-template-columns:1.25rem minmax(0,1fr);padding:.6rem .5rem .6rem .1rem}
  .ms-date,.ms-body,.ms-cd{grid-column:2}
  .ms-cd{margin-top:.1rem}
  .dir-grid{grid-template-columns:1fr}
  .res-grid{grid-template-columns:1fr}
  .meta-row{grid-template-columns:1fr;gap:.1rem}
  .pager{grid-template-columns:1fr}
  .pager .next{text-align:left}
  .filter{position:static;padding-top:.3rem}
  .f-chips,.f-toggles{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;padding-bottom:.1rem}
  .f-chips::-webkit-scrollbar,.f-toggles::-webkit-scrollbar{display:none}
  .fchip,.ftog,.f-lbl{flex:none}
  .top-cta{padding:.4rem .75rem;font-size:.86rem}
  .course{padding:1.4rem 1rem 3rem}
}
@media print{
  .topbar,.toc,.filter,.copy,.pager,.site-footer,.cta-row,.top-cta{display:none}
  .layout{display:block} body{background:#fff}
}
.chip,.card-meta span,.copy,.kpis span,.badge,.fchip,.ftog{white-space:nowrap}
