:root{--bg:#fafaf8;--fg:#1a1a1a;--border:#d8d5cf;--accent:#2563eb;--accent-soft:#dbeafe;--danger:#dc2626;--danger-soft:#fee2e2;--warn:#b45309;--warn-soft:#fef3c7;--ok:#15803d;--ok-soft:#dcfce7;--muted:#6b7280}*{box-sizing:border-box}html,body{background:var(--bg);height:100dvh;color:var(--fg);flex-direction:column;margin:0;padding:0;font-family:Microsoft JhengHei,PingFang TC,Noto Sans TC,sans-serif;font-size:14px;display:flex;overflow:hidden}main{flex:1;min-height:0;padding:16px;overflow:auto}h2{margin:0 0 12px;font-size:1.15rem}h3{margin:0 0 8px;font-size:1rem}nav.topnav{border-bottom:2px solid var(--border);z-index:20;background:#fff;flex-shrink:0;align-items:center;gap:4px;padding:8px 16px;display:flex}nav.topnav .brand{align-items:center;gap:8px;margin-right:16px;font-weight:700;display:flex}nav.topnav a{color:var(--fg);border-radius:6px;padding:6px 12px;text-decoration:none}nav.topnav a:hover{background:var(--accent-soft)}nav.topnav a.active{background:var(--accent-soft);font-weight:700}nav.topnav .spacer{flex-grow:1}nav.topnav .who{color:var(--muted);font-size:13px}nav.topnav .logout{padding:4px 10px;font-size:13px}nav.topnav .versionbtn{color:var(--muted);background:#f3f1ec;padding:2px 8px;font-size:12px}button{font:inherit;border:1px solid var(--border);cursor:pointer;background:#fff;border-radius:6px;padding:6px 12px}button:hover{background:var(--accent-soft)}button.primary{background:var(--accent);border-color:var(--accent);color:#fff}button.danger{color:var(--danger);border-color:var(--danger)}button:disabled{opacity:.55;cursor:not-allowed}input,select,textarea{font:inherit;border:1px solid var(--border);color:var(--fg);background:#fff;border-radius:6px;padding:5px 8px}.page{flex-direction:column;gap:16px;display:flex}.panel{border:1px solid var(--border);background:#fff;border-radius:8px;padding:12px}.muted{color:var(--muted)}.toolbar{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.toolbar label{align-items:center;gap:6px;display:flex}.kv{grid-template-columns:max-content 1fr;gap:6px 16px;margin:0 0 8px;display:grid}.kv dt{color:var(--muted)}.kv dd{margin:0}.form-narrow{flex-direction:column;gap:6px;max-width:320px;display:flex}.form-narrow label{color:var(--muted);font-size:.9rem}.hint{border-radius:8px;margin-top:12px;padding:10px 12px;font-size:.9rem}.hint.ok{background:var(--ok-soft);color:var(--ok)}.hint.err{background:var(--danger-soft);color:var(--danger)}.hint.warn{background:var(--warn-soft);color:var(--warn)}table.list{border-collapse:collapse;background:#fff;width:100%}table.list th,table.list td{border:1px solid var(--border);text-align:left;padding:6px 10px;font-size:13px}table.list th{background:#f3f1ec}table.list thead th{z-index:10;box-shadow:inset 0 1px 0 var(--border), inset 0 -1px 0 var(--border);position:sticky;top:0}.matrixwrap{border:1px solid var(--border);background:#fff;border-radius:8px;overflow:auto}table.matrix{border-collapse:collapse;width:100%;min-width:1100px}table.matrix th,table.matrix td{border:1px solid var(--border);vertical-align:top;padding:6px 8px;font-size:13px}table.matrix thead th{z-index:10;box-shadow:inset 0 1px 0 var(--border), inset 0 -1px 0 var(--border);background:#f3f1ec;position:sticky;top:0}table.matrix th.classcol,table.matrix td.classcol{z-index:11;min-width:130px;box-shadow:inset -1px 0 0 var(--border);background:#fff;position:sticky;left:0}table.matrix thead th.classcol{z-index:12;background:#f3f1ec}table.matrix tr.notscheduled td{color:var(--muted);background:#f5f4f1}table.matrix .subject{font-weight:700}table.matrix .teacher{color:var(--muted);font-size:12px}.equipgrid{grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:2px 8px;min-width:260px;display:grid}.equipgrid label{white-space:nowrap;align-items:center;gap:4px;font-size:12px;display:flex}.center-box{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:8px;min-height:78vh;display:flex}.card{border:1px solid var(--border);background:#fff;border-radius:10px;width:100%;max-width:420px;margin:24px auto;padding:32px 28px;box-shadow:0 1px 3px #0000000f}.card h1{margin:0 0 4px;font-size:1.35rem}.brand-title{justify-content:center;align-items:center;gap:10px;display:flex}.brand-logo{object-fit:contain;border-radius:50%;flex:none}.card form{text-align:left;flex-direction:column;gap:8px;width:100%;margin-top:12px;display:flex}.card form label{color:var(--muted);font-size:.9rem}.card form input{width:100%;padding:10px 12px}.card form button{margin-top:4px;padding:10px 12px}.login-note{margin-top:10px;font-size:.8rem}.modalback{z-index:50;background:#1a1a1a73;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.modalbox{background:#fff;border-radius:10px;flex-direction:column;width:min(720px,100%);max-height:100%;display:flex;box-shadow:0 12px 40px #00000040}.modalhead{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;gap:12px;padding:14px 18px;display:flex}.modalbody{padding:6px 18px 18px;overflow:auto}.logentry{padding-top:12px}.logentry+.logentry{border-top:1px solid var(--border)}@media print{html,body{background:#fff;height:auto;overflow:visible}main{padding:0;overflow:visible}nav.topnav,.no-print{display:none!important}.panel,.matrixwrap{box-shadow:none;border:0;border-radius:0;padding:0}table.list,table.matrix{font-size:10pt}table.list thead th,table.matrix thead th,table.matrix th.classcol,table.matrix td.classcol{box-shadow:none;position:static}table thead{display:table-header-group}tr{page-break-inside:avoid}.signrow{page-break-inside:avoid;justify-content:space-between;gap:24px;margin-top:28px;display:flex}.signrow>div{border-top:1px solid var(--fg);text-align:center;flex:1;padding-top:6px}@page{size:A4 landscape;margin:12mm}}.signrow{justify-content:space-between;gap:24px;margin-top:28px;display:flex}.signrow>div{border-top:1px solid var(--fg);text-align:center;color:var(--muted);flex:1;padding-top:6px}.calgrid{background:var(--border);border:1px solid var(--border);grid-template-columns:repeat(7,1fr);gap:1px;margin-top:8px;display:grid}.calhead{text-align:center;color:var(--muted);background:#f3f1ec;padding:4px;font-size:12px}.calcell{background:#fff;flex-direction:column;gap:4px;min-height:68px;padding:4px 6px;display:flex}.calcell.empty{background:#faf9f7}.calcell.has{cursor:pointer}.calcell.has:hover{background:var(--accent-soft)}.calcell.picked{outline:2px solid var(--accent);outline-offset:-2px}.calday{color:var(--muted);font-size:12px}.calcount{color:var(--accent);font-size:12px;font-weight:700}.reportlink{color:var(--accent);border:1px solid var(--border);border-radius:6px;padding:6px 12px;text-decoration:none}.reportlink:hover{background:var(--accent-soft)}.visitbtn{width:100%;min-height:32px;margin-top:6px;padding:4px 10px;font-size:12px}.visitbtn.on{background:var(--ok-soft);border-color:var(--ok);color:var(--ok);font-weight:700}table.matrix tr.unvisited td{color:var(--muted);background:#f7f6f3}table.matrix tr.unvisited .subject{color:var(--fg)}table.matrix tr.visited td{background:#fff}table.matrix tr.notscheduled .subject{font-weight:400}table.matrix textarea,table.matrix select{width:100%;max-width:100%}.submitbar{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.submitbar button{min-height:40px;padding:8px 20px}.rowactions{white-space:nowrap;gap:6px;display:flex}@media (max-width:1024px){main{padding:12px}nav.topnav{flex-wrap:wrap;row-gap:6px;padding:8px 12px}nav.topnav .brand{margin-right:8px}.equipgrid{grid-template-columns:repeat(auto-fill,minmax(96px,1fr));min-width:200px}}@media (max-width:768px){html,body{font-size:15px}nav.topnav{gap:2px}nav.topnav .brand{width:100%;margin-right:0;font-size:15px}nav.topnav a{padding:6px 10px;font-size:14px}.toolbar{gap:8px}.toolbar label{flex:100%;justify-content:space-between}.toolbar label input,.toolbar label select{flex:auto;min-width:0;min-height:40px}.matrixwrap{background:0 0;border:0;overflow:visible}table.matrix,table.matrix tbody,table.matrix tr,table.matrix td{width:auto;min-width:0;display:block}table.matrix thead{display:none}table.matrix tr{border:1px solid var(--border);background:#fff;border-radius:8px;margin-bottom:12px;overflow:hidden}table.matrix td{border:0;border-top:1px solid var(--border);flex-wrap:wrap;align-items:center;gap:4px 10px;padding:8px 12px;display:flex}table.matrix td:before{content:attr(data-label);color:var(--muted);flex:0 0 5.5em;font-size:12px}table.matrix td.classcol{box-shadow:none;background:#f3f1ec;border-top:0;grid-template-columns:1fr auto;align-items:center;gap:2px 10px;display:grid;position:static}table.matrix td.classcol:before{content:none}table.matrix td.classcol .subject{font-size:16px}table.matrix td.classcol .teacher{grid-column:1}table.matrix .visitbtn{grid-area:1/2/span 2;width:auto;min-height:40px;margin-top:0;padding:6px 14px}table.matrix td select,table.matrix td textarea{flex:8em;min-height:40px}table.matrix td.equipcol{display:block}table.matrix td.equipcol:before{margin-bottom:4px;display:block}.equipgrid{grid-template-columns:repeat(auto-fill,minmax(104px,1fr));gap:6px 8px;min-width:0}.equipgrid label{min-height:32px;font-size:13px}table.list,table.list tbody,table.list tr,table.list td{width:auto;display:block}table.list thead{display:none}table.list tr{border:1px solid var(--border);background:#fff;border-radius:8px;margin-bottom:10px;padding:4px 0}table.list td{border:0;gap:10px;padding:4px 12px;display:flex}table.list td:before{content:attr(data-label);color:var(--muted);flex:0 0 5.5em;font-size:12px}table.list td.rowactions{padding-top:8px}table.list td.rowactions:before{content:none}table.list td.rowactions button{flex:auto;min-height:40px}.calcell{min-height:52px;padding:2px 4px}.calcount,.calhead{font-size:11px}.card{padding:24px 18px}.panel{padding:10px}.form-narrow{max-width:100%}.kv{grid-template-columns:1fr;gap:2px}.kv dt{font-size:12px}.kv dd{margin-bottom:6px}.modalback{padding:8px}.submitbar button{width:100%}.print-report table.list,.print-report table.list tbody,.print-report table.list tr,.print-report table.list td{display:revert}.print-report table.list thead{display:table-header-group}.print-report table.list td:before{content:none}.print-report table.list{min-width:900px}.print-report{overflow-x:auto}}table.list tr.disabledrow td{color:var(--muted);background:#f1efeb}table.board{border-collapse:collapse;background:#fff;width:100%}table.board th,table.board td{border:1px solid var(--border);vertical-align:top;text-align:left;padding:4px 6px;font-size:13px}table.board thead th{z-index:10;text-align:center;box-shadow:inset 0 1px 0 var(--border), inset 0 -1px 0 var(--border);background:#f3f1ec;position:sticky;top:0}table.board th.classcol,table.board td.classcol{z-index:11;min-width:96px;box-shadow:inset -1px 0 0 var(--border);background:#fff;position:sticky;left:0}table.board thead th.classcol{z-index:12;background:#f3f1ec}table.board th.dayhead{background:var(--accent-soft)}table.board th.dayfirst,table.board td.dayfirst{border-left:2px solid var(--fg)}table.board td.dim{background:#f5f4f1}table.board .subject{font-weight:700;display:block}table.board .teacher{color:var(--muted);font-size:11px;display:block}.boardcell+.boardcell{border-top:1px dashed var(--border);margin-top:3px;padding-top:3px}@media (max-width:768px){table.board,table.board thead,table.board tbody,table.board tr,table.board th,table.board td,table.sheet,table.sheet thead,table.sheet tbody,table.sheet tr,table.sheet th,table.sheet td{display:revert}table.board{min-width:620px}table.sheet{min-width:1264px}.matrixwrap:has(table.board){border:1px solid var(--border);overflow-x:auto}}table.sheet{border-collapse:collapse;table-layout:fixed;background:#fff;width:100%;min-width:1264px}table.sheet th,table.sheet td{border:1px solid var(--border);text-align:center;min-width:36px;height:34px;padding:1px 2px;font-size:clamp(11px,.78vw,14px);line-height:1.15;overflow:hidden}table.sheet thead th{z-index:6;box-shadow:inset 0 1px 0 var(--border), inset 0 -1px 0 var(--border);background:#f3f1ec;position:sticky}table.sheet thead tr:first-child th{top:0}table.sheet thead tr:nth-child(2) th{top:34px}table.sheet thead th.classcol{z-index:8;box-shadow:inset -1px 0 0 var(--border), inset 0 1px 0 var(--border), inset 0 -1px 0 var(--border)}table.sheet th.classcol,table.sheet td.classcol{z-index:5;white-space:nowrap;background:#f3f1ec;width:68px;min-width:68px;font-size:clamp(12px,.85vw,15px);position:sticky;left:0}table.sheet td.classcol{box-shadow:inset -1px 0 0 var(--border);background:#fff}table.sheet th.dayfirst,table.sheet td.dayfirst{border-left:2px solid #a8a49c}table.sheet th.dayhead{background:var(--accent-soft)}table.sheet td.dim{opacity:.55;background:#f5f4f1}.cell-subject{white-space:nowrap;font-weight:700}.cell-teacher{color:var(--muted);white-space:nowrap;font-size:clamp(10px,.62vw,12px)}.cell-alt+.cell-alt{border-top:1px dashed var(--border)}table.sheet td.blockcell,table.board td.blockcell{background:#e3e1dc}.tablewrap{overflow-x:auto}table.list.wide{table-layout:fixed;min-width:1392px}table.list.wide td.wrapcell{white-space:pre-wrap;word-break:break-word;font-size:12px}table.list.wide td,table.list.wide th{text-overflow:ellipsis;overflow:hidden}@media (max-width:768px){table.list.wide{table-layout:auto;min-width:0}table.list.wide colgroup{display:none}}.addextra .toolbar{gap:10px}.addextra label{gap:4px}table.matrix tr.extrarow td.classcol{background:var(--accent-soft)}table.matrix tr.extrarow .teacher{color:var(--accent);font-weight:700}.extrafield{width:100%;margin-bottom:3px;font-size:12px}ol.teacherorder{border:1px solid var(--border);border-radius:6px;max-height:420px;margin:0 0 12px;padding:0;list-style:none;overflow-y:auto}ol.teacherorder li{border-bottom:1px solid var(--border);background:#fff;grid-template-columns:34px 1fr 4.5em auto;align-items:center;gap:8px;padding:4px 8px;display:grid}ol.teacherorder li:last-child{border-bottom:0}ol.teacherorder .idx{color:var(--muted);text-align:right;font-size:12px}ol.teacherorder .name{font-weight:700}ol.teacherorder .ordbtns{gap:4px;display:flex}ol.teacherorder .ordbtns button{min-height:30px;padding:2px 10px}button.calcount{text-align:left;width:100%;color:var(--accent);cursor:pointer;background:0 0;border:0;border-radius:4px;padding:1px 4px;font-size:12px;font-weight:700;display:block}button.calcount:hover{background:#fff}button.calcount.on{background:var(--accent);color:#fff}ol.teacherorder li{grid-template-columns:24px 34px 1fr 8em auto}ol.teacherorder .draghandle{cursor:grab;color:var(--muted);text-align:center;-webkit-user-select:none;user-select:none}ol.teacherorder .draghandle:active{cursor:grabbing}ol.teacherorder li.dragging{background:var(--accent-soft);opacity:.85}ol.teacherorder .tag{background:var(--warn-soft);color:var(--warn);border-radius:4px;margin-left:6px;padding:0 5px;font-size:11px}ol.teacherorder .ordbtns button.danger{padding:2px 8px;font-size:12px}.stats{flex-direction:column;gap:16px;display:flex}.stats h4{margin:14px 0 6px;font-size:14px}.statgrid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;display:grid}.statgrid>div{border:1px solid var(--border);background:#faf9f6;border-radius:8px;flex-direction:column;gap:2px;padding:10px 12px;display:flex}.statnum{color:var(--accent);font-size:24px;font-weight:700;line-height:1.1}.barrow{grid-template-columns:7.5em 1fr 5.5em;align-items:center;gap:8px;margin-bottom:3px;font-size:13px;display:grid}.bartrack{background:#efede8;border-radius:3px;height:14px;overflow:hidden}.barfill{background:var(--accent);border-radius:3px;height:100%;display:block}.barfill.zero{background:0 0}.barvalue{text-align:right;font-variant-numeric:tabular-nums}.stackbar{background:#efede8;border-radius:4px;height:18px;display:flex;overflow:hidden}.stackbar .seg.ok{background:var(--ok)}.stackbar .seg.warn{background:var(--warn)}.stackbar .seg.danger{background:var(--danger)}.stacklegend{flex-wrap:wrap;gap:4px 16px;margin-top:6px;font-size:13px;display:flex}.stacklegend .dot{border-radius:2px;width:10px;height:10px;margin-right:5px;display:inline-block}.stacklegend .dot.ok{background:var(--ok)}.stacklegend .dot.warn{background:var(--warn)}.stacklegend .dot.danger{background:var(--danger)}table.list.heat td.heatcell{text-align:center;font-variant-numeric:tabular-nums;font-weight:700}svg.trend{width:100%;max-width:620px;height:auto}svg.trend .axis{stroke:var(--border);stroke-width:1px}svg.trend .axis.dash{stroke-dasharray:3 3}svg.trend .line{fill:none;stroke:var(--accent);stroke-width:2px}svg.trend .dotmark{fill:var(--accent)}svg.trend .tick{fill:var(--muted);font-size:10px}svg.trend .tick.mid{text-anchor:middle}.twocol{grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:0 24px;display:grid}@media (max-width:768px){.barrow{grid-template-columns:6em 1fr 4.5em;font-size:12px}.statnum{font-size:20px}}@media print{.barfill,.stackbar .seg,td.heatcell,.statgrid>div{-webkit-print-color-adjust:exact;print-color-adjust:exact}.stats section.panel{page-break-inside:avoid}}.latebox{margin-top:4px}.latebox input[type=time]{width:100%;padding:3px 4px;font-size:12px}.latebox .nowbtn{width:100%;min-height:28px;margin-top:3px;padding:2px 0;font-size:11px}nav.topnav .clock{color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap;margin-right:4px;font-size:13px}nav.topnav .previewswitch{max-width:170px;padding:2px 4px;font-size:12px}.previewbanner{background:var(--warn-soft);color:var(--warn);border-bottom:1px solid var(--warn);flex-shrink:0;justify-content:center;align-items:center;gap:12px;padding:5px 12px;font-size:13px;display:flex}.previewbanner button{min-height:26px;padding:2px 10px;font-size:12px}
