@font-face{font-family:"IBM Plex Sans";src:url(fonts/ibm-plex-sans-latin-400-normal.woff2) format("woff2");font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:"IBM Plex Sans";src:url(fonts/ibm-plex-sans-latin-500-normal.woff2) format("woff2");font-weight:500;font-style:normal;font-display:swap}
@font-face{font-family:"IBM Plex Sans";src:url(fonts/ibm-plex-sans-latin-600-normal.woff2) format("woff2");font-weight:600;font-style:normal;font-display:swap}
@font-face{font-family:"IBM Plex Sans";src:url(fonts/ibm-plex-sans-latin-700-normal.woff2) format("woff2");font-weight:700;font-style:normal;font-display:swap}
@font-face{font-family:"IBM Plex Sans";src:url(fonts/ibm-plex-sans-latin-400-italic.woff2) format("woff2");font-weight:400;font-style:italic;font-display:swap}
@font-face{font-family:"IBM Plex Mono";src:url(fonts/ibm-plex-mono-latin-400-normal.woff2) format("woff2");font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:"IBM Plex Mono";src:url(fonts/ibm-plex-mono-latin-500-normal.woff2) format("woff2");font-weight:500;font-style:normal;font-display:swap}
@font-face{font-family:"IBM Plex Mono";src:url(fonts/ibm-plex-mono-latin-600-normal.woff2) format("woff2");font-weight:600;font-style:normal;font-display:swap}
@font-face{font-family:"IBM Plex Serif";src:url(fonts/ibm-plex-serif-latin-400-normal.woff2) format("woff2");font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:"IBM Plex Sans Arabic";src:url(fonts/ibm-plex-sans-arabic-arabic-400-normal.woff2) format("woff2");font-weight:400;font-style:normal;font-display:swap;unicode-range:U+0600-06FF,U+0750-077F,U+0870-088E,U+0890-0891,U+0898-08E1,U+08E3-08FF,U+200C-200E,U+2010-2011,U+204F,U+2E41,U+FB50-FDFF,U+FE70-FE74,U+FE76-FEFC;size-adjust:106%}
@font-face{font-family:"IBM Plex Sans Arabic";src:url(fonts/ibm-plex-sans-arabic-arabic-500-normal.woff2) format("woff2");font-weight:500;font-style:normal;font-display:swap;unicode-range:U+0600-06FF,U+0750-077F,U+0870-088E,U+0890-0891,U+0898-08E1,U+08E3-08FF,U+200C-200E,U+2010-2011,U+204F,U+2E41,U+FB50-FDFF,U+FE70-FE74,U+FE76-FEFC;size-adjust:106%}
@font-face{font-family:"IBM Plex Sans Arabic";src:url(fonts/ibm-plex-sans-arabic-arabic-600-normal.woff2) format("woff2");font-weight:600;font-style:normal;font-display:swap;unicode-range:U+0600-06FF,U+0750-077F,U+0870-088E,U+0890-0891,U+0898-08E1,U+08E3-08FF,U+200C-200E,U+2010-2011,U+204F,U+2E41,U+FB50-FDFF,U+FE70-FE74,U+FE76-FEFC;size-adjust:106%}
@font-face{font-family:"IBM Plex Sans Arabic";src:url(fonts/ibm-plex-sans-arabic-arabic-700-normal.woff2) format("woff2");font-weight:700;font-style:normal;font-display:swap;unicode-range:U+0600-06FF,U+0750-077F,U+0870-088E,U+0890-0891,U+0898-08E1,U+08E3-08FF,U+200C-200E,U+2010-2011,U+204F,U+2E41,U+FB50-FDFF,U+FE70-FE74,U+FE76-FEFC;size-adjust:106%}
/* Study-guide kit v9 — one stylesheet for chapter pages and the library home.
   Calm layer: colour only where it means something (section hue on header band, rail, heading marks, timeline
   markers; box type = white card + thin stripe + coloured label; only danger tinted). Raised press shadow on
   clickables only. One family (IBM Plex Sans + IBM Plex Sans Arabic); mono for numbers and codes only. Icons: Phosphor bold, 16px.
   v9: logical properties throughout (RTL mirrors by itself); Arabic typography under :lang(ar). */
:root{
  --font-sans:"IBM Plex Sans","IBM Plex Sans Arabic",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  --font-mono:"IBM Plex Mono","IBM Plex Sans Arabic",ui-monospace,Consolas,monospace;
  --font-serif:"IBM Plex Serif",Georgia,serif;
  --measure:46rem;--bar-h:56px;--r:10px;--r-s:8px;
  --s1:4px;--s2:8px;--s3:12px;--s4:16px;--s5:24px;--s6:36px;--s7:52px;--s8:88px;
  /* tone ramp: L strong, Ls soft fill, Ll line, Lt text */
  --L:.52;--Ls:.965;--Ll:.86;--Lt:.42;
  --ground:#F4F6F9;--surface:#FFFFFF;--surface-2:#EEF1F5;--ink:#151821;--muted:#596173;--hair:#E0E4EB;--hair-2:#ECEFF4;
  --accent:oklch(.5 .17 262);--accent-ink:#fff;--mark:oklch(.9 .07 262);
  --ok:oklch(.52 .14 155);--ok-s:oklch(.965 .03 155);--ok-l:oklch(.86 .07 155);
  --no:oklch(.52 .19 25);--no-s:oklch(.965 .03 25);--no-l:oklch(.86 .08 25);
  --press:0 2px 0 rgba(20,24,33,.14);--lift:0 1px 2px rgba(20,24,33,.06),0 4px 14px rgba(20,24,33,.06);
  --band-ink:#fff;--ease:cubic-bezier(.2,.7,.2,1);
  color-scheme:light;
}
:root[data-mode="lightbox"]{
  --L:.76;--Ls:.25;--Ll:.42;--Lt:.86;
  --ground:#0E1116;--surface:#161B22;--surface-2:#1D232C;--ink:#E8EBF0;--muted:#9BA4B4;--hair:#2A3341;--hair-2:#202733;
  --accent:oklch(.78 .12 250);--accent-ink:#0E1116;--mark:oklch(.4 .09 262);
  --ok:oklch(.76 .13 155);--ok-s:oklch(.27 .04 155);--ok-l:oklch(.45 .08 155);
  --no:oklch(.74 .15 25);--no-s:oklch(.27 .05 25);--no-l:oklch(.45 .09 25);
  --press:0 2px 0 rgba(0,0,0,.55);--lift:0 1px 0 rgba(0,0,0,.4),0 6px 18px rgba(0,0,0,.3);
  --band-ink:#0E1116;--Lb:.72;--Ck:.78;
  color-scheme:dark;
}
/* semantic hues for tags, comparison panels and the colour key */
.c-intox,.t-intox{--hue:48;--C:.16}.c-wd,.t-wd{--hue:245;--C:.15}.c-danger,.t-danger{--hue:25;--C:.19}
.c-rx,.t-rx{--hue:155;--C:.14}.c-dx,.t-dx{--hue:300;--C:.15}.c-epi,.t-epi{--hue:205;--C:.11}
.c-bio,.t-bio{--hue:345;--C:.15}.t-hy{--hue:268;--C:.17}.t-up{--hue:58;--C:.15}.t-case{--hue:220;--C:.07}.t-mn{--hue:345;--C:.15}

*,*::before,*::after{box-sizing:border-box}
html{scroll-padding-top:calc(var(--bar-h) + 16px);-webkit-text-size-adjust:100%;text-size-adjust:100%}
body{margin:0;background:var(--ground);color:var(--ink);font:400 16.5px/1.6 var(--font-sans);-webkit-font-smoothing:antialiased;overflow-x:clip}
::selection{background:var(--mark)}
:focus-visible{outline:2.5px solid var(--accent);outline-offset:2px;border-radius:4px}
a{color:var(--accent);text-underline-offset:2px}
button{font:inherit;color:inherit}
.mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}
[hidden]{display:none!important}
.skip{position:absolute;inset-inline-start:12px;top:-60px;z-index:60;padding:10px 14px;background:var(--surface);border:1px solid var(--hair);border-radius:var(--r-s)}
.skip:focus{top:8px}
.sprite{position:absolute;width:0;height:0;overflow:hidden}
svg.i{width:16px;height:16px;flex:none;fill:currentColor;display:inline-block;vertical-align:-3px}
@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}}

