:root{--brand-blue: #1E3A8A;--brand-yellow: #F3C12E;--brand-sky: #3FA9F5;--brand-mint: #00B9B0;--brand-green: #28C76F;--brand-purple: #6C5CE7;--brand-pink: #EB6393;--ink: #333F48;--ink-2: #5A6672;--ink-3: #94A0AD;--paper: #F7F9FC;--panel: #FFFFFF;--grid: #E7ECF3;--line: #E4E9F0;--ict: #1E3A8A;--ict-soft: #E7ECF9;--cs: #00B9B0;--cs-soft: #DBF5F3;--pen: #EB6393;--pen-soft: #FCE7EF;--ok: #28C76F;--ok-soft: #E0F7EB;--warn: #F3C12E;--warn-soft:#FDF3D6;--grad: linear-gradient(135deg, #1E3A8A 0%, #3FA9F5 55%, #00B9B0 100%);--grad-cool: linear-gradient(135deg, #1E3A8A 0%, #3FA9F5 100%);--grad-warm: linear-gradient(135deg, #EB6393 0%, #F3C12E 100%);--grad-mint: linear-gradient(135deg, #00B9B0 0%, #28C76F 100%);--r: 16px;--r-s: 11px;--sh: 0 2px 4px rgba(30,58,138,.05), 0 14px 34px -14px rgba(30,58,138,.22);--f-disp: "Be Vietnam Pro", "Montserrat", system-ui, -apple-system, "Segoe UI", sans-serif;--f-body: "Montserrat", "Be Vietnam Pro", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--f-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", "Cascadia Code", Consolas, monospace}*{box-sizing:border-box}html,body{margin:0;padding:0}body{font-family:var(--f-body);color:var(--ink);background-color:var(--paper);background-image:radial-gradient(70ch 60ch at 108% -12%,rgba(63,169,245,.12),transparent 60%),radial-gradient(60ch 50ch at -8% 108%,rgba(0,185,176,.1),transparent 60%);background-attachment:fixed;font-size:15.5px;line-height:1.65;-webkit-font-smoothing:antialiased}h1,h2,h3,h4{font-family:var(--f-disp);font-weight:600;letter-spacing:-.015em;margin:0}code,kbd,pre{font-family:var(--f-mono)}button,input,select,textarea{font:inherit;color:inherit}a{color:var(--ict)}.app{display:grid;grid-template-columns:276px minmax(0,1fr);min-height:100vh}.rail{border-right:1px solid var(--line);background:#ffffffdb;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);padding:20px 16px 32px;position:sticky;top:0;height:100vh;overflow-y:auto}.brand{display:flex;align-items:baseline;gap:8px;margin-bottom:4px;cursor:pointer}.brand b{font-family:var(--f-disp);font-size:19px;letter-spacing:-.02em}.brand .dot{width:9px;height:9px;border-radius:50%;background:var(--grad);display:inline-block}.brand b{background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}.brand small{color:var(--ink-3);font-size:11.5px;letter-spacing:.04em;text-transform:uppercase}.rail h5{font:600 11px/1 var(--f-body);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);margin:26px 0 10px}.booklink{display:block;width:100%;text-align:left;border:1px solid var(--line);background:var(--panel);border-radius:var(--r);padding:11px 12px;margin-bottom:8px;cursor:pointer;transition:.15s;position:relative;overflow:hidden}.booklink:hover{border-color:var(--ink-3);transform:translateY(-1px)}.booklink.on{border-color:var(--ict);background:var(--ict-soft);box-shadow:var(--sh)}.booklink:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--tint, var(--ink-3))}.booklink strong{display:block;font-family:var(--f-disp);font-size:14.5px}.booklink span{display:block;font-size:12px;color:var(--ink-3);margin-top:1px}.booklink .bar{height:3px;border-radius:2px;background:var(--line);margin-top:8px;overflow:hidden}.booklink .bar i{display:block;height:100%;background:var(--tint);border-radius:2px;transition:width .4s}.railnav button{display:flex;align-items:center;gap:9px;width:100%;text-align:left;border:0;background:none;padding:8px 10px;border-radius:var(--r-s);cursor:pointer;color:var(--ink-2);font-size:14px}.railnav button:hover{background:#f1f4f9;color:var(--ink)}.railnav button.on{background:var(--grad);color:#fff;box-shadow:0 6px 16px -8px #1e3a8a80}.railnav button svg{flex:0 0 16px}.main{padding:30px 34px 90px;max-width:1080px}.eyebrow{font:600 11.5px/1 var(--f-body);letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3)}.muted{color:var(--ink-2)}.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--sh)}.tag{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;letter-spacing:.04em;padding:3px 8px;border-radius:999px;text-transform:uppercase}.tag.chung{background:#eef1f6;color:var(--ink-2)}.tag.ict{background:var(--ict-soft);color:var(--ict)}.tag.cs{background:var(--cs-soft);color:var(--cs)}.pill{font-size:11px;font-weight:700;padding:2px 7px;border-radius:5px;letter-spacing:.04em}.pill.NB{background:#eef1f6;color:var(--ink-2)}.pill.TH{background:var(--ict-soft);color:var(--ict)}.pill.VD{background:var(--warn-soft);color:var(--warn)}.pill.VDC{background:var(--pen-soft);color:var(--pen)}.btn{border:0;background:var(--grad);color:#fff;border-radius:999px;padding:10px 20px;cursor:pointer;font-weight:600;transition:transform .15s,box-shadow .15s,filter .15s;font-size:14px;box-shadow:0 6px 16px -6px #1e3a8a80}.btn:hover{transform:translateY(-2px);box-shadow:0 12px 26px -8px #1e3a8a8c;filter:saturate(1.08)}.btn:active{transform:translateY(0)}.btn:disabled{opacity:.45;cursor:not-allowed;transform:none;box-shadow:none;filter:grayscale(.3)}.btn.ghost{background:var(--panel);color:var(--ict);border:1.5px solid var(--ict-soft);box-shadow:none}.btn.ghost:hover{border-color:var(--ict);background:var(--ict-soft);box-shadow:0 6px 16px -8px #1e3a8a59}.btn.run{background:var(--grad-cool);box-shadow:0 6px 16px -6px #00b9b073}.btn.sm{padding:7px 14px;font-size:13px}.hero{margin-bottom:34px}.hero h1{font-size:clamp(28px,4vw,40px);line-height:1.12;max-width:15ch}.hero h1 em{font-style:normal;position:relative;white-space:nowrap}.hero h1 em{background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}.hero h1 em:after{content:"";position:absolute;left:-2px;right:-2px;bottom:-1px;height:10px;background:var(--grad);opacity:.22;border-radius:999px;transform:rotate(-.6deg)}.hero p{color:var(--ink-2);max-width:56ch;margin-top:12px}.grid3{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:16px}.bookcard{padding:20px;cursor:pointer;transition:.18s;position:relative;overflow:hidden}.bookcard:hover{transform:translateY(-3px);box-shadow:0 18px 40px -16px #1e3a8a4d}.bookcard:after{content:"";position:absolute;inset:0 0 auto;height:4px;background:var(--tint)}.bookcard h3{font-size:20px;margin-bottom:2px}.bookcard .sub{color:var(--ink-3);font-size:13px}.bookcard .meta{margin-top:14px;font-size:13px;color:var(--ink-2)}.bookcard .bar{height:5px;background:#eef1f6;border-radius:3px;margin-top:14px;overflow:hidden}.bookcard .bar i{display:block;height:100%;background:var(--tint);border-radius:3px;transition:width .5s}.cd{margin-bottom:26px}.cd>h3{font-size:15px;display:flex;align-items:center;gap:10px;margin-bottom:10px}.cd>h3 .num{font-family:var(--f-mono);font-size:11px;background:var(--ink);color:#fff;border-radius:4px;padding:2px 6px;letter-spacing:.04em}.bailist{display:grid;gap:6px}.bai{display:grid;grid-template-columns:44px 1fr auto;align-items:center;gap:12px;background:var(--panel);border:1px solid var(--line);border-radius:var(--r-s);padding:10px 12px;cursor:pointer;transition:.13s}.bai:hover{border-color:var(--ink-3);transform:translate(2px)}.bai .n{font-family:var(--f-mono);font-size:12.5px;color:var(--ink-3)}.bai .t{font-size:14.5px}.bai.locked{opacity:.55;cursor:default}.bai.locked:hover{transform:none;border-color:var(--line)}.bai .done{color:var(--ok);font-size:12px;font-weight:600}.crumb{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--ink-3);margin-bottom:14px}.crumb button{border:0;background:none;padding:0;cursor:pointer;color:var(--ink-2)}.crumb button:hover{color:var(--ink);text-decoration:underline}.lesson h1{font-size:clamp(24px,3vw,32px);line-height:1.2;margin-bottom:8px}.goals{border-left:3px solid var(--ict);padding:4px 0 4px 16px;margin:22px 0}.goals ul{margin:6px 0 0;padding-left:18px}.blk{margin:22px 0}.blk.khoidong,.blk.kt,.blk.hd,.blk.vd{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:18px 22px;box-shadow:0 2px 10px -8px #1e3a8a40}.blk.khoidong{background:linear-gradient(135deg,#fff,var(--warn-soft));border-color:#f3e4be}.blk.hd{border-left:4px solid var(--ict)}.blk.vd{border-left:4px solid var(--cs)}.blk-head{display:flex;align-items:center;gap:9px;margin-bottom:10px}.blk-head .ic{width:30px;height:30px;border-radius:9px;display:grid;place-items:center;font-size:15px;flex:0 0 30px}.blk-head h4{font-size:15px;letter-spacing:.01em;font-family:var(--f-disp);margin:0}.blk.khoidong .prose>:first-child,.blk.kt .prose>:first-child,.blk.hd .prose>:first-child,.blk.vd .prose>:first-child{margin-top:0}.blk.khoidong .prose>:last-child,.blk.kt .prose>:last-child,.blk.hd .prose>:last-child,.blk.vd .prose>:last-child{margin-bottom:0}.blk.khoidong .ic{background:var(--warn-soft)}.blk.hd .ic,.blk.kt .ic{background:var(--ict-soft)}.blk.vd .ic{background:var(--cs-soft)}.box{background:linear-gradient(135deg,var(--ict-soft),#EAF3FE);border:0;border-left:4px solid var(--ict);border-radius:var(--r);padding:16px 18px}.box .lbl{font:600 11px/1 var(--f-body);letter-spacing:.1em;text-transform:uppercase;color:var(--ict);margin-bottom:8px}.prose p{margin:.55em 0}.prose ul,.prose ol{margin:.5em 0;padding-left:22px}.prose li{margin:.25em 0}.prose code{background:#f0f3f7;border:1px solid var(--line);border-radius:4px;padding:1px 5px;font-size:.87em}.prose pre{background:var(--ink);color:#e7ecf3;border-radius:var(--r);padding:14px 16px;overflow-x:auto;font-size:13px;line-height:1.6;margin:12px 0}.prose pre code{background:none;border:0;padding:0;color:inherit;font-size:13px}.prose blockquote{border-left:3px solid var(--ink-3);margin:12px 0;padding:2px 0 2px 14px;color:var(--ink-2);font-style:italic}.prose table{border-collapse:collapse;margin:12px 0;font-size:14px;width:100%}.prose th,.prose td{border:1px solid var(--line);padding:7px 11px;text-align:left}.prose th{background:#f3f6fa;font-weight:600}.q{border:1px solid var(--line);border-radius:var(--r);background:var(--panel);padding:18px;margin:14px 0}.q-top{display:flex;align-items:center;gap:8px;margin-bottom:10px}.q-de{font-weight:500;margin-bottom:12px}.q-de p:first-child{margin-top:0}.opts{display:grid;gap:7px}.opt{display:flex;align-items:flex-start;gap:10px;border:1px solid var(--line);border-radius:var(--r-s);padding:9px 12px;cursor:pointer;transition:.12s;background:var(--panel);text-align:left;width:100%}.opt:hover{border-color:var(--ink-3)}.opt .k{flex:0 0 22px;height:22px;border:1px solid var(--line);border-radius:5px;display:grid;place-items:center;font:600 11px/1 var(--f-mono);color:var(--ink-2)}.opt.sel{border-color:var(--ict);background:var(--ict-soft)}.opt.sel .k{background:var(--ict);color:#fff;border-color:var(--ict)}.opt.right{border-color:var(--ok);background:var(--ok-soft)}.opt.right .k{background:var(--ok);color:#fff;border-color:var(--ok)}.opt.wrong{border-color:var(--pen);background:var(--pen-soft)}.opt.wrong .k{background:var(--pen);color:#fff;border-color:var(--pen)}.opt:disabled{cursor:default}.tfrow{display:grid;grid-template-columns:1fr 60px 60px;align-items:center;gap:8px;padding:8px 0;border-bottom:1px solid var(--line)}.tfrow:last-child{border-bottom:0}.tfhead{font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3);font-weight:600}.tfbtn{border:1px solid var(--line);background:var(--panel);border-radius:var(--r-s);padding:5px 0;cursor:pointer;font-size:13px}.tfbtn.sel{border-color:var(--ict);background:var(--ict);color:#fff}.tfbtn.right{border-color:var(--ok);background:var(--ok);color:#fff}.tfbtn.wrong{border-color:var(--pen);background:var(--pen);color:#fff}.fill input{border:0;border-bottom:2px solid var(--ink-3);background:none;padding:4px 8px;font-family:var(--f-mono);font-size:15px;min-width:180px;outline:none}.fill input:focus{border-color:var(--ict)}.chips{display:flex;flex-wrap:wrap;gap:7px}.chip{border:1px solid var(--line);background:var(--panel);border-radius:var(--r-s);padding:7px 12px;cursor:grab;font-size:13.5px;-webkit-user-select:none;user-select:none}.chip.drag{opacity:.4}.chip.mono{font-family:var(--f-mono);font-size:12.5px}.dropzones{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:10px;margin-top:12px}.dz{border:1.5px dashed var(--line);border-radius:var(--r);padding:10px;min-height:96px;background:#fcfdfe}.dz.over{border-color:var(--ict);background:var(--ict-soft)}.dz h6{margin:0 0 8px;font:600 12px/1 var(--f-body);letter-spacing:.06em;text-transform:uppercase;color:var(--ink-2)}.dz .chip{margin-bottom:6px;display:block}.dz .chip.right{border-color:var(--ok);background:var(--ok-soft)}.dz .chip.wrong{border-color:var(--pen);background:var(--pen-soft)}.orderlist{display:grid;gap:6px}.orderitem{display:flex;align-items:center;gap:10px;border:1px solid var(--line);background:var(--panel);border-radius:var(--r-s);padding:8px 10px;cursor:grab}.orderitem .h{color:var(--ink-3);font-size:13px}.orderitem .txt{flex:1;font-family:var(--f-mono);font-size:13px;white-space:pre}.orderitem.right{border-color:var(--ok);background:var(--ok-soft)}.orderitem.wrong{border-color:var(--pen);background:var(--pen-soft)}.matchwrap{display:grid;grid-template-columns:1fr 1fr;gap:10px}.matchcol{display:grid;gap:6px}.mitem{border:1px solid var(--line);background:var(--panel);border-radius:var(--r-s);padding:9px 11px;cursor:pointer;font-size:13.5px;transition:.12s}.mitem.sel{border-color:var(--ict);background:var(--ict-soft)}.mitem.done{border-color:var(--ok);background:var(--ok-soft);cursor:default}.mitem.err{border-color:var(--pen);background:var(--pen-soft)}.mitem .badge{float:right;font-family:var(--f-mono);font-size:11px;color:var(--ink-3)}.fb{margin-top:12px;padding:11px 14px;border-radius:var(--r-s);font-size:14px;border-left:3px solid}.fb.ok{background:var(--ok-soft);border-color:var(--ok)}.fb.no{background:var(--pen-soft);border-color:var(--pen)}.fb b{font-family:var(--f-disp)}.fb .giai{margin-top:5px;color:var(--ink-2);font-size:13.5px}.qbar{display:flex;gap:8px;align-items:center;margin-top:14px;flex-wrap:wrap}.lab{border:1px solid var(--ink);border-radius:var(--r);overflow:hidden;box-shadow:var(--sh);margin:20px 0;background:var(--panel)}.lab-top{display:flex;align-items:center;gap:10px;padding:10px 14px;background:var(--ink);color:#fff}.lab-top .dots{display:flex;gap:5px}.lab-top .dots i{width:9px;height:9px;border-radius:50%;background:#3b4a61;display:block}.lab-top .dots i:first-child{background:var(--pen)}.lab-top strong{font:500 13px/1 var(--f-mono);letter-spacing:.02em}.lab-top .eng{margin-left:auto;font:600 10.5px/1 var(--f-body);letter-spacing:.1em;text-transform:uppercase;color:#93a3bc}.lab-de{padding:14px 16px;border-bottom:1px solid var(--line);background:#fbfcfe;font-size:14px}.lab-body{display:grid;grid-template-columns:1fr 1fr}.lab-body.one{grid-template-columns:1fr}.editor{position:relative;border-right:1px solid var(--line)}.editor textarea{width:100%;border:0;outline:none;resize:vertical;padding:12px 12px 12px 46px;font-family:var(--f-mono);font-size:13px;line-height:1.62;min-height:240px;background:transparent;tab-size:4;color:var(--ink);display:block}.gutter{position:absolute;left:0;top:0;bottom:0;width:38px;padding:12px 8px 12px 0;background:#f5f8fb;border-right:1px solid var(--line);font-family:var(--f-mono);font-size:12px;line-height:1.62;color:var(--ink-3);text-align:right;overflow:hidden;-webkit-user-select:none;user-select:none}.gutter span{display:block}.side{display:flex;flex-direction:column;min-width:0}.side .hd{padding:8px 14px;font:600 10.5px/1 var(--f-body);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);border-bottom:1px solid var(--line);background:#fbfcfe}.console{flex:1;background:var(--ink);color:#dce4ef;font-family:var(--f-mono);font-size:12.6px;padding:12px 14px;white-space:pre-wrap;overflow:auto;min-height:130px;line-height:1.6}.console .e{color:#ff9a9a}.console .ok{color:#7adfa8}.console .dim{color:#6c7e99}.stdin{border-top:1px solid var(--line)}.stdin textarea{width:100%;border:0;outline:none;resize:vertical;padding:10px 14px;min-height:56px;font-family:var(--f-mono);font-size:12.6px;background:#fbfcfe}.preview{flex:1;border:0;width:100%;background:#fff;min-height:220px}.lab-foot{display:flex;align-items:center;gap:8px;padding:10px 14px;border-top:1px solid var(--line);background:#fbfcfe;flex-wrap:wrap}.lab-foot .sp{flex:1}.tests{border-top:1px solid var(--line);padding:10px 14px;background:var(--panel)}.trow{display:flex;align-items:center;gap:9px;font-size:13px;padding:5px 0;font-family:var(--f-mono)}.trow .st{width:18px;height:18px;border-radius:5px;display:grid;place-items:center;font-size:11px;color:#fff;flex:0 0 18px}.trow.p .st{background:var(--ok)}.trow.f .st{background:var(--pen)}.trow .lb{color:var(--ink-2);font-size:12.4px}.trow .lb b{color:var(--ink)}.sqltable{overflow:auto;max-height:260px}.sqltable table{border-collapse:collapse;width:100%;font-size:13px;font-family:var(--f-mono)}.sqltable th{background:#f3f6fa;position:sticky;top:0}.sqltable th,.sqltable td{border:1px solid var(--line);padding:5px 9px;text-align:left;white-space:nowrap}.sqltable td.null{color:var(--ink-3);font-style:italic}.schema{padding:10px 14px;font-size:12.4px;font-family:var(--f-mono);color:var(--ink-2);border-top:1px solid var(--line);background:#fbfcfe}.schema b{color:var(--ink)}.sheet{overflow:auto;border-top:1px solid var(--line)}.sheet table{border-collapse:collapse;font-size:13px}.sheet th{background:#f3f6fa;font:600 11.5px/1 var(--f-mono);color:var(--ink-2);border:1px solid var(--line);padding:5px 8px;min-width:74px}.sheet th.rn{min-width:34px}.sheet td{border:1px solid var(--line);padding:0}.sheet td input{border:0;outline:none;padding:6px 8px;width:100%;min-width:86px;font-family:var(--f-mono);font-size:12.6px;background:transparent}.sheet td input:focus{background:var(--ict-soft);box-shadow:inset 0 0 0 2px var(--ict)}.sheet td.calc{background:#fbfcfe}.sheet td .val{padding:6px 8px;font-family:var(--f-mono);font-size:12.6px;color:var(--ink-2)}.sheet td .val.err{color:var(--pen)}.wg{border:1px solid var(--line);border-radius:var(--r);padding:16px;background:var(--panel);box-shadow:var(--sh)}.wg h4{font-size:14px;margin-bottom:12px}.bits{display:flex;gap:6px;flex-wrap:wrap;margin:8px 0 14px}.bit{text-align:center}.bit button{width:44px;height:46px;border:1px solid var(--line);background:var(--panel);border-radius:var(--r-s);font-family:var(--f-mono);font-size:18px;cursor:pointer;transition:.12s}.bit button.on{background:var(--ink);color:#fff;border-color:var(--ink)}.bit small{display:block;font-family:var(--f-mono);font-size:10.5px;color:var(--ink-3);margin-top:3px}.bitres{font-family:var(--f-mono);font-size:14px;background:#f5f8fb;border:1px solid var(--line);border-radius:var(--r-s);padding:10px 12px}.bitres b{color:var(--ict)}.setup{display:grid;gap:14px;max-width:620px}.seg{display:flex;gap:6px;flex-wrap:wrap}.seg button{border:1px solid var(--line);background:var(--panel);border-radius:999px;padding:6px 14px;cursor:pointer;font-size:13.5px}.seg button.on{background:var(--ink);color:#fff;border-color:var(--ink)}.progressbar{height:4px;background:#ebeff5;border-radius:3px;overflow:hidden;margin-bottom:20px}.progressbar i{display:block;height:100%;background:var(--ict);transition:width .3s}.score{text-align:center;padding:30px 20px}.score .big{font-family:var(--f-disp);font-size:60px;line-height:1;letter-spacing:-.03em}.score .big small{font-size:22px;color:var(--ink-3)}.score .msg{color:var(--ink-2);margin-top:8px}.review{display:grid;gap:8px;margin-top:24px;text-align:left}.rrow{display:flex;gap:10px;align-items:center;border:1px solid var(--line);border-radius:var(--r-s);padding:9px 12px;background:var(--panel);font-size:13.5px}.rrow .st{width:20px;height:20px;border-radius:5px;display:grid;place-items:center;color:#fff;font-size:11px;flex:0 0 20px}.rrow.p .st{background:var(--ok)}.rrow.f .st{background:var(--pen)}.empty{text-align:center;padding:60px 20px;color:var(--ink-3)}.empty b{display:block;font-family:var(--f-disp);color:var(--ink);font-size:17px;margin-bottom:6px}.toast{position:fixed;left:50%;bottom:26px;transform:translate(-50%) translateY(20px);background:var(--ink);color:#fff;padding:10px 18px;border-radius:999px;font-size:13.5px;opacity:0;pointer-events:none;transition:.25s;z-index:60;box-shadow:var(--sh)}.toast.show{opacity:1;transform:translate(-50%) translateY(0)}.mobnav{display:none}@media(max-width:900px){.app{grid-template-columns:1fr}.rail{position:static;height:auto;border-right:0;border-bottom:1px solid var(--line)}.main{padding:20px 16px 80px}.lab-body{grid-template-columns:1fr}.editor{border-right:0;border-bottom:1px solid var(--line)}.matchwrap{grid-template-columns:1fr}}@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}:focus-visible{outline:2px solid var(--ict);outline-offset:2px;border-radius:4px}.fld{width:100%;border:1px solid var(--line);border-radius:var(--r-s);padding:9px 11px;background:var(--panel);outline:none;font-size:14.5px}.fld:focus{border-color:var(--ict);box-shadow:0 0 0 3px var(--ict-soft)}.bai{color:inherit;text-decoration:none}.bookcard{color:inherit;text-decoration:none;display:block}.crumb a{color:var(--ink-2);text-decoration:none}.crumb a:hover{color:var(--ink);text-decoration:underline}.booklink{display:block;text-decoration:none;color:inherit}.railnav a{display:flex;align-items:center;gap:9px;width:100%;padding:8px 10px;border-radius:var(--r-s);color:var(--ink-2);font-size:14px;text-decoration:none}.railnav a:hover{background:#f1f4f9;color:var(--ink)}.railnav a.on{background:var(--ink);color:#fff}.gbwrap{overflow-x:auto;margin-top:20px;border:1px solid var(--line);border-radius:var(--r)}.gradebook{border-collapse:collapse;font-size:13.5px;min-width:100%}.gradebook th,.gradebook td{border:1px solid var(--line);padding:8px 10px;text-align:center}.gradebook thead th{background:#f3f6fa;font-weight:600;vertical-align:bottom;position:sticky;top:0;z-index:2;max-width:120px}.gradebook .gb-kind{display:block;font-size:10px;letter-spacing:.06em;color:var(--ink-3)}.gradebook .gb-title{display:block;font-size:12px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:110px}.gradebook .sticky-col{position:sticky;left:0;background:var(--panel);text-align:left;z-index:1;min-width:160px;box-shadow:1px 0 0 var(--line)}.gradebook thead .sticky-col{z-index:3;background:#f3f6fa}.gradebook .gb-cell{font-family:var(--f-mono);font-weight:600;min-width:48px}.gradebook .gb-cell sup{color:var(--pen)}.gradebook .gb-avg{background:#fbfcfe;font-family:var(--f-mono)}.gradebook tbody tr:hover td{background:#fbfcfe}.gradebook tbody tr:hover .sticky-col{background:#f1f4f9}optgroup{font-weight:600}select.fld{cursor:pointer}.pagehead{margin-bottom:22px}.pagehead .eyebrow{color:var(--ict);font-weight:600;letter-spacing:.08em;text-transform:uppercase;font-size:11.5px}.pagehead h1{font-size:27px;margin-top:5px}.pagehead p{color:var(--ink-2);margin-top:4px;font-size:14.5px}.statrow{display:grid;grid-template-columns:repeat(auto-fit,minmax(155px,1fr));gap:14px;margin-bottom:24px}.stat{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:16px 18px;position:relative;overflow:hidden}.stat:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--tint, var(--ict))}.stat .k{font-family:var(--f-disp);font-size:30px;font-weight:600;line-height:1;letter-spacing:-.02em}.stat .lbl{color:var(--ink-3);font-size:12.5px;margin-top:7px;letter-spacing:.02em}.stat .sub{color:var(--ink-2);font-size:12px;margin-top:3px}.dashgrid{display:grid;grid-template-columns:1.35fr 1fr;gap:18px;align-items:start}@media(max-width:980px){.dashgrid{grid-template-columns:1fr}}.panel{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);overflow:hidden}.panel>.phead{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid var(--line);background:#fbfcfe}.panel>.phead h3{font-size:15px}.panel>.phead .cnt{font-size:12px;color:var(--ink-3);font-family:var(--f-mono)}.panel>.pbody{padding:6px 0}.panel.pad>.pbody{padding:18px}.feed{list-style:none;margin:0;padding:0}.feed li{display:flex;align-items:center;gap:12px;padding:11px 18px;border-bottom:1px solid #EEF2F7}.feed li:last-child{border-bottom:none}.feed li:hover{background:#fbfcfe}.feed .ic{width:34px;height:34px;border-radius:9px;flex-shrink:0;display:grid;place-items:center;font-size:13px;font-weight:700;font-family:var(--f-disp);background:var(--ict-soft);color:var(--ict)}.feed .ic.lab{background:var(--cs-soft);color:var(--cs)}.feed .ic.exam{background:var(--pen-soft);color:var(--pen)}.feed .ic.lesson{background:var(--warn-soft);color:var(--warn)}.feed .body{flex:1;min-width:0}.feed .body b{display:block;font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.feed .body span{font-size:12px;color:var(--ink-3)}.feed .side{text-align:right;flex-shrink:0;font-size:12px}.feed .side .big{font-family:var(--f-mono);font-weight:600;font-size:14px}.mini-bar{height:5px;border-radius:3px;background:#edf1f6;overflow:hidden;margin-top:5px;width:90px;margin-left:auto}.mini-bar>i{display:block;height:100%;background:var(--ok);border-radius:3px}.mini-bar>i.low{background:var(--pen)}.mini-bar>i.mid{background:var(--warn)}.chip-alert{font-size:11px;font-weight:600;padding:2px 8px;border-radius:20px;background:var(--pen-soft);color:var(--pen)}.chip-ok{font-size:11px;font-weight:600;padding:2px 8px;border-radius:20px;background:var(--ok-soft);color:var(--ok)}.barchart{display:flex;align-items:flex-end;gap:10px;height:180px;padding:18px 18px 0}.barchart .col{flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;height:100%;justify-content:flex-end}.barchart .bar{width:100%;max-width:48px;border-radius:6px 6px 0 0;position:relative;background:linear-gradient(180deg,var(--ict) 0%,#3AA9CE 100%);min-height:4px;transition:height .5s cubic-bezier(.2,.7,.3,1)}.barchart .bar .v{position:absolute;top:-20px;left:0;right:0;text-align:center;font-family:var(--f-mono);font-size:12px;font-weight:600;color:var(--ink-2)}.barchart .lab{font-size:11px;color:var(--ink-3);font-family:var(--f-mono);white-space:nowrap}.barchart .col.hot .bar{background:linear-gradient(180deg,var(--ok) 0%,#4FBF87 100%)}.barchart .col.cold .bar{background:linear-gradient(180deg,var(--pen) 0%,#E37B7B 100%)}.hbars{padding:16px 18px;display:grid;gap:12px}.hbar-row{display:grid;grid-template-columns:1fr 3fr auto;gap:12px;align-items:center}.hbar-row .name{font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.hbar-track{height:22px;border-radius:6px;background:#edf1f6;overflow:hidden;position:relative}.hbar-fill{height:100%;border-radius:6px;background:linear-gradient(90deg,var(--ict),#3AA9CE);display:flex;align-items:center}.hbar-row .val{font-family:var(--f-mono);font-weight:600;font-size:13px;min-width:34px;text-align:right}.classgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(270px,1fr));gap:16px}.classcard{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);overflow:hidden;text-decoration:none;color:inherit;display:flex;flex-direction:column;transition:transform .15s,box-shadow .15s,border-color .15s}.classcard:hover{transform:translateY(-2px);box-shadow:var(--sh);border-color:var(--ict)}.classcard .banner{height:76px;padding:14px 16px;color:#fff;position:relative;display:flex;flex-direction:column;justify-content:space-between}.classcard .banner h3{font-size:17px;color:#fff}.classcard .banner .code{font-family:var(--f-mono);font-size:12px;opacity:.92;letter-spacing:.08em}.classcard .cbody{padding:13px 16px;display:flex;align-items:center;gap:16px}.classcard .cbody .m{display:flex;flex-direction:column}.classcard .cbody .m b{font-family:var(--f-disp);font-size:18px}.classcard .cbody .m span{font-size:11.5px;color:var(--ink-3)}.classhead{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:18px 20px;margin-bottom:18px}.classhead .top{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap}.classhead h1{font-size:23px}.classhead .joincode{display:inline-flex;align-items:center;gap:10px;margin-top:10px;background:var(--ict-soft);border:0;border-radius:10px;padding:7px 14px}.classhead .joincode code{font-family:var(--f-mono);font-size:17px;letter-spacing:.14em;font-weight:600;color:var(--ict)}.tabbar{display:flex;gap:3px;border-bottom:1px solid var(--line);margin:18px 0 20px}.tabbar button{border:none;background:none;padding:10px 16px;font-size:13.5px;font-weight:600;color:var(--ink-3);cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px}.tabbar button:hover{color:var(--ink)}.tabbar button.on{color:var(--ict);border-bottom-color:var(--ict)}.stutable{width:100%;border-collapse:collapse;font-size:14px}.stutable th{text-align:left;padding:10px 14px;font-size:11.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-3);border-bottom:1px solid var(--line);font-weight:600}.stutable td{padding:11px 14px;border-bottom:1px solid #EEF2F7}.stutable tr:hover td{background:#fbfcfe;cursor:pointer}.stutable .avatar{width:34px;height:34px;border-radius:50%;display:inline-grid;place-items:center;font-family:var(--f-disp);font-weight:600;font-size:13px;color:#fff;margin-right:10px;vertical-align:middle}.stutable .scorepill{display:inline-block;min-width:40px;text-align:center;font-family:var(--f-mono);font-weight:600;padding:3px 8px;border-radius:6px;font-size:13px}.scorepill.hi{background:var(--ok-soft);color:var(--ok)}.scorepill.mid{background:var(--warn-soft);color:var(--warn)}.scorepill.lo{background:var(--pen-soft);color:var(--pen)}.scorepill.none{background:#f0f3f7;color:var(--ink-3)}.profilehead{display:flex;align-items:center;gap:18px;margin-bottom:20px}.profilehead .bigavatar{width:68px;height:68px;border-radius:50%;display:grid;place-items:center;font-family:var(--f-disp);font-weight:600;font-size:26px;color:#fff;flex-shrink:0}.profilehead h1{font-size:24px}.profilehead .meta{color:var(--ink-3);font-size:13.5px;margin-top:2px}.rankbadge{display:inline-flex;align-items:center;gap:5px;background:var(--warn-soft);color:var(--warn);border-radius:20px;padding:3px 11px;font-size:12.5px;font-weight:600}.subrow{display:flex;align-items:center;gap:14px;padding:13px 16px;border-bottom:1px solid #EEF2F7}.subrow:last-child{border-bottom:none}.subrow .grow{flex:1;min-width:0}.subrow .grow b{font-size:14px}.subrow .fb{font-size:12.5px;color:var(--pen);font-style:italic;margin-top:3px}.editscore{display:flex;align-items:center;gap:8px}.editscore input.score{width:64px;text-align:center;font-family:var(--f-mono);font-weight:600}.btn.export{background:var(--cs)}.btn.export:hover{background:#0c8a6b}.skel{background:linear-gradient(90deg,#eef2f7 25%,#f6f8fb,#eef2f7 75%);background-size:200% 100%;animation:shimmer 1.3s infinite;border-radius:6px}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media(prefers-reduced-motion:reduce){.barchart .bar,.skel{transition:none;animation:none}}.blockeditor{display:grid;gap:12px}.blockeditor .blk{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);overflow:hidden;transition:border-color .15s;margin:0}.blockeditor .blk:hover{border-color:#c6d2e0}.blockeditor .blk-head{display:flex;align-items:center;justify-content:space-between;padding:9px 12px 9px 14px;background:#fbfcfe;border-bottom:1px solid var(--line);margin:0}.blockeditor .blk-type{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;color:var(--ink-2)}.blockeditor .blk-icon{font-size:15px}.blockeditor .blk-tools{display:flex;gap:3px}.iconbtn{width:28px;height:28px;border:1px solid var(--line);background:var(--panel);border-radius:6px;cursor:pointer;font-size:13px;color:var(--ink-2);display:grid;place-items:center;transition:all .12s}.iconbtn:hover:not(:disabled){background:var(--ict-soft);border-color:var(--ict);color:var(--ict)}.iconbtn:disabled{opacity:.35;cursor:default}.iconbtn.danger:hover{background:var(--pen-soft);border-color:var(--pen);color:var(--pen)}.blockeditor .blk-body{padding:14px}.addblock{border:1.5px dashed var(--line);border-radius:var(--r);padding:14px 16px;background:#fcfdfe}.addblock-label{font-size:12px;color:var(--ink-3);font-weight:600;letter-spacing:.03em;margin-bottom:10px;text-transform:uppercase}.addblock-btns{display:flex;flex-wrap:wrap;gap:8px}.addbtn{display:inline-flex;align-items:center;gap:6px;padding:7px 12px;border:1px solid var(--line);background:var(--panel);border-radius:8px;font-size:13px;font-weight:500;color:var(--ink-2);cursor:pointer;transition:all .12s}.addbtn:hover{border-color:var(--ict);background:var(--ict-soft);color:var(--ict);transform:translateY(-1px)}.addbtn span{font-size:15px}.figure{margin:4px 0}.figure-svg{background:linear-gradient(135deg,#fff,var(--paper));border:1px solid var(--line);border-radius:var(--r);padding:18px 16px;box-shadow:var(--sh)}.figure figcaption{text-align:center;font-size:13px;color:var(--ink-3);margin-top:8px;font-style:italic}.figure-missing{border:1.5px dashed var(--line);border-radius:var(--r);padding:20px;text-align:center;color:var(--ink-3);font-size:13.5px;background:var(--paper)}.lesson-img{width:100%;border-radius:var(--r);border:1px solid var(--line);display:block}.conceptcards{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px}.ccard{border-radius:var(--r);padding:16px 15px;color:#fff;box-shadow:0 8px 20px -10px #1e3a8a59;position:relative;overflow:hidden}.ccard-ic{font-size:26px;margin-bottom:8px;line-height:1}.ccard-title{font-family:var(--f-disp);font-weight:700;font-size:15.5px;margin-bottom:5px}.ccard-body{font-size:13.5px;line-height:1.5;opacity:.95}.ccard.tone-blue{background:var(--grad-cool)}.ccard.tone-mint{background:var(--grad-mint)}.ccard.tone-pink{background:var(--grad-warm)}.ccard.tone-purple{background:linear-gradient(135deg,#6c5ce7,#3fa9f5)}.ccard.tone-green{background:linear-gradient(135deg,#28c76f,#00b9b0)}.ccard.tone-yellow{background:linear-gradient(135deg,#f3c12e,#eb6393)}.comparewrap{overflow-x:auto;border-radius:var(--r);border:1px solid var(--line);box-shadow:var(--sh)}.comparetbl{width:100%;border-collapse:collapse;font-size:14px;background:var(--panel)}.comparetbl thead th{background:var(--grad-cool);color:#fff;padding:12px 14px;text-align:left;font-family:var(--f-disp);font-weight:600;font-size:13.5px}.comparetbl thead th:first-child{background:var(--brand-blue)}.comparetbl tbody th{text-align:left;padding:11px 14px;font-weight:600;color:var(--ink);background:var(--ict-soft);border-bottom:1px solid var(--line);white-space:nowrap}.comparetbl tbody td{padding:11px 14px;border-bottom:1px solid var(--line);color:var(--ink-2)}.comparetbl tbody tr:last-child th,.comparetbl tbody tr:last-child td{border-bottom:0}.stepflow{list-style:none;margin:0;padding:0;display:grid;gap:10px}.stepflow li{display:flex;gap:13px;align-items:flex-start;background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:13px 15px;box-shadow:0 2px 8px -6px #1e3a8a33}.step-num{flex:none;width:30px;height:30px;border-radius:50%;background:var(--grad);color:#fff;font-family:var(--f-disp);font-weight:700;font-size:15px;display:grid;place-items:center;box-shadow:0 4px 10px -4px #1e3a8a80}.stepflow strong{font-family:var(--f-disp);font-size:14.5px;color:var(--ink)}.step-body{font-size:13.5px;color:var(--ink-2);margin-top:3px;line-height:1.5}.codeblock{margin:4px 0;border-radius:var(--r);overflow:hidden;box-shadow:var(--sh);border:1px solid var(--line)}.codeblock-bar{display:flex;align-items:center;gap:6px;padding:9px 14px;background:#1e2536;border-bottom:1px solid #2A3348}.codeblock-bar .dot{width:11px;height:11px;border-radius:50%;display:inline-block}.codeblock-bar .dot.r{background:#ff5f57}.codeblock-bar .dot.y{background:#febc2e}.codeblock-bar .dot.g{background:#28c840}.codeblock-lang{margin-left:auto;font-size:11.5px;color:#8792a8;font-family:var(--f-mono);text-transform:uppercase;letter-spacing:.06em}.codeblock pre{margin:0;padding:14px 0;background:#232a3b;overflow-x:auto}.codeblock code{font-family:var(--f-mono);font-size:13.5px;line-height:1.7}.code-line{display:flex}.code-gutter{flex:none;width:42px;text-align:right;padding-right:14px;color:#4e5a72;-webkit-user-select:none;user-select:none}.code-content{color:#e4e8f1;white-space:pre;padding-right:16px}.codeblock figcaption{text-align:center;font-size:13px;color:var(--ink-3);padding:8px;background:var(--panel);font-style:italic}.tok-comment{color:#6b7a99;font-style:italic}.tok-string{color:#7ee787}.tok-num{color:#f3c12e}.tok-kw{color:#79b8ff;font-weight:600}.tok-tag{color:#ff7b9c}.advblk{background:var(--ict-soft);border-radius:var(--r-s);padding:12px 14px;display:grid;gap:3px}.advblk span{font-weight:600;color:var(--brand-blue);font-size:14px}.advblk small{color:var(--ink-3);font-size:12px}
