/* ---- revision (js/revise.js) ---- */
.rv-h{margin:26px 0 10px}


.rv-note{color:var(--muted);font-size:.82rem;margin:12px 0 0}
.rv-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:10px;margin-top:14px}
.rv-st{border:1px solid var(--line);border-radius:10px;background:var(--card);padding:10px 12px;display:flex;flex-direction:column;gap:2px;min-width:0}
.rv-st b{font:400 1.6rem/1.1 "Share Tech Mono",ui-monospace,monospace;color:var(--sage-d)}
.rv-st span{color:var(--muted);font-size:.8rem}
.rv-go{margin-top:14px}
.rv-bar{height:6px;border-radius:99px;background:color-mix(in srgb,var(--muted) 18%,transparent);overflow:hidden;margin:10px 0 6px}
.rv-bar i{display:block;height:100%;background:var(--sage);border-radius:inherit;transition:width .4s var(--ease)}
.rv-decks,.rv-add{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(280px,100%),1fr));gap:12px}
.rv-deck,.rv-sd{display:flex;flex-direction:column;gap:6px;margin:0}
.rv-deck .spread{gap:8px;align-items:flex-start}
.rv-dn{font-weight:700;font-size:1.05rem;color:var(--ink);text-decoration:none;min-width:0}.rv-dn:hover{color:var(--sage-d)}
.rv-ex,.rv-dm{margin:0;color:var(--muted);font-size:.84rem}.rv-dm b{color:var(--ink)}
.rv-deck .row,.rv-sd .row{margin-top:auto;padding-top:6px}
.rv-sd .lede{margin:0;font-size:.86rem}