/* ---------- buttons: obviously pressable, hug their content ---------- */
.btn{appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:42px;min-width:44px;padding:0 14px;flex:none;
  border:1px solid var(--hair);border-bottom-color:color-mix(in srgb,var(--ink) 22%,var(--hair));border-radius:var(--r-s);background:var(--surface);color:var(--ink);
  font:600 14px/1 var(--font-sans);cursor:pointer;box-shadow:var(--press);transition:transform .08s,box-shadow .08s,background .15s;user-select:none;text-decoration:none;white-space:nowrap}
.btn>span{text-box:trim-both cap alphabetic}
.btn:hover{background:var(--surface-2)}
.btn:active{transform:translateY(2px);box-shadow:none}
.btn.pri{background:var(--accent);color:var(--accent-ink);border-color:transparent;box-shadow:0 2px 0 oklch(.36 .15 262)}
:root[data-mode="lightbox"] .btn.pri{box-shadow:0 2px 0 oklch(.48 .1 250)}
.btn.pri:hover{background:color-mix(in oklch,var(--accent) 90%,var(--ink))}
.btn[aria-pressed="true"]{background:var(--ink);color:var(--ground);border-color:var(--ink)}
.btn:disabled{opacity:.4;cursor:default;box-shadow:none;transform:none}
#bMode[aria-pressed="true"],[data-modetoggle][aria-pressed="true"]{background:var(--surface);color:var(--ink);border-color:var(--hair);border-bottom-color:color-mix(in srgb,var(--ink) 22%,var(--hair))}
.btn.ic{width:42px;padding:0}
.btn.sm{min-height:36px;padding:0 12px;font-size:13px}
.btn.ghost{background:none;border-color:transparent;box-shadow:none}
.btn.ghost:hover{background:var(--surface-2)}
.btn .cnt{font:600 12px/1 var(--font-mono);padding:4px 6px;border-radius:6px;background:color-mix(in srgb,var(--accent-ink) 22%,transparent)}

/* ---------- top bar ---------- */
.bar{position:sticky;top:0;z-index:30;height:var(--bar-h);display:flex;align-items:center;gap:8px;padding:0 max(12px,env(safe-area-inset-right)) 0 max(12px,env(safe-area-inset-left));
  background:color-mix(in srgb,var(--ground) 92%,transparent);backdrop-filter:saturate(1.4) blur(8px);-webkit-backdrop-filter:saturate(1.4) blur(8px);border-bottom:1px solid var(--hair)}
.bar .id{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font:600 14.5px/1.2 var(--font-sans);display:flex;align-items:center;gap:8px}
.bar .id>span:last-child{overflow:hidden;text-overflow:ellipsis}
.bar .id b{font:500 12px/1 var(--font-mono);color:var(--muted)}
.bar .sw{width:10px;height:10px;border-radius:3px;background:var(--cur,var(--accent));flex:none}
.bar #bHome{margin-inline-end:2px}
.ruler{position:fixed;top:var(--bar-h);left:0;right:0;height:4px;z-index:29;background:var(--hair-2)}
.ruler i{position:absolute;inset-block:0;inset-inline-start:0;width:0;background:var(--cur,var(--accent));transition:background .3s}
.ruler b{position:absolute;top:0;width:2px;height:4px;background:var(--ground)}
@media (max-width:640px){.bar .hide-s,.bar .id b{display:none}.bar .ic-s{width:42px;padding:0}.bar .ic-s .cnt{position:absolute;top:-6px;inset-inline-end:-6px;background:var(--ink);color:var(--ground)}.bar .ic-s{position:relative}}

/* ---------- layout ---------- */
.wrap{display:grid;grid-template-columns:1fr;max-width:1280px;margin:0 auto;padding:0 16px}
@media (min-width:1100px){.wrap{grid-template-columns:272px minmax(0,1fr);gap:48px;padding:0 28px}}
.rail{display:none}
@media (min-width:1100px){.rail{display:block;position:sticky;top:calc(var(--bar-h) + 4px);align-self:start;max-height:calc(100vh - var(--bar-h) - 4px);overflow:auto;padding:24px 0 60px;padding-inline:0 4px;scrollbar-width:thin}}
.toc{list-style:none;margin:0;padding:0}
.toc>li{margin:2px 0;--sec:oklch(var(--L) var(--c,.14) var(--h,262));--sec-soft:oklch(var(--Ls) calc(var(--c,.14)*.3) var(--h,262))}
.toc>li>a{display:grid;grid-template-columns:38px 1fr 20px;gap:8px;align-items:center;padding:8px;padding-inline-end:10px;border-radius:var(--r-s);text-decoration:none;color:var(--ink);font-size:13.5px;line-height:1.3;border-inline-start:4px solid var(--sec)}
.toc>li>a .n{font:600 12px/1 var(--font-mono);color:var(--sec)}
.toc>li>a:hover{background:var(--surface)}
.toc>li.on>a{background:var(--sec-soft);font-weight:600}
.toc ol{list-style:none;margin:2px 0 8px;padding:0;padding-inline-start:20px;display:none}
.toc li.on ol{display:block}
.toc ol a{display:block;padding:5px 8px;border-inline-start:2px solid var(--hair);font-size:12.5px;line-height:1.35;color:var(--muted);text-decoration:none}
.toc ol a:hover{color:var(--ink)}
.toc ol a.on{color:var(--ink);font-weight:600;border-inline-start-color:var(--sec)}
main{min-width:0;padding-bottom:var(--s8)}

/* ---------- progress rings (one track, one arc, round caps) ---------- */
.ring{position:relative;display:inline-grid;place-items:center;flex:none;--sz:20px;width:var(--sz);height:var(--sz);color:var(--sec,var(--accent))}
.ring svg{position:absolute;inset:0;width:100%;height:100%;transform:rotate(-90deg)}
.ring .tr{fill:none;stroke:var(--hair);stroke-width:var(--sw,3.5)}
.ring .ar{fill:none;stroke:currentColor;stroke-width:var(--sw,3.5);stroke-linecap:round;transition:stroke-dasharray .6s var(--ease)}
.ring.full .ar{stroke:var(--ok)}
.ring b{position:relative;font:600 calc(var(--sz)*.27)/1 var(--font-sans);font-variant-numeric:proportional-nums;color:var(--ink);text-box:trim-both cap alphabetic;letter-spacing:-.01em}
.ring b small{font-size:.55em;font-weight:600;margin-inline-start:1px;color:var(--muted)}
.ring.big{--sz:112px;--sw:7}
.ring.mid{--sz:64px;--sw:5.5}
.ring.mid b{font-size:16px}
.ring.sm{--sz:40px;--sw:4}
.ring.sm b{font-size:11.5px}
.ring.xs{--sz:18px;--sw:3.5}

