:root{--bg: #f4f6fa;--card: #ffffff;--ink: #1e293b;--muted: #64748b;--line: #e2e8f0;--brand: #2456d6;--brand-dark: #1b44ac;--brand-soft: #e8eefc;--p: #15803d;--p-bg: #dcfce7;--a: #b91c1c;--a-bg: #fee2e2;--l: #b45309;--l-bg: #fef3c7;--m-bg: #e0e7ff;--m: #3730a3;--radius: 12px;--shadow: 0 1px 2px rgba(16, 24, 40, .05), 0 1px 3px rgba(16, 24, 40, .06)}*{box-sizing:border-box}html,body,#root{min-height:100%}body{margin:0;background:var(--bg);color:var(--ink);font:14px/1.5 Inter,Segoe UI,system-ui,-apple-system,Roboto,Arial,sans-serif;-webkit-font-smoothing:antialiased}h1,h2,h3,p{margin:0}a{color:var(--brand);text-decoration:none}button,input,select,textarea{font:inherit;color:inherit}.muted{color:var(--muted)}.app{display:grid;grid-template-columns:248px 1fr;min-height:100vh}.sidebar{background:#fff;border-right:1px solid var(--line);padding:20px 14px;display:flex;flex-direction:column;gap:18px;position:sticky;top:0;height:100vh}.brand{display:flex;gap:10px;align-items:center;padding:4px 8px}.brand-mark{width:38px;height:38px;border-radius:10px;background:var(--brand);color:#fff;display:grid;place-items:center;font-weight:700;flex:none}.brand b{display:block;line-height:1.25}.brand span{color:var(--muted);font-size:12px}.nav{display:flex;flex-direction:column;gap:2px}.nav a{padding:9px 12px;border-radius:8px;color:#475569;font-weight:500}.nav a:hover{background:#f1f5f9}.nav a.active{background:var(--brand-soft);color:var(--brand-dark)}.nav .sep{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:#94a3b8;padding:14px 12px 4px}.sidebar .spacer{flex:1}.main{padding:28px 32px 48px;min-width:0}.public-top{background:#fff;border-bottom:1px solid var(--line);padding:14px 32px;display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap}.public-top .tabs{display:flex;gap:6px}.public-top .tabs a{padding:8px 14px;border-radius:8px;font-weight:500;color:#475569}.public-top .tabs a.active{background:var(--brand-soft);color:var(--brand-dark)}.tag{background:#f1f5f9;color:#475569;border-radius:999px;padding:3px 10px;font-size:12px;font-weight:500}.page-head{display:flex;justify-content:space-between;align-items:flex-end;gap:16px;flex-wrap:wrap;margin-bottom:20px}.page-head h1{font-size:22px;letter-spacing:-.01em}.head-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px}.card+.card{margin-top:16px}.card h2{font-size:15px;margin-bottom:12px}.state{padding:60px 20px;text-align:center;color:var(--muted)}.state.error{color:var(--a)}.empty{padding:36px 16px;text-align:center;color:var(--muted)}.btn{border:1px solid var(--line);background:#fff;color:var(--ink);padding:8px 14px;border-radius:8px;cursor:pointer;font-weight:500;line-height:1.2;white-space:nowrap}.btn:hover{background:#f8fafc}.btn:disabled{opacity:.55;cursor:not-allowed}.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}.btn.primary:hover{background:var(--brand-dark)}.btn.danger{color:var(--a)}.btn.danger:hover{background:var(--a-bg);border-color:#fecaca}.btn.sm{padding:5px 10px;font-size:13px}input[type=text],input[type=password],input[type=date],input[type=month],input[type=number],select,textarea{border:1px solid #cbd5e1;background:#fff;border-radius:8px;padding:8px 10px;min-width:0}input:focus,select:focus,textarea:focus,.btn:focus-visible{outline:2px solid #93b0f5;outline-offset:1px;border-color:var(--brand)}textarea{width:100%;resize:vertical}label.field{display:flex;flex-direction:column;gap:4px;font-size:12px;font-weight:600;color:var(--muted)}.row{display:flex;gap:10px;flex-wrap:wrap;align-items:flex-end}.datebar{display:flex;gap:6px;align-items:center;flex-wrap:wrap}.datebar .btn{padding:8px 11px}.cell{display:inline-block;min-width:24px;padding:1px 7px;border-radius:6px;font-weight:700;font-size:12px;font-style:normal;text-align:center}.cell.p{background:var(--p-bg);color:var(--p)}.cell.a{background:var(--a-bg);color:var(--a)}.cell.l{background:var(--l-bg);color:var(--l)}.cell.m{background:var(--m-bg);color:var(--m)}.dash{color:#cbd5e1}.legend{display:flex;gap:16px;color:var(--muted);font-size:13px;flex-wrap:wrap}.legend span{display:inline-flex;gap:6px;align-items:center}.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:16px}.stat{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:12px 16px;box-shadow:var(--shadow);display:flex;flex-direction:column;gap:2px;border-left:4px solid #cbd5e1}.stat span{color:var(--muted);font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.stat b{font-size:24px}.stat.p{border-left-color:#22c55e}.stat.a{border-left-color:#ef4444}.stat.l{border-left-color:#f59e0b}.stat.b{border-left-color:var(--brand)}.chips{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px}.chip{border:1px solid var(--line);background:#fff;border-radius:10px;padding:8px 14px;cursor:pointer;font-weight:600;color:#475569;display:inline-flex;gap:8px;align-items:center}.chip small{font-weight:500;color:var(--muted)}.chip:hover{background:#f8fafc}.chip.active{background:var(--brand);border-color:var(--brand);color:#fff}.chip.active small{color:#dbe5ff}.chip .dot{width:8px;height:8px;border-radius:50%;background:#cbd5e1}.chip .dot.part{background:#f59e0b}.chip .dot.done{background:#22c55e}.mark-list{padding:0;overflow:hidden}.mark-row{display:flex;align-items:center;gap:14px;padding:10px 16px;border-bottom:1px solid var(--line)}.mark-row:last-child{border-bottom:0}.mark-row .roll{width:38px;height:30px;border-radius:8px;background:#f1f5f9;display:grid;place-items:center;font-weight:600;font-size:12px;color:#475569;flex:none}.mark-row .nm{flex:1;font-weight:500;min-width:0;overflow:hidden;text-overflow:ellipsis}.seg{display:inline-flex;border:1px solid #cbd5e1;border-radius:10px;overflow:hidden;flex:none}.seg button{border:0;background:#fff;padding:8px 16px;cursor:pointer;font-weight:600;color:#64748b;border-right:1px solid #e2e8f0;min-width:84px}.seg button:last-child{border-right:0}.seg button:hover{background:#f8fafc}.seg button.on-P{background:var(--p-bg);color:var(--p)}.seg button.on-A{background:var(--a-bg);color:var(--a)}.seg button.on-L{background:var(--l-bg);color:var(--l)}.actionbar{position:sticky;bottom:0;margin-top:16px;background:#fff;border:1px solid var(--line);border-radius:var(--radius);box-shadow:0 -2px 12px #10182814;padding:12px 16px;display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.counts{display:flex;gap:14px;flex-wrap:wrap;font-weight:600}.counts .p{color:var(--p)}.counts .a{color:var(--a)}.counts .l{color:var(--l)}.counts .n{color:var(--muted)}.unsaved{color:var(--l);font-weight:600;font-size:13px}.sheet-wrap{overflow:auto;max-height:calc(100vh - 290px);min-height:160px;border:1px solid var(--line);border-radius:var(--radius);background:#fff;box-shadow:var(--shadow)}table.sheet{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}.sheet th,.sheet td{padding:7px 9px;border-bottom:1px solid var(--line);border-right:1px solid #eef2f7;text-align:center;white-space:nowrap;background:#fff}.sheet thead th{position:sticky;top:0;background:#f8fafc;z-index:2;font-weight:600;color:#475569}.sheet .c-roll{position:sticky;left:0;z-index:1;width:56px;min-width:56px}.sheet .c-name{position:sticky;left:56px;z-index:1;text-align:left;min-width:170px;font-weight:500;border-right:2px solid var(--line)}.sheet thead .c-roll,.sheet thead .c-name{z-index:3;background:#f8fafc}.sheet tbody tr:hover td{background:#f8fafc}.sheet td.wk,.sheet th.wk{background:#f1f5f9;color:#94a3b8}.sheet th small{display:block;font-weight:500;color:#94a3b8;font-size:11px}.sheet .tot{font-weight:600;background:#fafbfd}.sheet tfoot td{position:sticky;bottom:0;background:#f8fafc;font-weight:600;border-top:2px solid var(--line);z-index:2}.sheet tfoot .c-roll,.sheet tfoot .c-name{z-index:3}.pc{display:inline-block;padding:1px 8px;border-radius:6px;font-weight:600}.pc.good{background:var(--p-bg);color:var(--p)}.pc.mid{background:var(--l-bg);color:var(--l)}.pc.low{background:var(--a-bg);color:var(--a)}.foot-note{margin-top:10px;color:var(--muted);font-size:12px;display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap}table.list{width:100%;border-collapse:collapse}.list th{text-align:left;font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;padding:8px 10px;border-bottom:1px solid var(--line)}.list td{padding:8px 10px;border-bottom:1px solid var(--line);vertical-align:middle}.list tr:last-child td{border-bottom:0}.list td.act{text-align:right;white-space:nowrap}.list td.act .btn+.btn{margin-left:6px}.list input[type=text],.list input[type=number]{width:100%}.share-box{display:flex;gap:8px;flex-wrap:wrap}.share-box input{flex:1;min-width:220px;background:#f8fafc}.note{background:#f8fafc;border:1px dashed #cbd5e1;border-radius:8px;padding:10px 12px;color:var(--muted);font-size:13px;margin-top:12px}.error-text{color:var(--a);font-size:13px;margin-top:8px}.login-page{min-height:100vh;display:grid;place-items:center;padding:20px}.login-card{width:100%;max-width:380px;background:#fff;border:1px solid var(--line);border-radius:16px;padding:30px;box-shadow:0 10px 30px #10182814}.login-card .brand-mark{margin-bottom:16px;width:46px;height:46px;font-size:18px}.login-card h1{font-size:20px}.login-card form{display:flex;flex-direction:column;gap:14px;margin-top:20px}.login-card input{width:100%}.toast{position:fixed;right:20px;bottom:20px;padding:11px 16px;border-radius:10px;color:#fff;background:#166534;box-shadow:0 8px 24px #0000002e;z-index:50;font-weight:500}.toast.error{background:#b91c1c}@media (max-width: 860px){.app{display:block}.sidebar{position:static;height:auto;padding:12px;gap:10px;border-right:0;border-bottom:1px solid var(--line)}.nav{flex-direction:row;overflow-x:auto;gap:6px;padding-bottom:2px}.nav a{white-space:nowrap}.nav .sep,.sidebar .spacer{display:none}.main{padding:16px 14px 40px}.public-top{padding:12px 14px}.mark-row{flex-wrap:wrap;gap:8px 12px}.mark-row .nm{flex-basis:calc(100% - 60px)}.seg{width:100%}.seg button{flex:1;min-width:0;padding:10px 6px}.sheet-wrap{max-height:none}}@media print{body{background:#fff}.sidebar,.public-top .tabs,.head-actions,.datebar,.actionbar,.no-print,.toast{display:none!important}.app{display:block}.main{padding:0}.sheet-wrap{max-height:none;overflow:visible;box-shadow:none}.sheet th,.sheet td{position:static!important}.stat,.card{box-shadow:none}}.banner{background:#fffbeb;border:1px solid #fde68a;color:#92400e;border-radius:10px;padding:10px 14px;margin-bottom:14px}.grid2{display:grid;grid-template-columns:2fr 1fr;gap:16px;margin-bottom:16px}.grid2 .card+.card{margin-top:0}@media (max-width: 860px){.grid2{grid-template-columns:1fr}}.trend{width:100%;height:auto;display:block}ul.plain{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px;max-height:220px;overflow:auto}.roll-sm{display:inline-block;min-width:28px;padding:1px 6px;background:#f1f5f9;border-radius:6px;font-size:12px;font-weight:600;color:#475569;text-align:center}.days{display:flex;gap:8px;flex-wrap:wrap}.days label{display:inline-flex;gap:6px;align-items:center;border:1px solid var(--line);border-radius:8px;padding:6px 10px;cursor:pointer;background:#fff}.days label.on{background:var(--brand-soft);border-color:#93b0f5;color:var(--brand-dark);font-weight:600}.days input{accent-color:var(--brand)}.cond{display:inline-block;padding:2px 10px;border-radius:999px;font-weight:600;font-size:12px}.cond.excellent{background:var(--p-bg);color:var(--p)}.cond.good{background:#e0f2fe;color:#0369a1}.cond.poor{background:var(--l-bg);color:var(--l)}.cond.critical{background:var(--a-bg);color:var(--a)}.cond.none{background:#f1f5f9;color:#64748b}.cond-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:12px}.cond-box{border-radius:10px;padding:12px 16px;display:flex;flex-direction:column}.cond-box b{font-size:26px}.cond-box span{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.cond-box.excellent{background:var(--p-bg);color:var(--p)}.cond-box.good{background:#e0f2fe;color:#0369a1}.cond-box.poor{background:var(--l-bg);color:var(--l)}.cond-box.critical{background:var(--a-bg);color:var(--a)}.student-card{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap}.cond-big{display:flex;align-items:center;gap:12px}.cond-big b{font-size:30px}.cond-big .cond{font-size:14px;padding:4px 14px}ul.remarks{margin:0;padding-left:20px;display:flex;flex-direction:column;gap:6px}.bar{display:block;height:10px;border-radius:6px;background:#eef2f7;overflow:hidden}.bar span{display:block;height:100%;border-radius:6px}.linklike{border:0;background:none;padding:0;color:var(--brand);cursor:pointer;font-weight:500;text-align:left}.linklike:hover{text-decoration:underline}.report-head{display:none}@media print{@page{margin:12mm}.report-head{display:flex;justify-content:space-between;border-bottom:2px solid #2456d6;padding-bottom:6px;margin-bottom:14px;font-size:14px}.report .card{break-inside:avoid}.linklike{color:inherit}.cond,.cond-box,.cell,.pc,.bar span,.bar,.stat{-webkit-print-color-adjust:exact;print-color-adjust:exact}}.mo{min-height:100vh;display:flex;flex-direction:column}.mo-head{background:#fff;border-bottom:1px solid var(--line);padding:12px 16px;display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;position:sticky;top:0;z-index:5}.mo-head b{display:block;line-height:1.25}.mo-head span{color:var(--muted);font-size:12px}.mo-body{padding:14px 14px 110px;max-width:760px;width:100%;margin:0 auto}.mo-bar{position:fixed;left:0;right:0;bottom:0;background:#fff;border-top:1px solid var(--line);box-shadow:0 -4px 14px #10182814;padding:10px 14px;display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;z-index:6}.carry{display:flex;gap:10px;align-items:flex-start;margin-top:14px;cursor:pointer}.carry input{margin-top:3px;accent-color:var(--brand);width:18px;height:18px}.carry small{display:block;color:var(--muted)}.inline-check{display:inline-flex;gap:6px;align-items:center;color:var(--muted);font-size:13px;cursor:pointer}.inline-check input{accent-color:var(--brand)}