.rv-body{min-width:0}
/* a study card */
.rv-sess{max-width:760px;margin:14px auto 0}
.rv-sh{gap:10px;align-items:center;margin-bottom:12px}.rv-from{font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rv-left{margin-left:auto;color:var(--muted);font-size:.84rem;white-space:nowrap}
.rv-card{border:1px solid var(--line);border-radius:12px;background:var(--paper);padding:26px 22px;min-height:150px;display:flex;flex-direction:column;justify-content:center;gap:14px;text-align:center}
.rv-q{font-size:1.25rem;font-weight:600;line-height:1.4;overflow-wrap:anywhere}
.rv-a{font-size:1.15rem;color:var(--sage-d);font-weight:700;padding-top:14px;border-top:1px dashed var(--line);overflow-wrap:anywhere;animation:rise .25s var(--ease)}
.rv-x{margin:0;color:var(--muted);font-size:.92rem;line-height:1.5;overflow-wrap:anywhere}
.rv-act{justify-content:center;margin-top:14px}
.rv-act kbd,.rv-o kbd{font:400 .7rem "Share Tech Mono",ui-monospace,monospace;border:1px solid currentColor;border-radius:3px;padding:0 4px;opacity:.7;margin-left:6px}
.rv-grade{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-top:14px}
.rv-g{display:flex;flex-direction:column;align-items:center;gap:2px;padding:10px 6px}
.rv-g small{color:var(--muted);font-size:.74rem;font-weight:400}
.rv-g.bad{border-color:var(--danger)}.rv-g.bad b{color:var(--danger)}.rv-g.warn{border-color:var(--blue)}.rv-g.ok b{color:var(--done)}
/* quiz */
.rv-opts{display:grid;gap:8px;margin-top:14px}
.rv-o{display:flex;align-items:center;gap:10px;text-align:left;padding:10px 12px;justify-content:flex-start}
.rv-o kbd{margin:0;flex:none}.rv-o span{overflow-wrap:anywhere}
.rv-o.right{border-color:var(--done);background:color-mix(in srgb,var(--done) 14%,transparent);opacity:1}
.rv-o.wrong{border-color:var(--danger);background:color-mix(in srgb,var(--danger) 14%,transparent);opacity:1}
.rv-o.dim{opacity:.5}
.rv-fb{margin:12px 0 0;line-height:1.5}.rv-fb.ok{color:var(--done)}.rv-fb.bad{color:var(--danger)}
.rv-done{text-align:center}.rv-done .row{justify-content:center}
.rv-wrong{list-style:none;margin:8px 0 14px;padding:0;text-align:left;display:flex;flex-direction:column;gap:8px}
.rv-wrong li{border:1px solid var(--line);border-radius:8px;padding:8px 10px;display:flex;flex-direction:column;gap:2px}
.rv-wrong span{color:var(--sage-d);font-weight:600}.rv-wrong small{color:var(--muted)}
/* coming up chart */
.rv-fc{margin-top:14px}
.rv-fcb{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:8px;align-items:end;height:120px;margin-top:8px}
.rv-fcb>div{display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%;gap:3px}
.rv-fcb i{display:block;width:100%;max-width:34px;min-height:2px;background:var(--sage);border-radius:4px 4px 0 0}
.rv-fcb b{font:400 .8rem "Share Tech Mono",ui-monospace,monospace}.rv-fcb span{color:var(--muted);font-size:.72rem}
/* cards list */
.rv-form{margin-bottom:12px}.rv-form textarea,.rv-imp textarea,#rv-notes{width:100%;resize:vertical}
.rv-imp{margin-bottom:12px}.rv-imp summary{cursor:pointer;font-weight:600}
.rv-cq{width:100%;margin:4px 0 10px}
.rv-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}
.rv-list li{display:flex;gap:10px;align-items:flex-start;justify-content:space-between;border:1px solid var(--line);border-radius:8px;padding:9px 11px;background:var(--card)}
.rv-list li>div:first-child{display:flex;flex-direction:column;gap:2px;min-width:0}
.rv-list b{overflow-wrap:anywhere}.rv-list span{color:var(--sage-d);overflow-wrap:anywhere}.rv-list small{color:var(--muted);overflow-wrap:anywhere}
.rv-li{display:flex;gap:4px;align-items:center;flex:none}
.rv-set{display:flex;flex-direction:column;gap:12px}
/* practice modes */
.rv-pl{margin:0 0 12px}
.rv-modes{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(230px,100%),1fr));gap:12px}
.rv-mode{all:unset;box-sizing:border-box;display:flex;flex-direction:column;gap:5px;padding:16px;border:1px solid var(--line);border-radius:12px;background:var(--card);cursor:pointer;
  transition:border-color .2s,box-shadow .25s,translate .3s var(--navease,ease)}