/* ---------- hero ---------- */
.hero{padding:44px 0 28px}
.kicker{font:500 13px/1.4 var(--font-sans);color:var(--muted);display:flex;flex-wrap:wrap;gap:4px 16px}
.hero h1{font:700 clamp(32px,6.5vw,58px)/1.02 var(--font-sans);letter-spacing:-.03em;margin:14px 0 0;max-width:16ch}
.hero h1 span{display:block;font:500 clamp(15px,2.2vw,19px)/1.4 var(--font-sans);letter-spacing:0;color:var(--muted);margin-top:14px;max-width:46ch}
.dash{display:flex;align-items:center;gap:24px;margin:28px 0 20px;padding:16px;background:var(--surface);border:1px solid var(--hair);border-radius:14px}
.dash-r{flex:1;min-width:0;display:grid;gap:14px}
.kpis{display:flex;flex-wrap:wrap;gap:4px 0;margin:0}
.kpis div{padding-inline-end:16px;margin-inline-end:16px;border-inline-end:1px solid var(--hair-2)}
.kpis div:last-child{border-inline-end:0;margin-inline-end:0}
.kpis b{display:block;font:600 19px/1.15 var(--font-mono);font-variant-numeric:tabular-nums}
.kpis span{font:500 12.5px/1.3 var(--font-sans);color:var(--muted)}
.dacts{display:flex;flex-wrap:wrap;gap:8px}
@media (max-width:640px){.dash{flex-direction:column;align-items:stretch;gap:16px}.dash .ring.big{--sz:88px}.kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:12px 8px}.kpis div{padding:0;margin:0;border:0}}
@media (max-width:440px){body[data-page="chapter"] .bar #bMode{display:none}}
.ring-l{display:flex;align-items:center;gap:16px}
.ring-l .lb{font:500 13px/1.35 var(--font-sans);color:var(--muted);max-width:14ch}
.ring-l .lb b{display:block;color:var(--ink);font-size:15px;font-weight:600}
@media (min-width:641px){.ring-l .lb{display:none}}
.how{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:8px;counter-reset:how;padding:4px 0 6px}
.how div{font-size:14px;line-height:1.45;counter-increment:how}
.how b{display:flex;align-items:center;gap:8px;font-weight:600;margin-bottom:4px}
.how b::before{content:counter(how);display:grid;place-items:center;width:22px;height:22px;border-radius:50%;background:var(--surface-2);color:var(--ink);font:600 12px/1 var(--font-mono)}
.legend{margin-top:12px;background:var(--surface);border:1px solid var(--hair);border-radius:var(--r);padding:12px 14px}
.legend h2,.index h2,.lib h2{font:600 15px/1.3 var(--font-sans);color:var(--ink);margin:0 0 10px;letter-spacing:0}
.legend .row{display:flex;flex-wrap:wrap;gap:6px 14px}
.index{margin-top:28px}
.index .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:8px}
.index a{--sec:oklch(var(--L) var(--c,.14) var(--h,262));display:grid;grid-template-columns:52px 1fr 40px;gap:12px;align-items:center;padding:12px 0;padding-inline-end:14px;background:var(--surface);border:1px solid var(--hair);border-radius:var(--r);text-decoration:none;color:var(--ink);transition:transform .12s,border-color .12s;position:relative;overflow:hidden}
.index a:hover{transform:translateY(-2px);border-color:var(--sec)}
.index a::before{content:"";position:absolute;inset-block:0;inset-inline-start:0;width:5px;background:var(--sec)}
.index .n{font:600 15px/1 var(--font-mono);color:var(--sec);text-align:center;padding-inline-start:6px}
.index .t{font-weight:600;line-height:1.3;font-size:15px}
.index .t small{display:block;font-weight:400;font-size:13px;color:var(--muted);margin-top:4px;line-height:1.4}

/* ---------- section ---------- */
.sec{--sec:oklch(var(--Lb,var(--L)) calc(var(--c,.14)*var(--Ck,1)) var(--h,262));--sec-soft:oklch(var(--Ls) calc(var(--c,.14)*.3) var(--h,262));--sec-line:oklch(var(--Ll) calc(var(--c,.14)*.6) var(--h,262));--sec-ink:oklch(var(--Lt) var(--c,.14) var(--h,262));
  padding-top:44px;padding-bottom:28px}
.plate{border-radius:14px;overflow:hidden;background:var(--surface);border:1px solid var(--hair)}
.plate .band{background:var(--sec);color:var(--band-ink);padding:16px 18px 16px}
.plate .band .no{font:500 13px/1 var(--font-sans);opacity:.88;display:flex;justify-content:space-between;gap:12px}
.plate h2{font:700 27px/1.12 var(--font-sans);letter-spacing:-.015em;margin:10px 0 6px}
.plate .lede{margin:0;font-size:15px;line-height:1.45;opacity:.92;max-width:60ch}
.plate .chips{display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;padding:12px 16px;border-bottom:1px solid var(--hair)}
.plate .chips span{font:500 13px/1.2 var(--font-sans);color:var(--muted)}
.plate .chips b{font-family:var(--font-mono);font-weight:600;color:var(--ink)}
.mast{display:inline-flex;align-items:center;gap:8px}
.mast:empty{display:none}
.plate .chips .mast b{font-family:var(--font-sans)}
.plate .acts{display:flex;flex-wrap:wrap;gap:8px;padding:12px 16px}
.plate .acts .btn.pri{background:var(--sec);color:var(--band-ink);box-shadow:0 2px 0 oklch(calc(var(--L) - .16) var(--c,.14) var(--h))}
details.hy{margin-top:12px}
/* dropdowns look like buttons: raised, with a chevron */
details>summary{list-style:none;cursor:pointer;user-select:none}
details>summary::-webkit-details-marker{display:none}
details.hy>summary,details.fold>summary,details.more>summary{display:flex;align-items:center;gap:10px;min-height:46px;padding:10px 14px;border-radius:var(--r);
  background:var(--surface);border:1px solid var(--hair);border-bottom-color:color-mix(in srgb,var(--ink) 22%,var(--hair));box-shadow:var(--press);font:600 14.5px/1.3 var(--font-sans)}
details>summary:hover{background:var(--surface-2)}
details>summary .chev{margin-inline-start:auto;color:var(--muted);transition:transform .2s var(--ease)}
details[open]>summary .chev{transform:rotate(180deg)}
details.hy>summary .hs{color:var(--sec)}
details.hy>summary .n{font:600 12.5px/1 var(--font-mono);color:var(--muted);margin-inline-start:4px}
details.hy[open]>summary{border-radius:var(--r) var(--r) 0 0;box-shadow:none}
details.hy ol{margin:0;padding:8px 14px 12px;list-style:none;counter-reset:hy;background:var(--surface);border:1px solid var(--hair);border-top:0;border-radius:0 0 var(--r) var(--r)}
details.hy li{counter-increment:hy;display:grid;grid-template-columns:32px 1fr;gap:4px;padding:8px 0;border-bottom:1px solid var(--hair-2);font-size:15px;line-height:1.45}
details.hy li:last-child{border-bottom:0}
details.hy li::before{content:counter(hy);display:grid;place-items:center;width:22px;height:22px;border-radius:50%;background:var(--sec);color:var(--band-ink);font:600 11px/1 var(--font-mono);margin-top:1px}
details.more{margin:12px 0}
details.more>summary{background:transparent;border-style:dashed;box-shadow:none;color:var(--muted);font-weight:500;font-size:14px;min-height:42px}
details.more>summary .pm{color:var(--ink);width:20px;height:20px;padding:3px;border-radius:5px;background:var(--surface-2)}
details.more[open]{background:var(--surface);border:1px solid var(--hair);border-radius:var(--r);padding:0 14px 6px}
details.more[open]>summary{border:0;border-bottom:1px dashed var(--hair);border-radius:0;margin:0 -14px 12px;padding-inline-start:14px}
details.more>*:not(summary){font-size:14.5px}
details.fold{margin:12px 0}
details.fold[open]{background:var(--surface);border:1px solid var(--hair);border-radius:var(--r);padding:0 14px 8px}
details.fold[open]>summary{border:0;border-bottom:1px solid var(--hair);border-radius:0;box-shadow:none;margin:0 -14px 12px}

/* ---------- prose ---------- */
.body{max-width:var(--measure)}
.body h3{font:700 20px/1.25 var(--font-sans);letter-spacing:-.01em;margin:52px 0 12px;display:block;scroll-margin-top:calc(var(--bar-h) + 16px)}
.body h3::before{content:"";display:inline-block;width:6px;height:1.05em;border-radius:3px;background:var(--sec);vertical-align:-.15em;margin-inline-end:10px}
.body h3 .pg{display:inline-block;vertical-align:.15em;margin-inline-start:10px;font:500 11.5px/1 var(--font-mono);color:var(--muted);background:var(--surface-2);padding:4px 6px;border-radius:5px;white-space:nowrap}
.body h4{font:600 14.5px/1.35 var(--font-sans);margin:24px 0 8px;color:var(--muted)}
.body h5{font:600 14px/1.3 var(--font-sans);margin:0 0 6px}
.body p,.body ul,.body ol{margin:0 0 14px}
.body ul,.body ol{padding-inline-start:1.2em}
.body li{margin:4px 0;line-height:1.5}
.body ul>li::marker{color:var(--muted)}
.body strong{font-weight:600}
.body .num{font-weight:600;font-variant-numeric:tabular-nums;color:var(--ink)}
.body abbr{text-decoration:underline dotted var(--muted);text-underline-offset:3px}
.body sup,.body sub{line-height:0}
/* tags: quiet coloured text, not badges */
.tag{display:inline-block;vertical-align:baseline;font:600 12.5px/1 var(--font-sans);margin-inline-end:6px;white-space:nowrap;color:oklch(var(--Lt) var(--C,.1) var(--hue,262))}
.snap .tag{display:none}
/* boxes: white card, hairline, one colour stripe + coloured label; only danger tinted */
.box{--hue:262;--C:.02;display:block;margin:20px 0;padding:12px 14px;border-radius:var(--r);font-size:15px;line-height:1.5;
  background:var(--surface);border:1px solid var(--hair);border-inline-start:3px solid oklch(var(--L) var(--C) var(--hue))}
