:root{
  --bg:#f6f4ef;--card:#fff;--ink:#1f2328;--muted:#6b6f76;--line:#e4e0d6;
  --accent:#2f6f5e;--accent-soft:#e3efe9;--warn:#b5651d;--warn-soft:#fbeedd;
  --bad:#b23a3a;--bad-soft:#f8e3e3;--ok:#2f7d4a;--ok-soft:#e2f2e6;--info:#3a5a9b;--info-soft:#e4ebf8;
  --shadow:0 1px 2px rgba(0,0,0,.05),0 2px 8px rgba(0,0,0,.04);
}
@media (prefers-color-scheme:dark){:root{
  --bg:#17191c;--card:#202328;--ink:#e8e6e1;--muted:#9a9ea5;--line:#33373d;
  --accent:#6cc2a6;--accent-soft:#1f3a32;--warn:#e0a060;--warn-soft:#3a2c1c;
  --bad:#e57b7b;--bad-soft:#3d2224;--ok:#79c98f;--ok-soft:#1f3527;--info:#8fb0ec;--info-soft:#222e44;
  --shadow:none;}}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.55 -apple-system,"PingFang TC","Noto Sans TC","Microsoft JhengHei",sans-serif}
header{position:sticky;top:0;z-index:20;background:var(--bg);border-bottom:1px solid var(--line)}
.top{display:flex;gap:12px;align-items:center;padding:12px 16px;max-width:1240px;margin:auto;flex-wrap:wrap}
.top h1{font-size:18px;margin:0;font-weight:700;letter-spacing:.5px}
.search{flex:1;min-width:200px;position:relative}
.search input[type=text]{width:100%;padding:9px 12px 9px 34px;border:1px solid var(--line);border-radius:10px;background:var(--card);color:var(--ink);font-size:15px}
.search svg{position:absolute;left:10px;top:50%;transform:translateY(-50%);opacity:.5}
nav{display:flex;gap:4px;padding:0 16px;max-width:1240px;margin:auto;overflow-x:auto}
nav button{border:0;background:none;padding:10px 14px;font-size:15px;color:var(--muted);border-bottom:2px solid transparent;cursor:pointer;white-space:nowrap}
nav button.on{color:var(--accent);border-color:var(--accent);font-weight:600}
nav .badge{background:var(--warn);color:#fff;border-radius:9px;padding:0 6px;font-size:11px;margin-left:4px}
main{max-width:1240px;margin:auto;padding:16px}
.card{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:16px;box-shadow:var(--shadow)}
.grid{display:grid;gap:12px}
.kpis{grid-template-columns:repeat(auto-fit,minmax(160px,1fr))}
.kpi .n{font-size:28px;font-weight:700}.kpi .l{color:var(--muted);font-size:13px}
h2{font-size:16px;margin:0 0 10px}
h3.sec{font-size:14px;margin:18px 0 6px;color:var(--accent)}
.muted{color:var(--muted)}.small{font-size:13px}
.btn{border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:9px;padding:7px 12px;font-size:14px;cursor:pointer;white-space:nowrap}
.btn:hover{border-color:var(--accent)}
.btn.pri{background:var(--accent);color:#fff;border-color:var(--accent)}
.btn.line{background:#06c755;color:#fff;border-color:#06c755}
.btn.danger{color:var(--bad)}
.btn.sm{padding:3px 9px;font-size:13px}
.btn:disabled{opacity:.5;cursor:wait}
.row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.chips{display:flex;gap:6px;flex-wrap:wrap}
.chip{border:1px solid var(--line);border-radius:999px;padding:4px 11px;font-size:13px;background:var(--card);cursor:pointer;color:var(--ink);user-select:none}
.chip.on{background:var(--accent);color:#fff;border-color:var(--accent)}
.chip.neg.on{background:var(--warn);border-color:var(--warn)}
.tag{display:inline-block;border-radius:6px;padding:1px 7px;font-size:12px;background:var(--accent-soft);color:var(--accent);margin:1px 2px 1px 0;white-space:nowrap}
.tag.w{background:var(--warn-soft);color:var(--warn)}.tag.i{background:var(--info-soft);color:var(--info)}.tag.b{background:var(--bad-soft);color:var(--bad)}.tag.g{background:var(--bg);color:var(--muted)}
table{width:100%;border-collapse:collapse}
th,td{text-align:left;padding:9px 8px;border-bottom:1px solid var(--line);vertical-align:top}
th{font-size:13px;color:var(--muted);font-weight:600;background:var(--card)}
tbody.click tr{cursor:pointer}tbody.click tr:hover{background:var(--accent-soft)}
.name{font-weight:600;white-space:nowrap}
.note-prev{color:var(--muted);font-size:13px;max-width:360px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.tt{display:grid;grid-template-columns:repeat(6,minmax(150px,1fr));gap:10px;overflow-x:auto}
.day h3{margin:0 0 8px;font-size:15px;text-align:center;padding:6px;border-radius:8px;background:var(--accent-soft);color:var(--accent)}
.day.today h3{background:var(--accent);color:#fff}
.slot{border:1px solid var(--line);border-radius:10px;padding:8px;margin-bottom:8px;background:var(--card)}
.slot .t{font-size:12px;color:var(--muted);font-weight:600;margin-bottom:4px;display:flex;justify-content:space-between}
.stu{display:inline-block;font-size:13px;padding:2px 7px;border-radius:6px;margin:2px;background:var(--bg);cursor:pointer}
.stu:hover{background:var(--accent-soft)}
.att-row{display:flex;justify-content:space-between;align-items:center;padding:8px 0;border-bottom:1px solid var(--line);gap:8px;flex-wrap:wrap}
.seg{display:inline-flex;border:1px solid var(--line);border-radius:9px;overflow:hidden}
.seg button{border:0;background:var(--card);color:var(--muted);padding:6px 11px;font-size:13px;cursor:pointer;border-right:1px solid var(--line)}
.seg button:last-child{border-right:0}
.seg button.s1{background:var(--ok-soft);color:var(--ok);font-weight:600}
.seg button.s2{background:var(--warn-soft);color:var(--warn);font-weight:600}
.seg button.s3{background:var(--bad-soft);color:var(--bad);font-weight:600}
.seg button.s4{background:var(--info-soft);color:var(--info);font-weight:600}
.seg button.on{background:var(--accent);color:#fff;font-weight:600}
.drawer-bg{position:fixed;inset:0;background:rgba(0,0,0,.35);display:none;z-index:40}
.drawer{position:fixed;top:0;right:0;bottom:0;width:min(620px,100%);background:var(--card);z-index:50;transform:translateX(100%);transition:transform .2s;overflow-y:auto;padding:18px;border-left:1px solid var(--line)}
.drawer.open{transform:none}.drawer-bg.open{display:block}
.modal{position:fixed;inset:0;z-index:55;background:var(--bg);display:none;overflow-y:auto}
.modal.open{display:block}
.modal-head{position:sticky;top:0;z-index:2;background:var(--bg);border-bottom:1px solid var(--line);padding:10px 16px}
.modal-body{max-width:1240px;margin:auto;padding:16px}
label{display:block;font-size:12px;color:var(--muted);margin:10px 0 3px}
input[type=text],input[type=date],input[type=time],input[type=number],select,textarea{width:100%;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--bg);color:var(--ink);font:inherit}
textarea{min-height:90px;resize:vertical}
.sess{display:grid;grid-template-columns:90px 1fr 100px 32px;gap:6px;margin-bottom:6px}
.prog{display:grid;grid-template-columns:150px 1fr 32px;gap:6px;margin-bottom:6px}
.scr{display:grid;grid-template-columns:120px 1fr 70px 70px 32px;gap:6px;margin-bottom:6px}
.ms{display:grid;grid-template-columns:24px 150px 1fr 32px;gap:6px;margin-bottom:6px;align-items:center}
.log{border-left:3px solid var(--accent);padding:4px 10px;margin:8px 0;font-size:14px}
.log .d{font-size:12px;color:var(--muted)}
.issue{padding:10px 0;border-bottom:1px solid var(--line)}
.tabs{display:flex;gap:4px;border-bottom:1px solid var(--line);margin:10px 0 6px}
.tabs button{border:0;background:none;padding:8px 12px;color:var(--muted);border-bottom:2px solid transparent;cursor:pointer;font-size:14px}
.tabs button.on{color:var(--accent);border-color:var(--accent);font-weight:600}
.rate{display:flex;align-items:center;gap:8px;margin:6px 0}
.rate .lbl{width:72px;font-size:13px;color:var(--muted)}
.rate .seg button{padding:5px 10px}
.editor{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:16px;align-items:start}
.preview-col{position:sticky;top:70px}
.outbox{white-space:pre-wrap;font-size:14px;line-height:1.7}
.bars{display:flex;align-items:flex-end;gap:8px;height:120px;padding-top:10px}
.bars .b{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%;font-size:11px;color:var(--muted)}
.bars .b i{display:block;width:100%;max-width:36px;background:var(--accent);border-radius:5px 5px 0 0}
.bars .b .v{font-weight:600;color:var(--ink)}
.toast{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);background:var(--ink);color:var(--bg);padding:9px 16px;border-radius:9px;font-size:14px;opacity:0;transition:opacity .2s;z-index:90;pointer-events:none;max-width:90vw;text-align:center}
.toast.show{opacity:1}
.hide{display:none!important}
.two{grid-template-columns:1fr 1fr}
.empty{padding:30px;text-align:center;color:var(--muted)}
.pv-wrap{background:#d9d6cf;border-radius:12px;padding:14px;overflow:auto;max-height:78vh}
.pv-scale{transform-origin:top left}
@media (max-width:900px){.editor{grid-template-columns:1fr}.preview-col{position:static}}
@media (max-width:760px){.two{grid-template-columns:1fr}.hide-m{display:none}.tt{grid-template-columns:repeat(6,160px)}.prog{grid-template-columns:1fr 32px}.prog select{grid-column:1/-1}.scr{grid-template-columns:1fr 1fr}}
#stage{position:fixed;left:-10000px;top:0;z-index:-1}

.plat-dd{position:relative}.plat-dd summary{list-style:none}.plat-dd summary::-webkit-details-marker{display:none}
.plat-dd .dd{position:absolute;right:0;top:calc(100% + 6px);background:var(--card);border:1px solid var(--line);border-radius:12px;box-shadow:0 10px 30px rgba(0,0,0,.12);padding:6px;min-width:220px;z-index:30}
.plat-dd .dd a{display:flex;align-items:center;gap:8px;padding:9px 12px;border-radius:8px;color:var(--ink);text-decoration:none;font-size:14px;white-space:nowrap}
.plat-dd .dd a:hover{background:var(--accent-soft)}