.rv-mode:hover:not([disabled]),.rv-mode:focus-visible{border-color:var(--sage);box-shadow:0 0 18px -4px var(--glow);translate:0 -2px}
.rv-mode:focus-visible{outline:2px solid var(--sage);outline-offset:2px}
.rv-mode[disabled]{opacity:.45;cursor:default}
.rv-mi{width:38px;height:38px;display:grid;place-items:center;border-radius:10px;background:var(--sage-l);color:var(--sage-d);font-size:1.15rem;font-weight:700;margin-bottom:4px}
.rv-mode b{font-size:1.05rem}.rv-md{color:var(--muted);font-size:.86rem;line-height:1.4}.rv-mode small{color:var(--sage-d);font-size:.76rem;margin-top:auto;min-height:1em}
.rv-seqs{margin-top:12px}.rv-seqs .row{gap:6px}
.rv-hint{margin:0 0 10px;color:var(--muted);font-size:.86rem}
.rv-wide{max-width:980px}
.rv-tag{align-self:center;font:400 .7rem "Share Tech Mono",ui-monospace,monospace;letter-spacing:.08em;text-transform:uppercase;color:var(--blue-ink);border:1px solid currentColor;border-radius:3px;padding:1px 6px}
.rv-scen .rv-q{font-size:1.05rem;font-weight:500;text-align:left}
/* match */
.rv-mg{display:grid;grid-template-columns:1fr 1fr;gap:10px}.rv-mg>div{display:flex;flex-direction:column;gap:8px}
.rv-mc{text-align:left;padding:10px 12px;line-height:1.35;min-height:52px;overflow-wrap:anywhere;transition:border-color .15s,background-color .2s,opacity .3s,transform .25s var(--navease,ease)}
.rv-mc.sel{border-color:var(--sage);background:var(--sage-l);color:var(--sage-d)}
.rv-mc.done{opacity:.25;transform:scale(.97);border-style:dashed}
.rv-mc.bad{border-color:var(--danger);animation:rv-shake .35s}
@keyframes rv-shake{20%,60%{translate:-4px 0}40%,80%{translate:4px 0}}
/* type it */
.rv-tyrow{display:flex;gap:8px;margin-top:14px}.rv-tyrow input{flex:1;min-width:0;font-size:1.05rem}
.rv-tyrow input.ok{border-color:var(--done)}.rv-tyrow input.bad{border-color:var(--danger)}
/* speed round */
.rv-tf{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:14px}.rv-tf .rv-g{padding:16px 6px}.rv-tf b{font-size:1.1rem}
.rv-combo{color:var(--sage-d);font-weight:700}
#rv-clock{font:400 1rem "Share Tech Mono",ui-monospace,monospace;color:var(--ink)}
.rv-speed.f-ok .rv-card{animation:rv-ok .35s}.rv-speed.f-bad .rv-card{animation:rv-shake .35s}
@keyframes rv-ok{40%{box-shadow:0 0 0 2px var(--done),0 0 24px -4px var(--done)}}
/* order it */
.rv-ot{margin:0 0 10px;text-align:center}
.rv-ans{list-style:none;margin:0 0 12px;padding:0;display:flex;flex-direction:column;gap:6px;counter-reset:none}
.rv-slot{border:1px dashed var(--line);border-radius:8px;padding:10px 12px;color:var(--muted);font-size:.86rem;text-align:center}
.rv-pool{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;padding-top:10px;border-top:1px solid var(--line)}
.rv-oi{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;column-gap:10px;row-gap:2px;width:100%;text-align:left;padding:9px 12px}
.rv-pool .rv-oi{width:auto;display:block}
.rv-oi kbd{font:400 .72rem "Share Tech Mono",ui-monospace,monospace;border:1px solid currentColor;border-radius:3px;padding:0 5px;opacity:.7}
.rv-oi small{grid-column:2;color:var(--muted);font-size:.78rem}
.rv-oi.right{border-color:var(--done);background:color-mix(in srgb,var(--done) 12%,transparent);opacity:1}
.rv-oi.wrong{border-color:var(--danger);background:color-mix(in srgb,var(--danger) 10%,transparent);opacity:1}
@media (max-width:640px){.rv-mg{gap:6px}.rv-mc{padding:8px;font-size:.86rem}}
@media (prefers-reduced-motion:reduce){.rv-mc.bad,.rv-speed .rv-card{animation:none}.rv-mode{transition:none}}
/* learning by topic: a path of topics, then each topic as a readable lesson with a check and practice under it */
.rv-go small{font-weight:500;opacity:.8}
.rv-lhead{display:flex;flex-wrap:wrap;gap:12px 20px;align-items:center;justify-content:space-between;margin-bottom:16px}
.rv-lhead>div:first-child{display:flex;flex-direction:column;gap:3px;max-width:620px}.rv-lhead b{font-size:1.05rem}.rv-lhead span{color:var(--muted);font-size:.88rem;line-height:1.45}
.rv-path{list-style:none;margin:0;padding:0;position:relative;display:flex;flex-direction:column;gap:4px;max-width:820px}
.rv-path::before{content:"";position:absolute;left:21px;top:22px;bottom:22px;width:2px;background:var(--line);border-radius:2px}
.rv-step{all:unset;box-sizing:border-box;position:relative;display:grid;grid-template-columns:44px minmax(0,1fr) 120px;align-items:center;gap:14px;width:100%;padding:10px 12px 10px 0;border-radius:10px;cursor:pointer;transition:background-color .2s}
.rv-step:hover,.rv-step:focus-visible{background:color-mix(in srgb,var(--sage) 8%,transparent)}.rv-step:focus-visible{outline:2px solid var(--sage);outline-offset:1px}
.rv-sn{z-index:1;justify-self:center;width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font:400 .85rem "Share Tech Mono",ui-monospace,monospace;background:var(--paper);border:2px solid var(--line);color:var(--muted)}
.st-progress .rv-sn{border-color:var(--sage);color:var(--sage-d)}
.st-mastered .rv-sn{background:var(--sage);border-color:var(--sage);color:var(--paper);box-shadow:0 0 12px -2px var(--glow)}
.rv-stt{display:flex;flex-direction:column;gap:2px;min-width:0}.rv-stt b{font-size:1rem}.rv-stt small{color:var(--muted);font-size:.8rem}
.rv-path li{position:relative}
.rv-inc{position:absolute;right:-40px;top:50%;translate:0 -50%;z-index:2;width:32px;height:32px;padding:0;display:grid;place-items:center;opacity:0;transition:opacity .2s}
.rv-path li:hover .rv-inc,.rv-inc:focus-visible{opacity:1}
@media (hover:none),(max-width:900px){.rv-inc{right:4px;opacity:1}.rv-path li:has(.rv-inc) .rv-step{padding-right:44px}}
.rv-incl{padding:0 6px;min-height:0;font-size:.8rem;vertical-align:baseline}
.rv-sm{height:5px;border-radius:99px;background:color-mix(in srgb,var(--muted) 18%,transparent);overflow:hidden}.rv-sm i{display:block;height:100%;background:var(--sage);border-radius:inherit}
.rv-topic{max-width:780px;margin:0 auto}
.rv-tnav{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;color:var(--muted);font-size:.84rem}
.rv-lesson{padding:4px 0 8px}
.rv-lesson h2{margin:0 0 8px;font-size:1.7rem}
.rv-tmeta{display:flex;flex-direction:column;gap:2px;margin-bottom:18px}.rv-tmeta .rv-bar{margin:0;max-width:280px}.rv-tmeta span{color:var(--muted);font-size:.82rem}
.rv-lesson h3{margin:22px 0 6px;font-size:1.12rem;color:var(--sage-d)}
.rv-lesson p,.rv-lesson li{font-size:1rem;line-height:1.65;color:var(--ink)}
.rv-lesson p{margin:0 0 10px}.rv-lesson ul{margin:0 0 12px;padding-left:20px}.rv-lesson li{margin:3px 0}.rv-lesson li::marker{color:var(--sage)}
.rv-tip{border-left:3px solid var(--sage);background:color-mix(in srgb,var(--sage) 9%,transparent);padding:10px 14px;border-radius:0 8px 8px 0;margin:14px 0!important}
.rv-code{margin:6px 0 14px;padding:12px 14px;border:1px solid var(--line);border-radius:8px;background:var(--paper);overflow-x:auto;font:400 .9rem/1.55 "Share Tech Mono",ui-monospace,monospace;color:var(--sage-d)}
.rv-check,.rv-tprac{border-top:1px solid var(--line);padding-top:16px;margin-top:20px}
.rv-check h3,.rv-tprac h3{margin:0 0 6px}.rv-check .lede{margin:0 0 10px}
.rv-cq2{font-size:1.05rem;font-weight:600;line-height:1.45;margin:8px 0 2px}
.rv-check .rv-tag{display:inline-block;margin-top:6px}
.rv-tprac .row{gap:6px}
.rv-tfoot{display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;border-top:1px solid var(--line);padding-top:16px;margin-top:20px}
@media (max-width:640px){.rv-step{grid-template-columns:44px minmax(0,1fr)}.rv-sm{display:none}.rv-lesson h2{font-size:1.4rem}.rv-tfoot button{flex:1}}
/* course navigation: breadcrumb, an outline beside the content (a "Course menu" on phones) and a resume bar */
.rv-bc{display:flex;flex-wrap:wrap;align-items:center;gap:6px;font-size:.84rem;color:var(--muted);margin:0 0 6px}
.rv-bc a{color:var(--muted);text-decoration:none}.rv-bc a:hover{color:var(--sage-d);text-decoration:underline}.rv-bc [aria-current]{color:var(--ink)}
.rv-dh{margin-bottom:14px}
.rv-cw{display:grid;grid-template-columns:250px minmax(0,1fr);gap:30px;align-items:start}
.rv-outd{position:sticky;top:calc(var(--hh,64px) + 16px);max-height:calc(100vh - var(--hh,64px) - 32px);overflow:auto;scrollbar-width:thin}
.rv-outd>summary{display:none}
.rv-out{display:flex;flex-direction:column;gap:1px;padding-right:6px;border-right:1px solid var(--line)}
.rv-oh{display:flex;justify-content:space-between;align-items:baseline;margin:12px 10px 4px;font:400 .72rem "Share Tech Mono",ui-monospace,monospace;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.rv-oh:first-child{margin-top:0}.rv-oh span{text-transform:none;letter-spacing:0}
.rv-ol,.rv-ot{display:flex;align-items:center;gap:9px;padding:7px 10px;border-radius:8px;text-decoration:none;color:var(--ink);font-size:.9rem;line-height:1.3;transition:background-color .15s,color .15s}
.rv-ol:hover,.rv-ot:hover{background:color-mix(in srgb,var(--sage) 9%,transparent)}
.rv-ol.on,.rv-ot.on{background:var(--sage-l);color:var(--sage-d);font-weight:700}
.rv-ol small{margin-left:auto;color:var(--blue-ink);font-size:.74rem;font-weight:600}
.rv-otl{list-style:none;margin:0;padding:0}
.rv-ot i{flex:none;width:20px;height:20px;border-radius:50%;display:grid;place-items:center;font:normal 400 .7rem "Share Tech Mono",ui-monospace,monospace;border:1.5px solid var(--line);color:var(--muted)}
.rv-ot.st-progress i{border-color:var(--sage);color:var(--sage-d)}.rv-ot.st-mastered i{background:var(--sage);border-color:var(--sage);color:var(--paper)}
.rv-ol,.rv-ot{text-align:left}.rv-ot span{min-width:0}
.rv-resume{display:flex;flex-wrap:wrap;gap:10px 16px;align-items:center;justify-content:space-between;margin:0 0 16px;padding:10px 14px;border:1px solid var(--sage);border-radius:10px;background:var(--sage-l);color:var(--sage-d);font-weight:600}
.rv-resume .row{margin:0;gap:6px}
@media (max-width:899px){
  .rv-cw{grid-template-columns:minmax(0,1fr);gap:14px}
  .rv-outd{position:static;max-height:none;border:1px solid var(--line);border-radius:10px;background:var(--card)}
  .rv-outd>summary{display:flex;align-items:center;gap:6px;padding:10px 14px;cursor:pointer;font-weight:700;list-style:none}
  .rv-outd>summary::-webkit-details-marker{display:none}
  .rv-outd>summary::after{content:"▾";margin-left:auto;transition:rotate .25s}.rv-outd[open]>summary::after{rotate:180deg}
  .rv-outd>summary span{font-weight:500;color:var(--muted);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .rv-out{border-right:0;padding:0 8px 10px}}
/* home tile */
.rv-tile{gap:6px}
.rv-tn{display:flex;align-items:baseline;gap:8px;margin-top:4px}
.rv-tn strong{font:400 clamp(1.6rem,min(16cqi,30cqh),3rem)/1 "Share Tech Mono",ui-monospace,monospace;color:var(--sage-d)}
.rv-tn span{color:var(--muted);font-size:.84rem}
.rv-tm{margin:0;color:var(--muted);font-size:.8rem}
@media (max-width:640px){.rv-grade{grid-template-columns:repeat(2,minmax(0,1fr))}.rv-card{padding:20px 14px}.rv-q{font-size:1.1rem}}