.box>b:first-child{display:flex;align-items:center;gap:8px;font:600 13.5px/1.3 var(--font-sans);margin:0 0 6px;color:oklch(var(--Lt) var(--C) var(--hue))}
.box>b:first-child svg.i{color:oklch(var(--L) var(--C) var(--hue))}
.box p:last-child,.box ul:last-child,.box ol:last-child{margin-bottom:0}
.box ul,.box ol{padding-inline-start:1.15em;margin:4px 0 8px}
.box li::marker{color:oklch(var(--L) var(--C) var(--hue))}
.box.key{--hue:268;--C:.17}
.box.warn{--hue:25;--C:.2;background:oklch(var(--Ls) .03 25)}
.box.dsm{--hue:300;--C:.15}
.box.rx{--hue:155;--C:.14}
.box.update{--hue:58;--C:.15;border-inline-start-style:dashed}
.box.etym{--hue:230;--C:.03;font-size:14px;color:var(--muted);background:none;border:0;border-inline-start:2px solid var(--hair);padding:2px 0;padding-inline-start:12px;border-radius:0}
.box.etym em,.box.etym i{font-style:italic;color:var(--ink)}
.box.case{--hue:220;--C:.07}
.box.mn{--hue:345;--C:.15}
.box.pearl{--hue:268;--C:.06;font-family:var(--font-serif);font-size:16px;background:none;border:0;border-inline-start:3px solid var(--hair);padding:4px 0;padding-inline-start:16px;border-radius:0}
.box.pearl>b:first-child{font-family:var(--font-sans)}
.box cite{display:block;margin-top:8px;padding-top:6px;border-top:1px solid var(--hair-2);font:400 12px/1.45 var(--font-sans);font-style:normal;color:var(--muted)}
.box cite a{color:inherit}
.box .tw{margin:10px 0}
/* snapshot */
.snap{margin:18px 0 6px;border-radius:12px;overflow:hidden;border:1px solid var(--hair);background:var(--surface)}
.snap::before{content:attr(data-label);display:block;padding:10px 14px;color:var(--sec-ink);font:600 13.5px/1 var(--font-sans);border-bottom:1px solid var(--hair)}
.snap table{border-collapse:collapse;width:100%;font-size:14.5px;line-height:1.45}
.snap th{width:30%;text-align:start;vertical-align:top;padding:10px 12px;font:600 13px/1.4 var(--font-sans);color:var(--muted);border-bottom:1px solid var(--hair-2)}
.snap td{padding:10px 12px;border-bottom:1px solid var(--hair-2);vertical-align:top}
.snap tr:last-child th,.snap tr:last-child td{border-bottom:0}
@media (max-width:520px){.snap tr{display:block;border-bottom:1px solid var(--hair-2)}.snap tr:last-child{border-bottom:0}.snap th,.snap td{display:block;width:auto;border:0}.snap th{padding-bottom:2px}.snap td{padding-top:0}}
/* tables */
.tw{overflow-x:auto;margin:22px 0;border-radius:var(--r);border:1px solid var(--hair);background:var(--surface);-webkit-overflow-scrolling:touch}
@media (min-width:1180px){.body>.tw,.body>figure.fig,.body>.cmp{margin-inline-end:calc(-1 * min(220px, 16vw))}}
table.t{border-collapse:collapse;width:100%;font-size:14px;line-height:1.45;font-variant-numeric:tabular-nums}
table.t caption{caption-side:top;text-align:start;padding:10px 12px;font:600 13.5px/1.35 var(--font-sans);color:var(--ink);border-bottom:1px solid var(--hair)}
table.t th{text-align:start;font:600 12.5px/1.3 var(--font-sans);padding:9px 11px;border-bottom:1px solid var(--hair);vertical-align:bottom;color:var(--muted)}
table.t td{padding:9px 11px;border-bottom:1px solid var(--hair-2);vertical-align:top;min-width:128px}
table.t tbody th{vertical-align:top;font:600 13.5px/1.4 var(--font-sans);color:var(--ink);border-bottom:1px solid var(--hair-2);min-width:96px}
table.t tbody tr:last-child td,table.t tbody tr:last-child th{border-bottom:0}
table.t td:first-child{font-weight:600}
table.t ul{margin:0;padding-inline-start:1em}
table.t.vs td:first-child{width:26%}
/* phones: tables with 3+ columns stack into labelled rows (app.js adds .stack and data-label) */
@media (max-width:600px){
 table.t.stack{min-width:0}
 table.t.stack thead{display:none}
 table.t.stack tr{display:block;padding:10px 12px;border-bottom:1px solid var(--hair)}
 table.t.stack tbody tr:last-child{border-bottom:0}
 table.t.stack td,table.t.stack tbody th{display:block;position:relative;border:0;padding:3px 0;padding-inline-start:36%;min-width:0;background:none;min-height:1.5em}
 table.t.stack td::before,table.t.stack tbody th::before{content:attr(data-label);position:absolute;inset-inline-start:0;top:4px;width:33%;color:var(--muted);font:600 12.5px/1.4 var(--font-sans)}
 table.t.stack tr>:first-child{display:block;font-weight:700;font-size:15px;padding:0 0 4px}
 table.t.stack tr>:first-child::before{content:none}
 table.t.stack td[colspan]{padding-inline-start:0}table.t.stack td[colspan]::before{content:none}
}
/* comparison grid: neutral panels; semantic colour only as a thin top rule */
.cmp{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:10px;margin:14px 0}
.cmp>div{--hue:262;--C:.03;border-radius:var(--r);padding:12px 14px;font-size:14.5px;line-height:1.45;background:var(--surface);border:1px solid var(--hair);border-top:3px solid oklch(var(--L) var(--C) var(--hue))}
.cmp>div:not([class]){border-top-color:var(--hair)}
.cmp h5{font:600 14px/1.3 var(--font-sans)!important;margin:0 0 8px!important;color:var(--ink)}
.cmp ul{padding-inline-start:1.05em;margin:0}
.cmp li::marker{color:oklch(var(--L) var(--C) var(--hue))}
dl.defs{display:grid;grid-template-columns:minmax(110px,32%) 1fr;margin:14px 0;background:var(--surface);border:1px solid var(--hair);border-radius:var(--r);overflow:hidden}
dl.defs dt{font:600 14px/1.4 var(--font-sans);padding:9px 12px;border-bottom:1px solid var(--hair-2);color:var(--ink)}
dl.defs dd{margin:0;padding:9px 12px;border-bottom:1px solid var(--hair-2);font-size:14.5px}
@media (max-width:520px){dl.defs{grid-template-columns:1fr}dl.defs dt{border-bottom:0;padding-bottom:3px}dl.defs dd{padding-top:3px}}
/* stats: one quiet strip */
.body .stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:0;margin:22px 0;border-top:1px solid var(--hair);border-bottom:1px solid var(--hair)}
.body .stats>div{padding:12px 14px;border-inline-end:1px solid var(--hair-2)}
.body .stats>div:last-child{border-inline-end:0}
.body .stats b{display:block;font:700 21px/1.05 var(--font-mono);color:var(--ink);font-variant-numeric:tabular-nums;margin-bottom:4px}
.body .stats span{font-size:13px;line-height:1.35;color:var(--muted);display:block}
/* timeline */
ol.tl{list-style:none;margin:16px 0;padding:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(118px,1fr));gap:0;position:relative}
ol.tl li{position:relative;padding:26px 0 0;padding-inline-end:10px;margin:0;font-size:14px;line-height:1.4}
ol.tl li::before{content:"";position:absolute;top:8px;inset-inline:0;height:3px;background:var(--sec-line)}
ol.tl li::after{content:"";position:absolute;top:2px;inset-inline-start:0;width:15px;height:15px;border-radius:50%;background:var(--surface);border:3.5px solid var(--sec)}
ol.tl li b{display:block;font:700 14px/1.2 var(--font-mono);color:var(--ink);margin-bottom:4px}
@media (max-width:560px){ol.tl{grid-template-columns:1fr}ol.tl li{padding:0 0 14px;padding-inline-start:28px}ol.tl li::before{top:0;bottom:0;inset-inline-start:6px;inset-inline-end:auto;width:3px;height:auto}ol.tl li::after{top:2px}ol.tl li:last-child::before{bottom:auto;height:10px}}
/* flow */
ol.flow{list-style:none;margin:16px 0;padding:0;counter-reset:fl}
ol.flow li{counter-increment:fl;position:relative;margin:0;padding:0 0 14px;padding-inline-start:44px;font-size:14.5px;line-height:1.45}
ol.flow li::before{content:counter(fl);position:absolute;inset-inline-start:0;top:0;width:30px;height:30px;border-radius:9px;display:grid;place-items:center;background:var(--sec);color:var(--band-ink);font:700 13px/1 var(--font-mono)}
ol.flow li::after{content:"";position:absolute;inset-inline-start:14px;top:32px;bottom:2px;width:2px;background:var(--sec-line)}
ol.flow li:last-child::after{display:none}
ol.flow li>b:first-child{display:block;font-weight:700;margin:4px 0 2px}
/* figures */
figure.fig{margin:22px 0;background:var(--surface);border:1px solid var(--hair);border-radius:12px;padding:14px;overflow-x:auto;-webkit-overflow-scrolling:touch}
figure.fig svg{display:block;width:100%;min-width:540px;height:auto;font-family:var(--font-sans)}
figure.fig figcaption{position:sticky;inset-inline-start:0;font:500 13px/1.45 var(--font-sans);color:var(--muted);border-top:1px solid var(--hair-2);padding-top:10px;margin-top:10px}
svg .ln{stroke:var(--ink);fill:none;stroke-width:1.6}
svg .ln2{stroke:var(--muted);fill:none;stroke-width:1.2;stroke-dasharray:5 4}
svg .ac{fill:var(--sec);stroke:none}
svg .acs{stroke:var(--sec);fill:none;stroke-width:2.4}
svg .ac.acs{fill:var(--sec)}
svg .fl{fill:var(--sec-soft);stroke:var(--sec-line);stroke-width:1.4}
svg .tx{fill:var(--ink);font-size:14px}
svg .txm{fill:var(--muted);font-size:13px}
svg .txa{fill:var(--band-ink);font-size:14px;font-weight:600}
svg .hz{fill:url(#hatch);stroke:oklch(var(--L) .19 25);stroke-width:1.4}
figure.fig svg rect{rx:6px}
.mk{fill:var(--ink)}
#hatch .hb{fill:oklch(var(--Ls) .06 25)}#hatch .hl{stroke:oklch(var(--L) .19 25);stroke-width:1.6;opacity:.55}
.chart{margin:22px 0;background:var(--surface);border:1px solid var(--hair);border-radius:12px;padding:14px}
.chart .ct{font:600 14px/1.3 var(--font-sans);margin-bottom:8px}
.chart .cs{font:400 12px/1.4 var(--font-sans);color:var(--muted);margin-top:8px}
.chart .cv{position:relative;height:260px}

/* ---------- practice ---------- */
.practice{margin-top:30px;border-radius:14px;overflow:hidden;background:var(--surface);border:1px solid var(--sec-line)}
.practice .ph{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px;background:var(--sec);color:var(--band-ink);font:600 14px/1.2 var(--font-sans)}
.practice .ph .pm{font:500 13px/1 var(--font-sans);opacity:.9;white-space:nowrap}
.practice .ph .pm b{font-family:var(--font-mono);font-weight:600}
.tabs{display:flex;flex-wrap:wrap;gap:6px;padding:10px 12px;border-bottom:1px solid var(--hair);background:var(--surface-2);scrollbar-width:none}
.tabs::-webkit-scrollbar{display:none}
.tabs button{appearance:none;flex:none;display:inline-flex;align-items:center;gap:6px;border:1px solid var(--hair);border-bottom-color:color-mix(in srgb,var(--ink) 20%,var(--hair));background:var(--surface);border-radius:var(--r-s);padding:0 12px;min-height:38px;cursor:pointer;font:600 13.5px/1 var(--font-sans);color:var(--muted);box-shadow:var(--press)}
.tabs button[aria-selected="true"]{background:var(--sec);color:var(--band-ink);border-color:transparent;box-shadow:none}
.tabs button small{font:500 11.5px/1 var(--font-mono);opacity:.85}
.pane{padding:16px}
.qmeta{display:flex;justify-content:space-between;align-items:center;gap:12px;font:500 13px/1.3 var(--font-sans);color:var(--muted);margin:0 0 12px;min-height:22px}
.qmeta .mono{font-size:12.5px}
.qmeta>span:first-child{min-width:0}
.qmeta .r{display:inline-flex;align-items:center;gap:12px}
.streak{display:inline-flex;align-items:center;gap:4px;color:var(--ink);font-weight:600}
.streak svg{color:var(--sec,var(--accent))}
.streak.bump{animation:bump .4s var(--ease)}
@keyframes bump{40%{transform:scale(1.18)}}
.qstem{font-size:15px;background:var(--surface-2);border-inline-start:3px solid var(--sec,var(--accent));border-radius:8px;padding:12px;margin:0 0 12px}
.qq{font-weight:600;font-size:16.5px;line-height:1.45;margin:0 0 12px}
.opts{display:grid;gap:8px}
.opt{display:grid;grid-template-columns:28px 1fr;align-items:center;gap:10px;text-align:start;border:1px solid var(--hair);border-bottom-color:color-mix(in srgb,var(--ink) 20%,var(--hair));border-radius:10px;background:var(--surface);padding:9px 12px;padding-inline-start:10px;min-height:48px;cursor:pointer;font-size:15px;line-height:1.4;box-shadow:var(--press);transition:transform .08s,background .15s,border-color .15s}
.opt .l{display:grid;place-items:center;width:28px;height:28px;border-radius:7px;background:var(--surface-2);font:600 12.5px/1 var(--font-mono);color:var(--muted)}
.opt .l svg{width:16px;height:16px}
.opt:hover:not(:disabled){border-color:var(--sec,var(--accent));background:var(--sec-soft,var(--surface-2))}
.opt:active:not(:disabled){transform:translateY(2px);box-shadow:none}
.opt:disabled{cursor:default;box-shadow:none}
.opt.ok{background:var(--ok-s);border-color:var(--ok)}
.opt.ok .l{background:var(--ok);color:var(--surface)}
.opt.no{background:var(--no-s);border-color:var(--no)}
.opt.no .l{background:var(--no);color:var(--surface)}
.opt.no>span:last-child{text-decoration:line-through;text-decoration-color:var(--no)}
.opt.dim{opacity:.55}
.opt.pick{border-color:var(--ink);background:var(--surface-2);box-shadow:none}
.opt.pick .l{background:var(--ink);color:var(--surface)}
.opt.ok.now{animation:pop .36s var(--ease)}
.opt.no.now{animation:shake .32s}
.opt.now .l svg{animation:draw .3s var(--ease)}
@keyframes pop{40%{transform:scale(1.015)}}
@keyframes shake{25%{transform:translateX(-4px)}75%{transform:translateX(4px)}}
@keyframes draw{from{transform:scale(.4);opacity:0}}
.expl{margin-top:12px;padding:12px 14px;border-radius:10px;background:var(--surface-2);font-size:15px;line-height:1.5}
.expl.now{animation:rise .22s var(--ease)}
@keyframes rise{from{opacity:0;transform:translateY(4px)}}
.expl>b:first-child{display:flex;align-items:center;gap:8px;font:600 14.5px/1.3 var(--font-sans);margin-bottom:6px}
.expl.ok>b:first-child{color:var(--ok)}
.expl.no>b:first-child{color:var(--no)}
.expl .src{display:block;margin-top:8px;font:400 12.5px/1.3 var(--font-sans);color:var(--muted)}
.qnav{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap;align-items:center}
.qnav .sp{flex:1}
.dots{display:flex;flex-wrap:wrap;gap:4px;margin-top:14px}
.dots button{width:18px;height:18px;min-width:0;padding:0;border-radius:5px;border:1.5px solid var(--hair);background:var(--surface);cursor:pointer}
.dots button.ok{background:var(--ok);border-color:transparent}
.dots button.no{background:var(--no);border-color:transparent}
.dots button.an{background:var(--ink);border-color:transparent;opacity:.55}
.dots button.fl{border-color:var(--accent);border-width:2.5px}
.dots button.cur{outline:2px solid var(--ink);outline-offset:1px}
/* summaries: one big number in a ring, the rest as lines */
.summary{display:grid;grid-template-columns:auto 1fr;gap:16px 20px;align-items:center;padding:6px 0 4px}
.summary .ring{--sec:var(--accent)}
.summary h4{font:600 18px/1.3 var(--font-sans);margin:0 0 6px;color:var(--ink)}
.summary .ln{display:flex;flex-wrap:wrap;gap:4px 14px;font-size:14px;color:var(--muted);margin:0}
.summary .ln b{color:var(--ink);font-weight:600;font-variant-numeric:tabular-nums}
.summary .ln>span{display:inline-flex;align-items:center;gap:4px}
.summary .qnav{grid-column:1/-1;margin-top:4px}
.summary.now{animation:rise .3s var(--ease)}
.nm{font-variant-numeric:tabular-nums}
/* flashcards: 3D flip, swipe on touch */
.cardwrap{position:relative;perspective:1400px;touch-action:pan-y}
.card{position:relative;display:grid;cursor:pointer;user-select:none;-webkit-user-select:none;transform-style:preserve-3d;transition:transform .5s var(--ease);min-height:230px;outline:none}
.card.flip{transform:rotateY(180deg)}
.card.drag{transition:none}
.card .face{grid-area:1/1;display:flex;flex-direction:column;justify-content:center;gap:10px;padding:40px 20px 34px;border:1px solid var(--sec-line,var(--hair));border-radius:14px;background:var(--surface);backface-visibility:hidden;-webkit-backface-visibility:hidden;font-size:17px;line-height:1.5}
.card .front{text-align:center;font-weight:500;font-size:18px}
.card .back{transform:rotateY(180deg);font-size:15.5px;text-align:start;background:linear-gradient(var(--sec-soft,var(--surface-2)),var(--surface) 46px)}
.card .back .q{font:600 13px/1.35 var(--font-sans);color:var(--muted);border-bottom:1px solid var(--hair-2);padding-bottom:8px}
.card .ctag{position:absolute;top:12px;inset-inline-start:14px;font:600 12.5px/1 var(--font-sans);color:var(--sec-ink,var(--muted))}
.card .hint{position:absolute;bottom:12px;inset-inline-end:14px;font:500 12px/1 var(--font-sans);color:var(--muted)}
.card:focus-visible .face{outline:2.5px solid var(--accent);outline-offset:2px}
.swipe-h{position:absolute;top:14px;z-index:3;display:inline-flex;align-items:center;gap:6px;padding:8px 12px;border-radius:999px;font:600 14px/1 var(--font-sans);opacity:0;pointer-events:none;transition:opacity .1s;background:var(--surface);border:1.5px solid currentColor}
.swipe-h.again{inset-inline-start:14px;color:var(--no)}
.swipe-h.good{inset-inline-end:14px;color:var(--ok)}
.rate{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-top:12px}
.rate .btn{flex-direction:column;gap:5px;min-height:56px;padding:0 6px}
.rate .btn small{font:500 11.5px/1 var(--font-mono);opacity:.75}
.rate .btn[data-r="0"]{color:var(--no)}
.swipe-tip{display:none;align-items:center;justify-content:center;gap:16px;margin-top:10px;font:500 13px/1.3 var(--font-sans);color:var(--muted)}
.swipe-tip span{display:inline-flex;align-items:center;gap:6px}
@media (pointer:coarse){.swipe-tip{display:flex}.kb{display:none}}
.kb{font:400 12px/1.4 var(--font-sans);color:var(--muted);margin-top:10px}
.kb kbd{font:500 11.5px/1 var(--font-mono);padding:2px 5px;border:1px solid var(--hair);border-bottom-width:2px;border-radius:4px;background:var(--surface)}
/* rapid review */
.rapid{list-style:none;margin:0;padding:0;counter-reset:r}
.rapid li{display:grid;grid-template-columns:32px 1fr;gap:8px;padding:12px 0;border-bottom:1px solid var(--hair-2);counter-increment:r}
.rapid li:last-child{border-bottom:0}
.rapid li::before{content:counter(r);display:grid;place-items:center;width:24px;height:24px;border-radius:6px;background:var(--surface-2);color:var(--muted);font:600 11.5px/1 var(--font-mono)}
.rapid li.k1::before{background:var(--ok-s);color:var(--ok)}
.rapid li.k0::before{background:var(--no-s);color:var(--no)}
.rapid .q{font-size:15px;font-weight:600}
.rapid .a{display:block;width:100%;text-align:start;margin-top:8px;padding:8px 12px;border-radius:8px;background:var(--surface-2);border:1px dashed var(--hair);cursor:pointer;min-height:40px;font-size:15px;color:transparent;text-shadow:0 0 9px var(--muted);user-select:none}
.rapid .a.show{color:var(--ink);text-shadow:none;border:1px solid var(--hair);background:var(--surface);user-select:text;cursor:default}
.rapid .sg{display:none;gap:8px;margin-top:8px}
.rapid .a.show+.sg{display:flex}
.rapid .sg .btn[aria-pressed="true"].k1{background:var(--ok-s);border-color:var(--ok);color:var(--ok);box-shadow:none}
.rapid .sg .btn[aria-pressed="true"].k0{background:var(--no-s);border-color:var(--no);color:var(--no);box-shadow:none}
/* matching */
.mgrid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.mcol{display:grid;gap:8px;align-content:start}
.mi{display:flex;align-items:center;gap:8px;border:1px solid var(--hair);border-bottom-color:color-mix(in srgb,var(--ink) 20%,var(--hair));border-radius:10px;background:var(--surface);padding:9px 12px;min-height:48px;text-align:start;cursor:pointer;font-size:14px;line-height:1.35;box-shadow:var(--press);transition:background .15s,border-color .15s}
.mi.sel{background:var(--sec,var(--accent));color:var(--band-ink);border-color:transparent}
.mi.done{background:var(--ok-s);border-color:var(--ok-l);cursor:default;box-shadow:none}
.mi .pn{display:none;flex:none;order:-1;width:22px;height:22px;border-radius:50%;place-items:center;background:var(--ok);color:var(--surface);font:600 11.5px/1 var(--font-mono)}
.mcol[data-c="r"] .mi .pn{order:2;margin-inline-start:auto}
.mi.done .pn{display:grid;animation:draw .3s var(--ease)}
.mi.bad{animation:shake .32s;border-color:var(--no)}
.mstat{display:flex;gap:12px;justify-content:space-between;align-items:center;flex-wrap:wrap;margin:14px 0 0;font:500 13px/1.3 var(--font-sans);color:var(--muted)}
.mstat .r{display:flex;gap:8px;flex-wrap:wrap}
.setbar{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 14px}
/* sorting */
.pool,.bucket .drop{display:flex;flex-wrap:wrap;gap:6px;min-height:58px;padding:8px;border:2px dashed var(--hair);border-radius:10px;background:var(--surface-2)}
.buckets{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:8px;margin-top:10px}
.bucket{border-radius:10px;overflow:hidden;background:var(--surface);border:1px solid var(--sec-line,var(--hair))}
.bucket h5{margin:0}
.bucket .bucket-h{appearance:none;display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;min-height:42px;padding:8px 12px;background:var(--sec-soft,var(--surface-2));color:var(--sec-ink,var(--ink));font:600 13.5px/1.25 var(--font-sans);border:0;cursor:pointer;text-align:start}
.bucket .bucket-h .ph2{font:500 12px/1 var(--font-sans);opacity:0;transition:opacity .15s;display:inline-flex;gap:4px;align-items:center}
.has-sel .bucket .bucket-h .ph2{opacity:.85}
.bucket .drop{border:0;border-radius:0;background:transparent;min-height:72px}
.pool:empty{min-height:44px;align-items:center;justify-content:center}
.pool:empty::before{content:attr(data-empty);font:500 13px/1 var(--font-sans);color:var(--muted)}
.chip{position:relative;display:inline-flex;align-items:center;gap:6px;max-width:100%;overflow-wrap:anywhere;border:1px solid var(--hair);border-bottom-color:color-mix(in srgb,var(--ink) 20%,var(--hair));border-radius:8px;background:var(--surface);padding:8px 10px;font-size:14px;line-height:1.3;cursor:grab;touch-action:manipulation;user-select:none;text-align:start;box-shadow:var(--press)}
.chip.sel{background:var(--sec,var(--accent));color:var(--band-ink);border-color:transparent}
.chip.ok{border-color:var(--ok);background:var(--ok-s)}
.chip.no{border-color:var(--no);background:var(--no-s)}
.chip>svg{position:absolute;top:-7px;inset-inline-end:-7px;width:20px;height:20px;padding:4px;border-radius:50%;color:var(--surface);animation:draw .3s var(--ease) both;animation-delay:var(--d,0s)}
.chip.ok>svg{background:var(--ok)}.chip.no>svg{background:var(--no)}
.sortable-ghost{opacity:.35}
.empty{color:var(--muted);font-size:14.5px;margin:4px 0 0}

/* ---------- dialogs ---------- */
dialog{border:1px solid var(--hair);background:var(--ground);color:var(--ink);padding:0;width:min(780px,100vw);max-width:100vw;max-height:min(88vh,900px);border-radius:16px;box-shadow:0 20px 60px rgba(0,0,0,.3)}
dialog::backdrop{background:rgba(10,14,20,.5);backdrop-filter:blur(2px)}
@media (max-width:640px){dialog{width:100vw;height:100dvh;max-height:100dvh;margin:0;border:0;border-radius:0}}
.dh{position:sticky;top:0;z-index:2;display:flex;align-items:center;gap:8px;padding:8px 12px;padding-inline-start:16px;background:var(--surface);border-bottom:1px solid var(--hair);font:600 16px/1 var(--font-sans);min-height:58px}
.dh .grow{flex:1;min-width:0;overflow-wrap:anywhere}
.db{padding:16px}
.sinput{width:100%;font:400 17px/1.3 var(--font-sans);padding:13px 14px;border:1.5px solid var(--hair);border-radius:10px;background:var(--surface);color:var(--ink)}
.sinput:focus-visible{border-color:var(--accent);outline:2.5px solid var(--mark);outline-offset:0}
.scope{display:flex;gap:8px;margin-top:12px}
.sres{list-style:none;margin:12px 0 0;padding:0;display:grid;gap:6px}
.sres a{display:block;padding:12px;border-radius:10px;background:var(--surface);border:1px solid var(--hair);border-inline-start:4px solid var(--sec,var(--accent));text-decoration:none;color:var(--ink)}
.sres a:hover{border-color:var(--sec,var(--accent))}
.sres .s{font:500 12.5px/1.2 var(--font-sans);color:var(--sec,var(--muted))}
.sres .s .mono{font-weight:600}
.sres .h{display:block;font-weight:600;margin:4px 0}
.sres .x{display:block;font-size:14px;color:var(--muted);line-height:1.45}
.sres mark{background:var(--mark);color:var(--ink);border-radius:3px;padding:0 2px}
.filters{display:flex;flex-wrap:wrap;gap:6px;padding:4px 0 6px}
.filters label{display:inline-flex;align-items:center;gap:8px;border:1px solid var(--hair);border-radius:8px;padding:0 10px;min-height:40px;font:600 13px/1 var(--font-sans);cursor:pointer;background:var(--surface)}
.filters label .mono{font-weight:600;color:var(--muted)}
.filters input{accent-color:var(--accent);width:17px;height:17px;margin:0}
.rtabs{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;margin:12px 0 16px}
.rhost{background:var(--surface);border:1px solid var(--hair);border-radius:12px;padding:16px}
.toast{position:fixed;left:50%;bottom:max(20px,env(safe-area-inset-bottom));z-index:70;transform:translate(-50%,24px);opacity:0;pointer-events:none;display:flex;align-items:center;gap:8px;padding:12px 16px;border-radius:12px;background:var(--ink);color:var(--ground);font:600 14px/1.3 var(--font-sans);box-shadow:0 8px 28px rgba(0,0,0,.25);transition:opacity .2s,transform .3s var(--ease);max-width:calc(100vw - 32px)}
.toast.on{opacity:1;transform:translate(-50%,0)}
.toast svg{color:var(--ok)}
.fab{position:fixed;right:max(16px,env(safe-area-inset-right));bottom:max(16px,env(safe-area-inset-bottom));z-index:25}
.fab .btn{border-radius:50%;width:48px;height:48px;background:var(--ink);color:var(--ground);border-color:var(--ink);box-shadow:0 6px 18px rgba(0,0,0,.25)}
.fab .btn.hid{visibility:hidden}
footer{padding:36px 0 88px;font-size:13.5px;line-height:1.6;color:var(--muted);max-width:var(--measure)}
footer b{color:var(--ink)}

/* ---------- exam mode ---------- */
dialog.exam{width:min(860px,100vw)}
.timer{font:600 15px/1 var(--font-mono);padding:8px 10px;border-radius:8px;background:var(--surface-2);display:inline-flex;align-items:center;gap:6px}
.timer.low{color:var(--no)}
.exsetup{display:grid;gap:18px}
.exsetup .fld>b{display:block;font:600 14.5px/1.3 var(--font-sans);margin-bottom:8px}
.exsetup .seg{display:flex;gap:6px;flex-wrap:wrap}
.exsetup p.note{margin:0;color:var(--muted);font-size:14px}
.exhist{list-style:none;margin:0;padding:0;display:grid;gap:4px;font-size:14px}
.exhist li{display:flex;justify-content:space-between;gap:12px;padding:8px 0;border-bottom:1px solid var(--hair-2);color:var(--muted)}
.exhist li b{color:var(--ink);font-family:var(--font-mono)}
.exq .flag[aria-pressed="true"]{background:var(--surface);color:var(--accent);border-color:var(--accent)}
.brk{width:100%;border-collapse:collapse;font-size:14px;margin:6px 0 4px}
.brk th{text-align:start;font:600 12.5px/1.3 var(--font-sans);color:var(--muted);padding:8px 0;padding-inline-end:8px;border-bottom:1px solid var(--hair)}
.brk td{padding:8px 0;padding-inline-end:8px;border-bottom:1px solid var(--hair-2);vertical-align:middle}
.brk td.m{font-family:var(--font-mono);white-space:nowrap;width:1%}
.brk .bar2{display:block;height:6px;border-radius:3px;background:var(--hair-2);overflow:hidden;min-width:60px}
.brk .bar2 i{display:block;height:100%;background:var(--sec,var(--accent));border-radius:3px}
.exrev{list-style:none;margin:16px 0 0;padding:0;display:grid;gap:10px}
.exrev>li{background:var(--surface);border:1px solid var(--hair);border-inline-start:3px solid var(--ok);border-radius:10px;padding:12px 14px;font-size:14.5px}
.exrev>li.no{border-inline-start-color:var(--no)}
.exrev>li.skip{border-inline-start-color:var(--hair)}
.exrev .qh{display:flex;justify-content:space-between;gap:12px;font:500 12.5px/1.3 var(--font-sans);color:var(--muted);margin-bottom:6px}
.exrev .qq{font-size:15px;margin-bottom:8px}
.exrev .ans{display:grid;gap:4px;margin:0 0 8px}
.exrev .ans>span{display:flex;gap:8px;align-items:baseline}
.exrev .ans b{flex:none;font:600 12.5px/1.3 var(--font-sans);color:var(--muted);width:92px}
.exrev .x{color:var(--muted);font-size:14px}
.h3s{font:600 16px/1.3 var(--font-sans);margin:24px 0 8px}

/* ---------- library home ---------- */
.home{max-width:1160px;margin:0 auto;padding:0 16px;display:grid;grid-template-columns:minmax(0,1fr);grid-template-areas:"hero" "side" "lib" "foot";column-gap:40px}
@media (min-width:1000px){.home{padding:0 28px;grid-template-columns:minmax(0,1fr) 340px;grid-template-areas:"hero side" "lib side" "foot side"}
  .today{position:sticky;top:calc(var(--bar-h) + 44px);align-self:start;margin-top:44px}}
.hhero{padding:40px 0 24px;grid-area:hero}
.home>.today{grid-area:side}.home>.lib{grid-area:lib}.home>footer{grid-area:foot}
.hhero h1{max-width:18ch}
.today{display:grid;grid-template-columns:1fr;gap:12px;margin:0 0 28px;align-content:start}
@media (min-width:640px) and (max-width:999px){.today{grid-template-columns:1fr 1fr}}
.tcard{background:var(--surface);border:1px solid var(--hair);border-radius:14px;padding:16px;display:flex;flex-direction:column;gap:12px}
.tcard .lbl{font:600 14.5px/1.3 var(--font-sans);display:flex;align-items:center;gap:8px}
.tcard .lbl svg{color:var(--muted)}
.tcard .big{font:600 44px/1 var(--font-mono);letter-spacing:-.02em;text-box:trim-both cap alphabetic;margin:4px 0}
.tcard .sub{font-size:14px;color:var(--muted);line-height:1.45;margin:0}
.tcard .row{display:flex;align-items:center;justify-content:space-between;gap:12px}
.tcard .act{display:flex;justify-content:flex-end;margin-top:auto}
.tcard .ct{font:600 16px/1.35 var(--font-sans);margin:0;min-width:0}
.tcard .ct small{display:block;font:500 13.5px/1.4 var(--font-sans);color:var(--muted);margin-top:4px}
.tcard .chs{display:flex;flex-wrap:wrap;gap:4px 12px;font-size:13.5px;color:var(--muted);margin:0}
.tcard .chs b{font-family:var(--font-mono);color:var(--ink);font-weight:600}
.lib .ph3{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin:0 0 12px}
.lib .ph3 h2{margin:0;font-size:17px}
.lib .ph3 span{font-size:13.5px;color:var(--muted)}
.chl{list-style:none;margin:0 0 28px;padding:0;display:grid;gap:6px}
.chl a{display:grid;grid-template-columns:40px minmax(0,1fr) auto 16px;gap:12px;align-items:center;padding:12px 14px;padding-inline-start:8px;border-radius:12px;background:var(--surface);
  border:1px solid var(--hair);border-bottom-color:color-mix(in srgb,var(--ink) 18%,var(--hair));box-shadow:var(--press);text-decoration:none;color:var(--ink);min-height:72px;transition:transform .08s,border-color .12s;margin:4px 0}
.chl a:hover{border-color:var(--accent)}
.chl a:active{transform:translateY(2px);box-shadow:none}
.chl a>svg.i{color:var(--muted)}
.chl .no2{font:600 15px/1 var(--font-mono);color:var(--muted);text-align:center}
.chl a .no2{color:var(--accent)}
.chl .tt{font:600 15.5px/1.3 var(--font-sans);min-width:0}
.chl .tt small{display:block;font:400 13px/1.4 var(--font-sans);color:var(--muted);margin-top:4px}
.chl .soon{display:grid;grid-template-columns:40px minmax(0,1fr) auto;gap:12px;align-items:center;padding:8px 14px;padding-inline-start:8px;min-height:44px;color:var(--muted);border-bottom:1px solid var(--hair-2)}
.chl li:has(+li>a) .soon,.chl li:last-child .soon{border-bottom:0}
.chl .soon .tt{font-weight:500;font-size:14.5px}
.chl .soon .pill{font:500 12.5px/1 var(--font-sans)}
.chl .due{font:600 13px/1 var(--font-sans);color:var(--accent)}
.ldr{display:flex;align-items:center;gap:10px;color:var(--muted);font-size:14.5px;padding:24px 0}
.offline{display:flex;align-items:center;gap:8px}
.offline:empty{display:none}

/* ================================================================ v9: language switch, Arabic, RTL */
/* language switch: one raised pill, two segments; the current language is pressed */
.lsw{display:inline-flex;flex:none;align-items:stretch;gap:2px;padding:3px;height:42px;border:1px solid var(--hair);border-bottom-color:color-mix(in srgb,var(--ink) 22%,var(--hair));border-radius:var(--r-s);background:var(--surface);box-shadow:var(--press)}
.lsw .btn{min-height:0;min-width:0;height:auto;width:30px;padding:0;border:0;border-radius:5px;box-shadow:none;background:none;color:var(--muted);font:600 12.5px/1 var(--font-sans)}
.lsw .btn[lang="ar"]{font:600 16px/1 var(--font-sans)}
.lsw .btn:hover{background:var(--surface-2);color:var(--ink)}
.lsw .btn:active{transform:none}
.lsw .btn[aria-pressed="true"]{background:var(--ink);color:var(--ground)}
.dh .lsw{height:42px}
/* a section shown in English inside an Arabic page */
.fbnote{display:flex;align-items:center;gap:8px;margin:0 0 10px;padding:8px 12px;border:1px dashed var(--hair);border-radius:var(--r-s);font:500 13.5px/1.5 var(--font-sans);color:var(--muted);background:var(--surface)}
.fbnote svg{color:var(--muted)}
/* DSM box in Arabic: unofficial mark + the verbatim English original one tap away */
.box>b:first-child .unoff{margin-inline-start:auto;font:600 11.5px/1 var(--font-sans);color:var(--muted);border:1px solid var(--hair);border-radius:999px;padding:4px 8px;white-space:nowrap}
details.dsm-en{margin:12px 0 0;border-top:1px solid var(--hair-2);padding-top:10px}
details.dsm-en>summary{display:inline-flex;align-items:center;gap:8px;min-height:38px;padding:0 12px;border:1px solid var(--hair);border-bottom-color:color-mix(in srgb,var(--ink) 22%,var(--hair));border-radius:var(--r-s);background:var(--surface);box-shadow:var(--press);font:600 13px/1.2 var(--font-sans);color:var(--ink)}
details.dsm-en>summary svg.i{color:oklch(var(--L) var(--C) var(--hue))}
details.dsm-en>summary .chev{margin-inline-start:4px;color:var(--muted)}
details.dsm-en[open]>summary{box-shadow:none;background:var(--surface-2)}
.dsm-o{margin-top:10px;padding:10px 12px;border-radius:var(--r-s);background:var(--surface-2);font:400 14px/1.55 var(--font-sans);text-align:left}
.dsm-o p:last-child,.dsm-o ul:last-child,.dsm-o ol:last-child{margin-bottom:0}
.dsm-o ul,.dsm-o ol{padding-inline-start:1.15em}
/* home: Arabic translation status per chapter */
.chl .trs{display:inline-flex;align-items:center;gap:4px;white-space:nowrap}
.chl .trs svg{width:14px;height:14px;vertical-align:-2px}
.chl .trs.full{color:var(--ok)}
.hero h1 span:empty{display:none}

/* ---------- RTL: what logical properties cannot express ---------- */
:dir(rtl)>svg.i.dx{transform:scaleX(-1)}
.ring:dir(rtl)>svg{transform:rotate(-90deg) scaleY(-1)}

.fab:dir(rtl){right:auto;left:max(16px,env(safe-area-inset-left))}
/* figures inherit the section's direction: an Arabic copy is mirrored by its author (SPEC-AR.md), so text-anchor
   "start" means the right end there; the single-file Arabic body is swapped in before first paint */
html.sg-swap body{visibility:hidden}

/* ---------- Arabic typography: bigger leading, no tracking, no synthetic italics ---------- */
:lang(ar){letter-spacing:0}
body:lang(ar){line-height:1.8}
.hero h1:lang(ar){line-height:1.3;letter-spacing:0}
.hero h1:lang(ar) span{line-height:1.7}
.plate h2:lang(ar){line-height:1.4;letter-spacing:0}
.plate .lede:lang(ar){line-height:1.7}
.body h3:lang(ar){line-height:1.5;letter-spacing:0}
.body h4:lang(ar),.body h5:lang(ar){line-height:1.5}
.body li:lang(ar),.box:lang(ar),.cmp>div:lang(ar),.snap table:lang(ar),table.t:lang(ar),dl.defs dd:lang(ar),ol.flow li:lang(ar),ol.tl li:lang(ar),.how div:lang(ar){line-height:1.75}
details.hy li:lang(ar),.expl:lang(ar),.qstem:lang(ar),.rapid .q:lang(ar),.rapid .a:lang(ar),.exrev:lang(ar){line-height:1.75}
.qq:lang(ar){line-height:1.7}
.opt:lang(ar),.mi:lang(ar),.chip:lang(ar){line-height:1.6}
.card .face:lang(ar){line-height:1.75}
.body em:lang(ar),.body i:lang(ar),.box em:lang(ar),.box i:lang(ar),.expl em:lang(ar),.card em:lang(ar){font-style:normal;font-weight:600}
.box.pearl:lang(ar){font-family:var(--font-sans);font-size:15.5px}
.btn>span:lang(ar),.ring b:lang(ar),.tcard .big:lang(ar){text-box:normal}
.tcard .big:lang(ar){letter-spacing:0}
.kicker:lang(ar),.plate .band .no:lang(ar){line-height:1.6}
.bar .id:lang(ar){line-height:1.5}
.sres .x:lang(ar),.tcard .sub:lang(ar),.chl .tt small:lang(ar),.index .t small:lang(ar){line-height:1.65}
/* Latin runs inside Arabic are isolated by the build and by app.js (<bdi>), so they never reorder their neighbours */
bdi{unicode-bidi:isolate}

@media print{.bar,.ruler,.rail,.fab,.practice,.plate .acts,.dash,.toast{display:none!important}body{background:#fff}}
