:root{--bg:#f2f3f5;--card:#fff;--line:#e4e6ea;--ink:#15171c;--muted:#7c828d;--blue:#3730a3;--blue-bg:#eef2ff;--blue-line:#c7d2fe;--green:#047857;--green-bg:#ecfdf3;--hatch1:#f4f5f7;--hatch2:#fbfbfc}*{box-sizing:border-box}body{background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased;margin:0;font:14px/1.45 -apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,sans-serif}header{border-bottom:1px solid var(--line);background:#fff}.top{flex-wrap:wrap;align-items:baseline;gap:12px;max-width:1120px;margin:0 auto;padding:14px 18px;display:flex}h1{letter-spacing:.02em;margin:0;font-size:18px;font-weight:650}.meta{color:var(--muted);margin:0;font-size:12px}main{max-width:1120px;margin:0 auto;padding:12px 16px 64px}.hidden{display:none!important}.toolbar{flex-wrap:wrap;align-items:center;gap:10px;margin:2px 0 12px;display:flex}.seg{background:#e7e9ed;border-radius:9px;padding:3px;display:inline-flex}.seg button{font:inherit;color:#4b5563;cursor:pointer;background:0 0;border:0;border-radius:7px;padding:6px 14px;font-size:13px}.seg button.on{color:#111827;background:#fff;font-weight:600;box-shadow:0 1px 2px #0000001a}.teacher-wrap{flex:1;min-width:132px;max-width:200px}.teacher-wrap select{width:100%;font:inherit;border:1px solid var(--line);color:var(--ink);background:#fff;border-radius:8px;padding:7px 10px;font-size:13px;font-weight:600}.toolbar .today{color:var(--blue);background:var(--blue-bg);white-space:nowrap;border-radius:999px;margin-left:auto;padding:4px 10px;font-size:12px}.send-backdrop{z-index:40;opacity:0;pointer-events:none;background:#0000004d;transition:opacity .2s;position:fixed;inset:0}.send-backdrop.show{opacity:1;pointer-events:auto}.send-panel{z-index:50;background:#fff;transition:transform .25s cubic-bezier(.4,0,.2,1);position:fixed;box-shadow:0 -2px 16px #0000001a}.send-panel-head{border-bottom:1px solid var(--line);align-items:center;gap:8px;margin-bottom:12px;padding-bottom:10px;display:flex}.send-panel-head b{font-size:14px;font-weight:650}.send-panel-head .x{color:#9ca3af;cursor:pointer;background:0 0;border:0;border-radius:6px;margin-left:auto;padding:0 2px;font-size:20px;line-height:1}.send-panel-head .x:hover{color:#111827;background:#f3f4f6}.send-body{overflow-y:auto}.send-chips{flex-wrap:wrap;gap:5px;display:flex}.send-chip{color:#374151;white-space:nowrap;background:#f5f6f8;border:1px solid #e8eaee;border-radius:6px;padding:4px 9px;font-size:12px;line-height:18px}.send-none{color:var(--muted);font-size:12px}@media (width>=641px){.send-panel{border-left:1px solid var(--line);width:340px;max-width:90vw;padding:20px;top:0;bottom:0;right:0;transform:translate(100%)}.send-panel.show{transform:translate(0)}.send-body{max-height:calc(100vh - 80px)}}@media (width<=640px){.send-panel{max-height:65vh;padding:16px;padding-bottom:max(16px, env(safe-area-inset-bottom));border-radius:16px 16px 0 0;bottom:0;left:0;right:0;transform:translateY(100%)}.send-panel.show{transform:translateY(0)}.send-panel-head{margin-bottom:10px;padding-bottom:8px}.send-panel-head b{font-size:13px}.send-body{max-height:calc(65vh - 70px)}.send-chip{padding:3px 8px;font-size:11px}}.panel{border:1px solid var(--line);background:#fff;border-radius:14px;box-shadow:0 1px 2px #00000008}.grid-wrap{padding:10px 10px 6px}table.grid{border-collapse:separate;border-spacing:5px;table-layout:fixed;width:100%}.grid th{color:var(--muted);text-align:center;padding:2px 0;font-size:12px;font-weight:500}.grid th small{color:#9ca3af;margin-left:4px;font-size:10px;font-weight:400;display:inline-block}.grid th.row{text-align:left;width:74px;padding-left:4px}.grid th.row b{color:#4b5563;font-size:12px;font-weight:600;display:block}.grid th.row small{color:#9ca3af;margin:0;font-size:10px;display:block}.grid th.today{color:#111827;background:var(--blue-bg);border-radius:7px;font-weight:700}.grid th.today small{color:#4338ca}.grid th.past{color:#b0b5be}.grid td{vertical-align:top;background:#fafbfc;border:1px solid #e8eaee;border-radius:8px;height:48px;padding:6px 7px;font-size:12px;position:relative}.grid td.free{cursor:pointer;background:#f5f6f8;transition:background .12s}.grid td.free:hover{background:#e9eef6}.grid td.busy{cursor:pointer;transition:transform 80ms,box-shadow 80ms;box-shadow:0 1px 2px #0000000a}.grid td.busy:hover{transform:translateY(-1px);box-shadow:0 3px 8px #00000017}.grid td.other{opacity:.5}.grid td.past{background:repeating-linear-gradient(135deg, var(--hatch1) 0 7px, var(--hatch2) 7px 14px);opacity:.45;cursor:default;box-shadow:none}.grid td.past.other{opacity:.45}.grid td.past:hover{box-shadow:none;transform:none}.grid td.sel,.grid td.sel:hover{outline-offset:-1px;opacity:1;box-shadow:none;outline:2px solid #111827;height:auto;min-height:48px;transform:none}.grid td.sel-free,.grid td.sel-free:hover{outline:2px solid var(--green);outline-offset:-1px;background:var(--green-bg);opacity:1;transform:none}.grid td.cand{background:var(--blue-bg);border-color:var(--blue-line);cursor:default;box-shadow:none;cursor:pointer}.grid td.cand:hover{background:var(--blue-bg);transform:none}.grid .cl{text-overflow:ellipsis;white-space:nowrap;vertical-align:top;color:#111827;max-width:100%;font-size:12px;font-weight:700;line-height:1.4;display:inline-block;overflow:hidden}.grid .sj{color:#6b7280;margin-top:1px;font-size:10px;font-weight:500}.grid .hr{border-top:1px dashed #d1d5db;margin:3px 0}.grid .warn{color:#b45309;font-size:10px;position:absolute;top:2px;right:4px}.grid .send-info{color:#6b7280;cursor:pointer;border-top:1px solid #e5e7eb;align-items:center;gap:4px;margin-top:6px;padding-top:6px;font-size:11px;display:flex}.grid .send-info:hover{color:#111827}.grid .send-info:before{content:"📤";font-size:12px}.cand .cj{flex-wrap:wrap;align-items:baseline;gap:3px;display:flex}.cand .cl{font-size:11px}.cand .sj{margin-top:0;margin-left:2px;font-size:10px}.cand .sw{color:var(--blue);align-items:center;gap:3px;margin-top:3px;font-size:10px;font-weight:700;display:flex}.cand .sw:before{content:"⇄";font-size:11px}.req-top{color:var(--green);margin-bottom:2px;font-size:10px;font-weight:700;display:block}.req-label{margin-right:2px}.pick-inline{vertical-align:middle;cursor:pointer;align-items:center;gap:1px;max-width:100%;display:inline-flex}.pick-inline select{appearance:none;font:inherit;color:inherit;cursor:pointer;background:0 0;border:0;max-width:64px;height:16px;margin:0;padding:0;font-size:10px;font-weight:700;line-height:16px}.pick-inline .chev{border-left:3px solid #0000;border-right:3px solid #0000;border-top:4px solid var(--green);pointer-events:none;width:0;height:0;margin-left:1px;display:inline-block}.req-lesson{flex-wrap:wrap;align-items:baseline;gap:4px;margin-top:2px;display:flex}.req-lesson b{color:#065f46;font-size:11px;font-weight:600}.req-lesson .sj{color:#6b7280;margin-top:0;font-size:10px}.all-wrap{-webkit-overflow-scrolling:touch;overflow:auto}table.all{border-collapse:separate;border-spacing:0;table-layout:fixed;width:100%;min-width:860px}.all thead th{z-index:2;color:var(--muted);text-align:left;border-bottom:1px solid var(--line);white-space:nowrap;background:#fff;padding:10px 8px;font-size:12px;font-weight:500;position:sticky;top:0}.all thead th small{color:#9ca3af;font-size:10px;font-weight:400;display:block}.all thead th.today{color:#111827;background:var(--blue-bg);border-radius:6px;font-weight:700}.all thead th.today small{color:#4338ca}.all thead th.past{color:#b0b5be}.all thead th.tcol{z-index:3;width:86px;left:0}.all tbody th.tcol{z-index:1;text-align:left;vertical-align:top;background:#fff;border-bottom:1px solid #f2f3f5;padding:8px;position:sticky;left:0}.all td{vertical-align:top;border-bottom:1px solid #f2f3f5;padding:7px 8px}.all tbody tr:hover td,.all tbody tr:hover th.tcol{background:#fbfbfc}.tname{font:inherit;color:#374151;cursor:pointer;text-align:left;white-space:nowrap;background:0 0;border:0;padding:2px 0;font-size:12px;font-weight:600}.tname:hover{color:#111827;text-underline-offset:3px;text-decoration:underline}.lessons{flex-wrap:wrap;gap:4px;display:flex}.alesson{max-width:100%;font:inherit;color:#374151;cursor:pointer;white-space:nowrap;background:#fafbfc;border:1px solid #eef0f3;border-left:3px solid #d1d5db;border-radius:5px;align-items:center;gap:3px;padding:1px 5px 1px 4px;font-size:11px;line-height:16px;display:inline-flex;overflow:hidden}.alesson:hover{background:#f1f3f7}.alesson b{color:#6b7280;min-width:12px;font-size:10px;font-weight:600}.alesson i{color:#9ca3af;font-size:10px;font-style:normal}.alesson.other{opacity:.5}@media (width<=640px){.top{padding:11px 12px}h1{font-size:16px}main{padding:8px 8px 40px}.toolbar{gap:8px;margin-bottom:8px}.seg button{padding:5px 11px;font-size:12px}.teacher-wrap{min-width:120px;max-width:none}.toolbar .today{font-size:11px}.actbar{border-radius:10px;padding:8px 10px;top:4px}.act-head b{font-size:13px}.act-body{gap:6px}.chips{-webkit-overflow-scrolling:touch;scrollbar-width:none;flex-wrap:nowrap;padding:0 4px 2px 0;overflow-x:auto}.chips::-webkit-scrollbar{display:none}.who{padding:2px 7px;font-size:11px}.grid-wrap{padding:6px}table.grid{border-spacing:3px}.grid th{font-size:10px}.grid th small{margin-left:2px;font-size:9px}.grid th.row{width:38px;padding-left:2px}.grid th.row b{font-size:10px}.grid th.row small{display:none}.grid td{border-radius:6px;height:44px;padding:4px}.grid td.sel-free{padding-left:2px;padding-right:2px}.grid .cl{font-size:10.5px}.grid .sj{font-size:9px}.grid .send-info{margin-top:4px;padding-top:4px;font-size:10px}.grid .send-info:before{font-size:11px}.cand .sw{font-size:9px}.cand .sw:before{font-size:10px}.req-label{display:none}.pick-inline select{height:15px;font-size:9px;line-height:15px}.req-lesson{white-space:nowrap;flex-wrap:nowrap;gap:3px;overflow:hidden}.req-lesson .sj{color:#6b7280;font-size:9px;line-height:15px}.req-lesson b{text-overflow:ellipsis;min-width:0;font-size:9px;line-height:15px;overflow:hidden}.all-wrap{border-radius:10px}table.all{min-width:760px}.all thead th{padding:8px 6px;font-size:11px}.all td{padding:6px}.alesson{gap:2px;padding:1px 4px;font-size:10px}.alesson b,.alesson i{font-size:9px}.tname{font-size:11px}}@media print{header,.toolbar{display:none}body{background:#fff}main{max-width:none;padding:0}.panel{box-shadow:none}.actbar{box-shadow:none;margin-bottom:8px;position:static}.grid td.past{opacity:1;background:#fff}}.top{align-items:center}.header-actions{align-items:center;gap:8px;margin-left:auto;display:flex}.hbtn{font:inherit;color:#374151;border:1px solid var(--line);cursor:pointer;white-space:nowrap;background:#fff;border-radius:8px;align-items:center;gap:5px;padding:6px 11px;font-size:12px;font-weight:600;display:inline-flex}.hbtn:hover{color:#111827;background:#f7f8fa}.hbtn.primary{background:var(--blue);border-color:var(--blue);color:#fff}.hbtn.primary:hover{color:#fff;background:#312e81}.badge{color:#fff;background:#dc2626;border-radius:999px;justify-content:center;align-items:center;min-width:16px;height:16px;padding:0 4px;font-size:10px;font-weight:700;display:inline-flex}.user-menu{position:relative}.menu{border:1px solid var(--line);z-index:70;background:#fff;border-radius:10px;min-width:150px;padding:5px;position:absolute;top:calc(100% + 6px);right:0;box-shadow:0 8px 24px #0000001f}.menu button{text-align:left;width:100%;font:inherit;color:#374151;cursor:pointer;white-space:nowrap;background:0 0;border:0;border-radius:7px;padding:8px 10px;font-size:13px;display:block}.menu button:hover{color:#111827;background:#f3f4f6}.menu .sep{background:var(--line);height:1px;margin:4px 2px}.icon-dot{background:#dc2626;border-radius:50%;width:7px;height:7px;display:inline-block}.overlay{z-index:80;background:#11182761;justify-content:center;align-items:center;padding:18px;display:flex;position:fixed;inset:0}.dialog{background:#fff;border-radius:14px;flex-direction:column;width:100%;max-width:520px;max-height:90vh;display:flex;overflow:hidden;box-shadow:0 18px 50px #00000038}.dialog.wide{max-width:680px}.dialog-head{border-bottom:1px solid var(--line);align-items:center;gap:10px;padding:16px 18px;display:flex}.dialog-head b{font-size:15px;font-weight:650}.dialog-head .x{color:#9ca3af;cursor:pointer;background:0 0;border:0;border-radius:6px;margin-left:auto;padding:0 2px;font-size:20px;line-height:1}.dialog-head .x:hover{color:#111827;background:#f3f4f6}.dialog-body{padding:16px 18px;overflow-y:auto}.dialog-foot{border-top:1px solid var(--line);background:#fcfcfd;justify-content:flex-end;gap:8px;padding:12px 18px;display:flex}.btn{font:inherit;cursor:pointer;border:1px solid var(--line);color:#374151;background:#fff;border-radius:8px;padding:8px 14px;font-size:13px;font-weight:600}.btn:hover{background:#f7f8fa}.btn.primary{background:var(--blue);border-color:var(--blue);color:#fff}.btn.primary:hover{background:#312e81}.btn.danger{color:#b91c1c;background:#fff;border-color:#fecaca}.btn.danger:hover{background:#fef2f2}.btn:disabled{opacity:.55;cursor:not-allowed}.btn.small{padding:5px 10px;font-size:12px}.field{margin-bottom:14px}.field label,.field .label{color:#374151;margin-bottom:6px;font-size:12px;font-weight:600;display:block}.input,select.input{width:100%;font:inherit;color:var(--ink);background:#fff;border:1px solid #d1d5db;border-radius:8px;padding:9px 11px;font-size:14px}.input:focus,select.input:focus{outline:2px solid var(--blue-line);outline-offset:0;border-color:#a5b4fc}.input.pin{letter-spacing:.35em;text-align:center;font-size:18px;font-weight:600}.hint{color:var(--muted);margin-top:6px;font-size:11px;line-height:1.5}.form-error{color:#991b1b;background:#fef2f2;border:1px solid #fecaca;border-radius:8px;margin-bottom:12px;padding:8px 10px;font-size:12px}.form-ok{background:var(--green-bg);color:#065f46;border:1px solid #a7f3d0;border-radius:8px;margin-bottom:12px;padding:8px 10px;font-size:12px}.summary{background:#f8f9fb;border:1px solid #eef0f3;border-radius:10px;margin-bottom:14px;padding:12px}.summary .line{color:#374151;flex-wrap:wrap;align-items:baseline;gap:8px;padding:3px 0;font-size:13px;display:flex}.summary .line b{color:#111827;font-weight:650}.summary .arrow{color:#9ca3af}.summary .tag{color:var(--blue);background:var(--blue-bg);border-radius:999px;padding:2px 8px;font-size:10px;font-weight:700}.cand-list{flex-direction:column;gap:6px;display:flex}.cand-pick{border:1px solid var(--line);cursor:pointer;background:#fff;border-radius:9px;align-items:center;gap:8px;padding:8px 10px;font-size:13px;display:flex}.cand-pick.on{border-color:var(--blue-line);background:var(--blue-bg)}.cand-pick input{accent-color:var(--blue)}.move-row{color:#374151;border-bottom:1px dashed #eef0f3;flex-wrap:wrap;align-items:baseline;gap:6px;padding:6px 0;font-size:12.5px;display:flex}.move-row:last-child{border-bottom:0}.move-row .who{color:#111827;font-weight:650}.move-row .cls{color:#6b7280}.panel-list{flex-direction:column;gap:10px;display:flex}.change-card{border:1px solid var(--line);background:#fff;border-radius:11px;padding:12px}.change-card .head{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:8px;display:flex}.change-card .head b{font-size:13px}.change-card .when{color:var(--muted);margin-left:auto;font-size:11px}.status-pill{color:#4b5563;background:#f3f4f6;border-radius:999px;padding:2px 8px;font-size:10px;font-weight:700}.status-pill.applied{background:var(--green-bg);color:var(--green)}.status-pill.pending{color:#b45309;background:#fffbeb}.status-pill.rejected,.status-pill.cancelled,.status-pill.stale{color:#991b1b;background:#fef2f2}.confirm-row{color:#4b5563;flex-wrap:wrap;align-items:center;gap:6px;margin-top:8px;font-size:11px;display:flex}.confirm-row .ck{color:var(--green);font-weight:700}.confirm-row .wait{color:#b45309;font-weight:700}.confirm-row .no{color:#b91c1c;font-weight:700}.card-actions{flex-wrap:wrap;gap:6px;margin-top:10px;display:flex}.empty{color:var(--muted);text-align:center;padding:8px 0;font-size:12px}.section-title{color:#4b5563;margin:14px 0 8px;font-size:12px;font-weight:700}.section-title:first-child{margin-top:0}.link-box{align-items:center;gap:6px;margin-top:6px;display:flex}.link-box input{border:1px solid var(--line);color:#4b5563;background:#f9fafb;border-radius:6px;flex:1;min-width:0;padding:6px 8px;font-size:11px}.toast{z-index:120;color:#fff;background:#111827;border-radius:10px;max-width:90vw;padding:10px 16px;font-size:13px;position:fixed;bottom:26px;left:50%;transform:translate(-50%);box-shadow:0 10px 30px #00000040}.toast.err{background:#991b1b}.pd{z-index:1;background:#f59e0b;border-radius:50%;width:7px;height:7px;position:absolute;top:4px;left:4px}.grid .les{cursor:pointer;border-radius:5px}.grid .les .cl,.grid .les .sj{pointer-events:none}.req-btn{font:inherit;color:#065f46;background:var(--green-bg);cursor:pointer;border:1px solid #a7f3d0;border-radius:5px;align-items:center;gap:4px;margin-top:3px;padding:2px 6px;font-size:10px;font-weight:700;display:inline-flex}.req-btn:hover{background:#d1fae5}.send-chip{cursor:pointer}.send-chip:hover{background:var(--blue-bg);border-color:var(--blue-line);color:var(--blue)}.send-chip:disabled{opacity:.5;cursor:default}.send-chip:disabled:hover{color:#374151;background:#f5f6f8;border-color:#e8eaee}.send-chip.self{background:var(--blue-bg);border-color:var(--blue-line);color:var(--blue);font-weight:650}.send-chip.self:hover{background:var(--blue-bg);border-color:var(--blue-line);color:var(--blue)}.send-hint{color:var(--muted);margin-top:10px;font-size:11px}.skeleton{text-align:center;color:var(--muted);padding:40px 16px;font-size:13px}.fatal{border:1px solid var(--line);text-align:center;background:#fff;border-radius:14px;max-width:520px;margin:60px auto;padding:24px;box-shadow:0 1px 2px #00000008}.fatal h2{margin:0 0 8px;font-size:16px}.fatal p{color:var(--muted);margin:0 0 16px;font-size:13px;line-height:1.6}@media (width<=640px){.top{flex-wrap:wrap}.header-actions{width:100%;margin-left:0}.hbtn{padding:5px 9px;font-size:11px}.dialog{max-height:88vh}.dialog-head,.dialog-body{padding:13px 14px}.dialog-foot{padding:10px 14px}.overlay{padding:10px}.toast{font-size:12px;bottom:16px}}@media print{.header-actions,.pd,.req-btn{display:none!important}}
