:root{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;color:#606266;background:#f5f7fa;font-synthesis:none;font-size:14px}*{box-sizing:border-box}body{margin:0}button,input,select,textarea{font:inherit}button{min-height:36px;padding:7px 14px;border:1px solid #dcdfe6;border-radius:5px;background:#fff;color:inherit;cursor:pointer;white-space:nowrap}button:hover:not(:disabled){background:#ecf5ff}button:disabled{opacity:.5;cursor:not-allowed}button.primary{background:#409eff;color:#fff;border-color:#409eff}button.primary:hover:not(:disabled){background:#337ecc}button.quiet,button.text-button{border-color:transparent;background:transparent}button.text-button{color:#409eff;padding:5px 8px}button.danger{color:#ac3434}button.danger-button{background:#a93636;border-color:#a93636;color:#fff}button.danger-button:hover:not(:disabled){background:#902b2b}input,select,textarea{min-height:38px;border:1px solid #dcdfe6;border-radius:5px;padding:8px 10px;background:#fff;color:inherit;width:100%}input:disabled,select:disabled{background:#f2f4f6}input[type=checkbox],input[type=radio]{width:16px;min-height:16px;accent-color:#409eff}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible{outline:2px solid #409eff;outline-offset:3px}label{display:grid;gap:8px;color:#606266}h1,h2{font-weight:600;margin:0;color:#303133}h1{font-size:23px}h2{font-size:18px}p{line-height:1.7}.muted{color:#909399;font-size:13px}.mono,code{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.app-frame{min-height:100vh}.app-header{display:flex;align-items:center;gap:16px;padding:0 28px;min-height:72px;background:#fff;border-bottom:1px solid #e4e7ed}.brand{color:#303133;font-weight:600;font-size:20px;text-decoration:none;white-space:nowrap}.sidebar-toggle{display:none}.app-body{display:flex;min-height:calc(100vh - 72px)}.app-sidebar{width:236px;flex:0 0 236px;display:flex;flex-direction:column;background:#fff;border-right:1px solid #e4e7ed}.app-sidebar nav{display:block;padding:14px 0}.sidebar-group{margin:0;padding:0 12px 10px;border:0}.sidebar-group summary{display:flex;align-items:center;min-height:46px;margin:0;padding:0 14px;color:#303133;font-size:15px;font-weight:600;list-style:none;border-radius:5px}.sidebar-group summary::-webkit-details-marker{display:none}.sidebar-group summary:after{content:"⌄";margin-left:auto;color:#909399;font-size:16px;transform:rotate(-90deg);transition:transform .15s}.sidebar-group[open] summary:after{transform:rotate(0)}.sidebar-group summary:hover{background:#f5f7fa}.sidebar-group a{display:flex;align-items:center;min-height:42px;margin-top:2px;padding:0 14px 0 28px;color:#606266;text-decoration:none;border-radius:5px}.sidebar-group a:hover{background:#f5f7fa}.sidebar-group a.active{color:#409eff;background:#ecf5ff;font-weight:600}.sidebar-logout{margin:auto 12px 18px;border-color:transparent;text-align:left}.sidebar-mask{display:none}.workspace{min-width:0;width:calc(100% - 236px);padding:28px 32px}.page-heading{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:28px}.heading-actions{display:flex;flex-wrap:wrap;gap:10px}.filters{display:grid;grid-template-columns:minmax(140px,.8fr) minmax(160px,1.2fr) minmax(190px,1.2fr) minmax(100px,.7fr) auto;gap:16px;align-items:end;padding-bottom:24px}.filter-actions{display:flex;gap:8px}.table-wrap{overflow-x:auto;background:#fff;border:none;border-radius:0}table{min-width:880px;border-collapse:collapse;width:100%;text-align:left}th{background:#fff;color:#909399;font-weight:500;white-space:nowrap}th,td{padding:12px 16px;border-bottom:1px solid #ebeef5;line-height:1.5}tbody tr:last-child td{border-bottom:none}tbody tr:nth-child(2n){background:#fafafa}tbody tr:hover{background:#f5f7fa}td{overflow-wrap:anywhere}.right{text-align:right}.actions{white-space:nowrap}.status{display:inline-block;border:1px solid transparent;border-radius:4px;padding:1px 7px;font-size:12px;white-space:nowrap}.good{color:#67c23a;background:#f0f9eb;border-color:#e1f3d8}.neutral{color:#909399;background:#f4f4f5;border-color:#e9e9eb}.bad{color:#f56c6c;background:#fef0f0;border-color:#fde2e2}.warning{color:#e6a23c;background:#fdf6ec;border-color:#faecd8}.info{color:#409eff;background:#ecf5ff;border-color:#d9ecff}.empty{text-align:center;padding:70px 20px;color:#909399}.pagination{display:flex;justify-content:space-between;align-items:center;margin-top:18px;color:#909399}.pagination>div{display:flex;align-items:center;gap:16px}.error{background:#fff0ef;color:#a32d2d;border-radius:5px;padding:10px 14px;margin:0 0 18px;line-height:1.6;overflow-wrap:anywhere}.error button{margin-left:8px}.notice{background:#fff6df;color:#7b5d24;border-radius:5px;padding:10px 14px}.login{min-height:100vh;display:grid;place-items:center;padding:24px}.login-form{display:grid;gap:18px;width:min(380px,100%);padding:32px;background:#fff;border:1px solid #e4e7ed;border-radius:8px}.login-form h1{margin-bottom:12px;font-size:22px}.login-form label{margin-bottom:-8px}.login-form .error{margin:0}.token-search{display:flex;align-items:center;gap:12px;margin-bottom:24px}.token-search input{width:260px}.api-hint{margin-top:20px;overflow-wrap:anywhere}dialog{width:min(600px,calc(100vw - 32px));max-height:calc(100dvh - 48px);overflow:auto;padding:24px;border:1px solid #e4e7ed;border-radius:9px;color:inherit;box-shadow:0 20px 80px #172b3926}dialog::backdrop{background:#14242f55}.dialog-header{display:flex;justify-content:space-between;align-items:center;gap:20px;margin-bottom:24px}.dialog-form{display:grid;gap:20px}.dialog-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:24px}.checkbox{display:flex;align-items:center}.student-detail{display:flex;gap:24px;align-items:flex-start}.photo{width:120px;min-width:120px;min-height:150px;display:grid;place-items:center;background:#f2f4f6;color:#74818a;padding:6px;text-align:center;font-size:12px}.photo img{width:100%;height:156px;object-fit:contain}dl{margin:0;display:grid;grid-template-columns:auto 1fr;gap:14px 16px;font-size:13px}dt{color:#909399}dd{margin:0;overflow-wrap:anywhere;min-width:0}details{border-top:1px solid #e4e7ed;margin-top:24px;padding-top:18px}summary{cursor:pointer;color:#606266;margin-bottom:16px}.sync-info{margin-bottom:24px}.sync-info p{margin:10px 0}@media(max-width:1000px){.filters{grid-template-columns:1fr 1fr}.filter-actions{grid-column:1 / -1}}@media(max-width:640px){.app-header{min-height:60px;padding:0 16px}.brand{font-size:16px}.sidebar-toggle{display:inline-flex;min-height:34px;padding:5px 9px}.app-body{min-height:calc(100vh - 60px)}.app-sidebar{position:fixed;z-index:20;inset:60px auto 0 0;width:min(280px,84vw);transform:translate(-100%);transition:transform .18s ease;box-shadow:14px 0 36px #14242f22}.app-sidebar.open{transform:translate(0)}.sidebar-mask{display:block;position:fixed;z-index:19;inset:60px 0 0;background:#14242f55}.workspace{width:100%;padding:24px 16px}.page-heading{flex-wrap:wrap;margin-bottom:22px}.page-heading h1{font-size:21px}.filters{gap:14px 10px}.filters input,.filters select{min-width:0}th,td{padding:12px}table{min-width:880px}.token-search{flex-wrap:wrap}.token-search input{flex:1;min-width:100px}.pagination{font-size:12px}.pagination>div{gap:8px}.student-detail{flex-direction:column}.student-detail dl{width:100%}dialog{padding:20px}}.school-scope{display:flex;margin-bottom:20px;gap:0}.school-scope button{border-radius:0;margin-right:-1px}.school-scope button:first-child{border-radius:4px 0 0 4px}.school-scope button:last-child{border-radius:0 4px 4px 0}.school-scope button.selected{color:#409eff;border-color:#a0cfff;background:#ecf5ff;z-index:1}td:first-child,td:nth-child(2),td:nth-child(3){white-space:nowrap}@media(min-width:641px)and (max-width:900px){.app-sidebar{width:200px;flex-basis:200px}.workspace{width:calc(100% - 200px);padding:24px}}.face-upload{display:flex;flex-wrap:wrap;gap:16px;align-items:center;margin-bottom:24px}.face-drop{flex:1 1 420px;position:relative;display:grid;place-items:center;gap:6px;padding:26px;border:1px dashed #c6cdd6;border-radius:8px;background:#fff;text-align:center;cursor:pointer}.face-drop.dragging{border-color:#409eff;background:#ecf5ff}.face-drop input[type=file]{position:absolute;width:1px;height:1px;opacity:0}.face-actions{display:flex;gap:8px}.face-layout{display:grid;grid-template-columns:minmax(280px,46%) minmax(0,1fr);gap:28px;align-items:start}.face-photo{position:relative;line-height:0;background:#fff}.face-photo img{width:100%;height:auto;display:block}.face-photo svg{position:absolute;inset:0;width:100%;height:100%}.face-photo rect{fill:none;stroke:#e6a23c;stroke-width:3;pointer-events:none}.face-photo rect.matched{stroke:#67c23a;stroke-width:4;cursor:pointer;pointer-events:all}.face-photo rect.unmatched{stroke:#f56c6c;stroke-width:4}.face-photo rect.selected{stroke:#409eff;stroke-width:5;cursor:pointer;pointer-events:all}.face-photo rect.active{fill:#409eff22}.face-photo text{fill:#fff;font-weight:700;paint-order:stroke;stroke:#14242f;stroke-width:6px;pointer-events:none}.face-mode{display:flex;margin-bottom:18px}.face-mode button{border-radius:0;margin-right:-1px}.face-mode button:first-child{border-radius:4px 0 0 4px}.face-mode button:last-child{border-radius:0 4px 4px 0}.face-mode button.selected{color:#409eff;border-color:#a0cfff;background:#ecf5ff;z-index:1}.face-result h2{margin:18px 0 10px}.face-result dl{margin:14px 0}.face-table{min-width:0}.legend{display:flex;flex-wrap:wrap;gap:16px;align-items:center;margin:12px 0 0;font-size:13px;color:#606266}.legend .dot{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:6px;vertical-align:middle}.legend .dot.matched{background:#67c23a}.legend .dot.unmatched{background:#f56c6c}.legend .dot.selected{background:#409eff}@media(max-width:900px){.face-layout{grid-template-columns:1fr}}.attendance-filters{grid-template-columns:repeat(5,minmax(130px,1fr)) auto}.attendance-table{min-width:1080px}.period-issue{display:block;color:#b26a00;white-space:nowrap;margin:2px 0}.attendance-summary{display:flex;flex-wrap:wrap;gap:10px 28px;margin-bottom:20px}.attendance-summary p{margin:0}.compact-table{min-width:620px}.timeline{border-left:2px solid #dcdfe6;padding-left:16px}.timeline p{margin:10px 0}dialog h2{font-size:15px;margin:24px 0 12px;color:#303133}@media(max-width:1100px){.attendance-filters{grid-template-columns:1fr 1fr}}.schedule-scope{display:flex;margin-bottom:22px}.schedule-scope button{border-radius:0;margin-right:-1px}.schedule-scope button:first-child{border-radius:5px 0 0 5px}.schedule-scope button:last-child{border-radius:0 5px 5px 0}.schedule-scope button.selected{position:relative;z-index:1;color:#409eff;border-color:#a0cfff;background:#ecf5ff}.schedule-controls{display:grid;grid-template-columns:minmax(180px,.8fr) minmax(260px,1.5fr) minmax(180px,.8fr);gap:16px;align-items:end;margin-bottom:22px}.schedule-meta{margin:0 0 14px}.schedule-table-wrap{overflow:auto;background:#fff}.schedule-table{min-width:1120px;table-layout:fixed}.schedule-table th:first-child{width:105px}.schedule-table thead th{text-align:center}.schedule-table tbody th{vertical-align:top;background:#fff;text-align:center}.schedule-table tbody th strong,.schedule-table tbody th span{display:block}.schedule-table tbody th span{margin-top:5px;color:#909399;font-size:12px;font-weight:400}.schedule-table td{height:82px;padding:6px;vertical-align:top;white-space:normal}.schedule-lesson{padding:7px 8px;border-left:3px solid #409eff;background:#ecf5ff;line-height:1.4}.schedule-lesson+.schedule-lesson{margin-top:6px}.schedule-lesson strong,.schedule-lesson span,.schedule-lesson small{display:block}.schedule-lesson strong{color:#303133;font-size:13px}.schedule-lesson span{margin-top:3px;color:#606266;font-size:12px}.schedule-lesson small{margin-top:4px;color:#b26a00}.schedule-lesson.changed{border-left-color:#e6a23c;background:#fdf6ec}@media(max-width:900px){.schedule-controls{grid-template-columns:1fr}}.query-mode{display:flex;margin-bottom:22px}.query-mode button{border-radius:0;margin-right:-1px}.query-mode button:first-child{border-radius:5px 0 0 5px}.query-mode button:last-child{border-radius:0 5px 5px 0}.query-mode button.selected{position:relative;z-index:1;color:#409eff;border-color:#a0cfff;background:#ecf5ff}.dorm-filters{display:grid;grid-template-columns:repeat(4,minmax(170px,1fr));gap:16px;max-width:1160px;margin-bottom:24px}.dorm-filters.class-mode{grid-template-columns:minmax(260px,420px)}.dorm-table{min-width:900px}.option-list{display:grid;gap:10px;border:1px solid #e4e7ed;border-radius:5px;padding:12px 16px;margin:0}.option-list legend{padding:0 6px;color:#606266;font-size:13px}.option-list-scroll{max-height:min(340px,42dvh);overflow-y:auto;overscroll-behavior:contain}@media(max-width:800px){.dorm-filters{grid-template-columns:1fr}}
