@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:100 900;src:url(/fonts/Inter-latin-wght.woff2) format("woff2-variations"),url(/fonts/Inter-latin-wght.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}:root{--color-primary-default:#1f3a5f;--color-primary-pressed:#142842;--color-primary-subtle:#eaf0f7;--color-accent-gold:#a67c2e;--color-text-primary:#1a2230;--color-text-secondary:#3a4456;--color-text-muted:#5b6576;--color-text-placeholder:#8a93a3;--color-text-on-primary:#ffffff;--color-border-default:#dde2e8;--color-border-strong:#c9d0d9;--color-surface-page:#f6f7f9;--color-surface-card:#ffffff;--color-surface-sunken:#f1f3f6;--color-status-present:#1e6b52;--color-status-present-bg:#e6f3ee;--color-status-late:#8a5300;--color-status-late-bg:#fff3e0;--color-status-leave:#24588f;--color-status-leave-bg:#e8f1fb;--color-status-absent:#5b4b8a;--color-status-absent-bg:#f0edf7;--color-status-unexcused:#b3261e;--color-status-unexcused-bg:#fdecea;--color-status-pending:#4a5363;--color-status-pending-bg:#eceef2;--color-feedback-danger:var(--color-status-unexcused);--color-feedback-danger-bg:var(--color-status-unexcused-bg);--color-feedback-success:var(--color-status-present);--color-feedback-success-bg:var(--color-status-present-bg);--color-feedback-warning:var(--color-status-late);--color-feedback-warning-bg:var(--color-status-late-bg);--color-feedback-info:var(--color-status-leave);--color-feedback-info-bg:var(--color-status-leave-bg);--color-chart-previous:#7891b3;--radius-card:12px;--radius-control:8px;--radius-badge:6px;--radius-pill:999px;--font-ui:"Inter","PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans SC","Source Han Sans SC",system-ui,sans-serif;--font-serif:"Songti SC","Noto Serif SC","Source Han Serif SC","STSong","SimSun",serif;--sidebar-w:224px;--topbar-h:56px;color-scheme:light;font-family:var(--font-ui);font-size:14px;line-height:22px;color:var(--color-text-primary);background:var(--color-surface-page);-webkit-font-smoothing:antialiased;font-synthesis:none}*{box-sizing:border-box}body{background:var(--color-surface-page)}body,h1,h2,h3,h4,p{margin:0}a{text-decoration:none}a,button{color:inherit}button{font:inherit;background:none;border:0;padding:0;cursor:pointer}button:disabled{cursor:not-allowed}:focus-visible{outline:2px solid var(--color-primary-default);outline-offset:2px}svg{flex-shrink:0}code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;background:var(--color-surface-sunken);padding:1px 5px;border-radius:4px}.num{font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}.muted{color:var(--color-text-muted)}.small{font-size:13px;line-height:20px}.caption{font-size:12px;line-height:18px;color:var(--color-text-muted)}.nowrap{white-space:nowrap}.spin{animation:spin .9s linear infinite}@keyframes spin{to{transform:rotate(1turn)}}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}input:not([type=checkbox]):not([type=radio]):not([type=file]),select,textarea{font:inherit;color:var(--color-text-primary);background:var(--color-surface-card);border:1px solid var(--color-border-strong);border-radius:var(--radius-control);height:36px;padding:0 12px;max-width:100%;outline:none;transition:border-color .15s,box-shadow .15s}textarea{height:auto;min-height:88px;padding:8px 12px;line-height:22px;resize:vertical}select{padding-right:30px;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%235B6576' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;cursor:pointer}input::placeholder,textarea::placeholder{color:var(--color-text-placeholder)}input:focus,select:focus,textarea:focus{border-color:var(--color-primary-default);box-shadow:0 0 0 3px var(--color-primary-subtle)}input:disabled,select:disabled,textarea:disabled,textarea:read-only{background:var(--color-surface-sunken);color:var(--color-text-muted)}input.invalid,input[aria-invalid=true]{border-color:var(--color-feedback-danger);background:var(--color-feedback-danger-bg)}input[type=checkbox],input[type=radio]{accent-color:var(--color-primary-default);width:16px;height:16px;margin:0}input.toggle{appearance:none;width:36px;height:20px;border-radius:var(--radius-pill);background:var(--color-border-strong);position:relative;cursor:pointer;flex-shrink:0;transition:background .15s}input.toggle:after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;transition:transform .15s}input.toggle:checked{background:var(--color-primary-default)}input.toggle:checked:after{transform:translateX(16px)}.toggle-row{display:flex;align-items:center;gap:10px;cursor:pointer}.toggle-row span{display:flex;flex-direction:column}.toggle-row b{font-weight:500}.toggle-row small{font-size:12px;line-height:18px;color:var(--color-text-muted)}.toggle-row.disabled{opacity:.6;cursor:default}.field{display:flex;flex-direction:column;gap:6px;min-width:0}.field-label{display:flex;align-items:baseline;gap:8px;font-size:13px;line-height:20px;font-weight:500;color:var(--color-text-secondary)}.field-extra{margin-left:auto;font-weight:400}.field-extra,.field-hint{font-size:12px;color:var(--color-text-muted)}.field-hint{line-height:18px}.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.form-grid .span-2{grid-column:1/-1}.input-suffix{position:relative;display:flex;align-items:center}.input-suffix input{width:100%;padding-right:42px}.input-suffix span{position:absolute;right:12px;font-size:13px;color:var(--color-text-muted);pointer-events:none}.search{position:relative;display:flex;align-items:center}.search svg{position:absolute;left:10px;color:var(--color-text-muted);pointer-events:none}.search input{padding-left:32px!important}.card-head input,.card-head select,.page-header input[type=date],.page-header select,.search input,.select-sm{height:32px!important;font-size:13px}.error-text{color:var(--color-feedback-danger);font-size:13px;line-height:20px;white-space:pre-line}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:36px;padding:0 14px;border-radius:var(--radius-control);border:1px solid transparent;font-size:14px;font-weight:500;white-space:nowrap;transition:background .15s,border-color .15s,color .15s}.btn-lg{height:44px;padding:0 18px;font-size:15px}.btn-sm{height:30px;padding:0 10px;font-size:13px}.btn-primary{background:var(--color-primary-default);color:var(--color-text-on-primary)}.btn-primary:hover:not(:disabled){background:var(--color-primary-pressed)}.btn-secondary{background:var(--color-surface-card);border-color:var(--color-border-strong);color:var(--color-text-primary)}.btn-secondary:hover:not(:disabled){border-color:var(--color-primary-default);color:var(--color-primary-default)}.btn-ghost{color:var(--color-primary-default);padding:0 8px}.btn-ghost:hover:not(:disabled){background:var(--color-primary-subtle)}.btn-danger{background:var(--color-feedback-danger);color:#fff}.btn:disabled{opacity:.45}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:var(--radius-control);color:var(--color-text-muted);position:relative}.icon-btn:hover{background:var(--color-surface-sunken);color:var(--color-text-primary)}.link-btn{color:var(--color-primary-default);font-weight:500;font-size:13px;text-decoration:underline;text-underline-offset:2px}.link-btn:hover{text-decoration:underline}.btn-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.btn-row.end{justify-content:flex-end}.chip,.tag{display:inline-flex;align-items:center;gap:4px;height:24px;padding:0 8px;border-radius:var(--radius-badge);font-size:12px;line-height:18px;font-weight:500;white-space:nowrap}.chip-present{color:var(--color-status-present);background:var(--color-status-present-bg)}.chip-late{color:var(--color-status-late);background:var(--color-status-late-bg)}.chip-leave{color:var(--color-status-leave);background:var(--color-status-leave-bg)}.chip-absent{color:var(--color-status-absent);background:var(--color-status-absent-bg)}.chip-unexcused{color:var(--color-status-unexcused);background:var(--color-status-unexcused-bg)}.chip-pending{color:var(--color-status-pending);background:var(--color-status-pending-bg)}.tag:before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}.tag-draft{color:var(--color-status-pending);background:var(--color-status-pending-bg)}.tag-ready{color:var(--color-status-leave);background:var(--color-status-leave-bg)}.tag-published{color:var(--color-status-present);background:var(--color-status-present-bg)}.tag-correcting{color:var(--color-status-late);background:var(--color-status-late-bg)}.tag-stale{color:var(--color-status-unexcused);background:var(--color-status-unexcused-bg)}.demo-tag{display:inline-flex;align-items:center;height:24px;padding:0 8px;border:1px solid var(--color-accent-gold);border-radius:var(--radius-badge);font-size:12px;font-weight:600;color:var(--color-text-primary);white-space:nowrap}.count{min-width:18px;height:18px;padding:0 6px;border-radius:var(--radius-pill);background:var(--color-feedback-danger);color:#fff;font-size:11px}.avatar,.count{display:inline-flex;align-items:center;justify-content:center;font-weight:600}.avatar{border-radius:50%;background:var(--color-primary-subtle);flex-shrink:0}.avatar,.grade-letter{color:var(--color-primary-default)}.grade-letter{font-weight:600}.pill{display:inline-flex;align-items:center;height:28px;padding:0 10px;border-radius:var(--radius-pill);background:var(--color-surface-sunken);font-size:13px;color:var(--color-text-secondary);white-space:nowrap}.app{display:flex;min-height:100vh;background:linear-gradient(90deg,var(--color-surface-card) calc(var(--sidebar-w) - 1px),var(--color-border-default) calc(var(--sidebar-w) - 1px),var(--color-border-default) var(--sidebar-w),var(--color-surface-page) var(--sidebar-w))}.sidebar{width:var(--sidebar-w);flex-shrink:0;height:100vh;position:sticky;top:0;display:flex;flex-direction:column;background:var(--color-surface-card);border-right:1px solid var(--color-border-default);z-index:40}.brand{display:flex;align-items:center;gap:10px;padding:18px 20px 14px;text-align:left}.brand,.brand>span:last-child{min-width:0}.brand-mark{width:32px;height:32px;border-radius:var(--radius-control);background:var(--color-primary-default);color:#fff;display:inline-flex;align-items:center;justify-content:center;font-weight:700;font-size:15px;flex-shrink:0}.brand b{display:block;font-size:15px;font-weight:600}.brand small{display:block;font-size:12px;line-height:18px;color:var(--color-text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nav{flex:1;overflow-y:auto;padding:4px 12px 12px}.nav-group{display:flex;flex-direction:column;gap:2px;margin-bottom:6px}.nav-group-title{padding:10px 12px 4px;font-size:12px;line-height:18px;color:var(--color-text-placeholder)}.nav-divider{height:1px;background:var(--color-border-default);margin:6px 0}.nav-item{display:flex;align-items:center;gap:10px;height:38px;padding:0 12px;border-radius:var(--radius-control);color:var(--color-text-secondary);text-align:left;width:100%}.nav-item:hover{background:var(--color-surface-sunken)}.nav-item svg{color:var(--color-text-muted)}.nav-item .count{margin-left:auto}.nav-item.active{background:var(--color-primary-subtle);font-weight:600}.nav-item.active,.nav-item.active svg{color:var(--color-primary-default)}.sidebar-user{display:flex;align-items:center;gap:10px;padding:12px 16px;border-top:1px solid var(--color-border-default);text-align:left}.sidebar-user:hover{background:var(--color-surface-sunken)}.sidebar-user b{display:block;font-weight:500}.sidebar-user small{display:block;font-size:12px;line-height:18px;color:var(--color-text-muted)}.main{flex:1;min-width:0;display:flex;flex-direction:column}.topbar{height:var(--topbar-h);position:sticky;top:0;z-index:30;display:flex;align-items:center;gap:12px;padding:0 24px;background:var(--color-surface-card);border-bottom:1px solid var(--color-border-default)}.topbar-term{font-weight:500;color:var(--color-text-secondary)}.topbar-date,.topbar-term{font-size:13px;white-space:nowrap}.topbar-date{color:var(--color-text-muted)}.topbar-spacer{flex:1}.topbar select{height:32px;font-size:13px}.identity-wrap{position:relative;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;gap:6px;height:40px;padding:0 10px;border:1px solid var(--color-primary-default);border-radius:var(--radius-control);background:var(--color-primary-subtle);color:var(--color-primary-default)}.identity-wrap:hover{background:var(--color-surface-sunken)}.identity-wrap:focus-within{outline:2px solid var(--color-primary-default);outline-offset:2px}.identity-label{display:flex;flex-direction:column;align-items:center;font-size:13px;font-weight:600;line-height:16px;white-space:nowrap}.identity-label small{font-size:10px;line-height:12px;font-weight:400}.topbar .identity{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}.topbar .menu-btn{display:none}.topbar-title{display:none;font-weight:700;font-size:17px}.dot{position:absolute;top:6px;right:6px;width:8px;height:8px;border-radius:50%;background:var(--color-feedback-danger);border:2px solid var(--color-surface-card)}.content{padding:24px 32px 40px;display:flex;flex-direction:column;gap:20px;width:100%;max-width:1440px}.shade,.tabbar{display:none}.page-header{display:flex;align-items:flex-end;gap:12px;flex-wrap:wrap}.page-header-text{flex:1;min-width:240px}.page-header h1{font-size:22px;line-height:30px;font-weight:700}.page-header p{margin-top:4px;font-size:13px;line-height:20px;color:var(--color-text-muted)}.page-header-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.breadcrumb{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--color-text-muted)}.breadcrumb button:hover{color:var(--color-primary-default)}.cols{display:grid;grid-template-columns:minmax(0,1fr) 380px;gap:20px;align-items:start}.cols.wide-aside{grid-template-columns:minmax(0,1fr) 420px}.cols.narrow-aside{grid-template-columns:minmax(0,1fr) 320px}.cols.report-cols{grid-template-columns:minmax(0,1fr) 560px}.cols.three{grid-template-columns:280px minmax(0,1fr) 300px}.stack{gap:20px}.stack,.stack-sm{display:flex;flex-direction:column;min-width:0}.stack-sm{gap:12px}.row{display:flex;align-items:center;gap:8px}.row.wrap{flex-wrap:wrap}.grow{flex:1;min-width:0}.card{background:var(--color-surface-card);border:1px solid var(--color-border-default);border-radius:var(--radius-card);overflow:hidden;overflow:clip;min-width:0}.card-head{display:flex;align-items:center;gap:12px;padding:14px 20px;border-bottom:1px solid var(--color-border-default);flex-wrap:wrap}.card-head-text{flex:1;min-width:160px}.card-head h2{font-size:16px;line-height:24px;font-weight:700}.card-head p{font-size:12px;line-height:18px;color:var(--color-text-muted)}.card-head-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.card-body{padding:16px 20px}.card-body.stack,.card-body.stack-sm,.card-foot{display:flex}.card-foot{padding:12px 20px;border-top:1px solid var(--color-border-default);align-items:center;gap:12px;flex-wrap:wrap}.card-note{padding:12px 20px;font-size:12px;line-height:18px;color:var(--color-text-muted)}.list-row{display:flex;align-items:center;gap:12px;padding:12px 20px;border-top:1px solid var(--color-border-default);width:100%;text-align:left}.card-head+.list-row,.list-row:first-child{border-top:0}button.list-row:hover{background:var(--color-surface-sunken)}.list-row.active{background:var(--color-primary-subtle);box-shadow:inset 3px 0 0 var(--color-primary-default)}.list-main{flex:1;min-width:0;display:flex;flex-direction:column}.list-main b{font-weight:500}.list-main small,.list-sub{font-size:12px;line-height:18px;color:var(--color-text-muted)}.name{display:flex;align-items:baseline;gap:6px;flex-wrap:wrap}.name b{font-weight:500}.name small{font-size:12px;color:var(--color-text-muted)}.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}.stat{background:var(--color-surface-card);border:1px solid var(--color-border-default);border-radius:var(--radius-card);padding:16px 20px;display:flex;flex-direction:column;gap:4px;min-width:0}.stat-label{font-size:13px;line-height:20px;color:var(--color-text-muted)}.stat-value{font-size:24px;line-height:32px;font-weight:600;font-variant-numeric:tabular-nums}.stat-value small{font-size:13px;font-weight:400;margin-left:4px}.stat-sub,.stat-value small{color:var(--color-text-muted)}.stat-sub{font-size:12px;line-height:18px}.tone-danger{color:var(--color-feedback-danger)}.tone-success{color:var(--color-feedback-success)}.tone-warning{color:var(--color-feedback-warning)}.banner{display:flex;align-items:center;gap:10px;padding:12px 16px;border-radius:var(--radius-control)}.banner-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.banner b{font-weight:500}.banner p{font-size:13px;line-height:20px;color:var(--color-text-secondary)}.banner-actions{display:flex;gap:8px;flex-shrink:0}.banner-info{background:var(--color-feedback-info-bg)}.banner-info .banner-icon{color:var(--color-feedback-info)}.banner-warning{background:var(--color-feedback-warning-bg)}.banner-warning .banner-icon{color:var(--color-feedback-warning)}.banner-danger{background:var(--color-feedback-danger-bg)}.banner-danger .banner-icon{color:var(--color-feedback-danger)}.banner-success{background:var(--color-feedback-success-bg)}.banner-success .banner-icon{color:var(--color-feedback-success)}.banner ul{margin:4px 0 0;padding-left:18px;font-size:13px;line-height:20px;color:var(--color-text-secondary)}.tabs{display:flex;gap:24px;border-bottom:1px solid var(--color-border-default);overflow-x:auto;scrollbar-width:none}.tab{display:inline-flex;align-items:center;gap:6px;padding:10px 2px;border-bottom:2px solid transparent;margin-bottom:-1px;color:var(--color-text-secondary);white-space:nowrap}.tab:hover{color:var(--color-text-primary)}.tab.active{color:var(--color-primary-default);border-bottom-color:var(--color-primary-default);font-weight:600}.tab-count{font-size:12px;color:var(--color-text-muted);font-weight:400}.seg{display:inline-flex;padding:2px;gap:2px;border-radius:var(--radius-control);background:var(--color-surface-sunken);max-width:100%;overflow-x:auto}.seg button{height:28px;padding:0 12px;border-radius:6px;font-size:13px;color:var(--color-text-muted);white-space:nowrap;border:1px solid transparent}.seg button.active{background:var(--color-surface-card);border-color:var(--color-border-default);color:var(--color-text-primary);font-weight:600}.seg.seg-sm button{height:24px;padding:0 10px;font-size:12px}.table-wrap{overflow-x:auto}.table{width:100%;border-collapse:collapse}.table th{height:40px;padding:0 12px;background:var(--color-surface-sunken);font-size:12px;line-height:18px;font-weight:500;color:var(--color-text-muted);text-align:left;white-space:nowrap}.table td{padding:10px 12px;border-top:1px solid var(--color-border-default);vertical-align:middle}.table td:first-child,.table th:first-child{padding-left:20px}.table td:last-child,.table th:last-child{padding-right:20px}.table .num,.table th.num{text-align:right;font-variant-numeric:tabular-nums}.table .center{text-align:center}.table .zero{color:var(--color-text-placeholder)}.table tr.row-danger td{background:var(--color-feedback-danger-bg)}.table tr.row-active td{background:var(--color-primary-subtle)}.table tr.clickable{cursor:pointer}.table tr.clickable:hover td{background:var(--color-surface-sunken)}.table td small{display:block;font-size:12px;line-height:18px;color:var(--color-text-muted)}.table input:not([type=checkbox]),.table select{height:32px;font-size:13px}.table .actions{text-align:right;white-space:nowrap}.overlay{position:fixed;inset:0;z-index:100;background:rgba(26,34,48,.32);display:flex;align-items:center;justify-content:center;padding:24px}.overlay-drawer{justify-content:flex-end;padding:0}.dialog{width:520px;max-width:100%;max-height:calc(100vh - 48px);display:flex;flex-direction:column;background:var(--color-surface-card);border-radius:var(--radius-card);box-shadow:0 16px 48px rgba(26,34,48,.2)}.dialog-wide{width:720px}.dialog-head{display:flex;align-items:flex-start;gap:12px;padding:18px 24px;border-bottom:1px solid var(--color-border-default)}.dialog-head>div{flex:1}.dialog-head h2{font-size:16px;line-height:24px;font-weight:700}.dialog-head p{font-size:12px;line-height:18px;color:var(--color-text-muted)}.dialog-body{padding:20px 24px;display:flex;flex-direction:column;gap:16px;overflow-y:auto}.dialog-foot{padding:14px 24px;border-top:1px solid var(--color-border-default);display:flex;justify-content:flex-end;gap:12px;align-items:center}.drawer{width:480px;max-width:100%;height:100%;background:var(--color-surface-card);display:flex;flex-direction:column;box-shadow:-8px 0 24px rgba(26,34,48,.16)}.drawer-body{flex:1;overflow-y:auto;padding:20px 24px;display:flex;flex-direction:column;gap:18px}.toast{position:fixed;right:24px;bottom:24px;z-index:120;max-width:440px;display:flex;align-items:flex-start;gap:10px;padding:12px 14px;background:var(--color-text-primary);color:#fff;border-radius:var(--radius-control);box-shadow:0 8px 24px rgba(26,34,48,.24);font-size:13px;line-height:20px}.toast button{color:#fff;opacity:.7}.busy-line{position:fixed;top:0;left:0;right:0;height:2px;z-index:200;background:linear-gradient(90deg,transparent,var(--color-primary-default),transparent);animation:busy 1s linear infinite}@keyframes busy{0%{transform:translateX(-60%)}to{transform:translateX(60%)}}.empty{padding:40px 20px;display:flex;flex-direction:column;align-items:center;gap:6px;text-align:center;color:var(--color-text-muted)}.empty b{color:var(--color-text-primary);font-weight:500}.empty p{font-size:13px;max-width:420px}.empty .btn{margin-top:8px}.loader{gap:12px;color:var(--color-text-muted)}.loader,.login{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center}.login{gap:24px;padding:24px 16px}.login-brand{display:flex;align-items:center;gap:12px}.login-brand .brand-mark{width:40px;height:40px;font-size:17px}.login-brand b{display:block;font-size:16px;font-weight:700}.login-brand small{font-size:12px;color:var(--color-text-muted)}.login-card{width:420px;max-width:100%;background:var(--color-surface-card);border:1px solid var(--color-border-default);border-radius:var(--radius-card);padding:32px;display:flex;flex-direction:column;gap:20px}.login-card h1{font-size:22px;line-height:30px;font-weight:700}.login-card form{display:flex;flex-direction:column;gap:20px}.login-foot{font-size:12px;color:var(--color-text-placeholder)}.unlinked{align-items:center;text-align:center}.unlinked-icon{width:64px;height:64px;border-radius:50%;background:var(--color-feedback-warning-bg);color:var(--color-feedback-warning);display:flex;align-items:center;justify-content:center}.id-box{width:100%;text-align:left;border:1px solid var(--color-border-default);border-radius:var(--radius-card);padding:14px;display:flex;flex-direction:column;gap:8px}.id-box strong{font-size:18px;font-weight:600;font-variant-numeric:tabular-nums;word-break:break-all}.lesson-time{display:flex;flex-direction:column;line-height:18px}.lesson-time b{font-weight:500}.lesson-time small{font-size:12px;color:var(--color-text-muted)}.period-box{width:56px;flex-shrink:0;padding:6px 0;border-radius:var(--radius-control);background:var(--color-primary-subtle);color:var(--color-primary-default);display:flex;flex-direction:column;align-items:center;font-size:12px;line-height:18px}.period-box b{font-size:16px;line-height:24px;font-weight:600}.lesson-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:12px}.lesson-card{padding:16px;display:flex;flex-direction:column;gap:14px}.lesson-card-top{display:flex;gap:14px;align-items:flex-start}.roster{display:flex;flex-direction:column}.roster-row{display:grid;grid-template-columns:minmax(180px,1fr) auto;gap:12px 16px;align-items:center;padding:12px 20px;border-top:1px solid var(--color-border-default)}.roster-row:first-child{border-top:0}.roster-row.exception{background:#fbfcfd}.roster-who{display:flex;align-items:center;gap:10px;min-width:0}.roster-note{grid-column:1/-1}.roster-note input{width:100%}.picker{display:inline-grid;grid-template-columns:repeat(5,minmax(64px,1fr));border:1px solid var(--color-border-strong);border-radius:var(--radius-control);overflow:hidden}.picker button{min-height:36px;padding:4px 8px;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:13px;line-height:18px;color:var(--color-text-secondary);background:var(--color-surface-card);border-left:1px solid var(--color-border-strong)}.picker button:first-child{border-left:0}.picker button small{font-size:11px;line-height:14px;color:var(--color-text-muted)}.picker button:disabled{cursor:default}.picker button.on{font-weight:600}.picker button.on.present{background:var(--color-status-present-bg);color:var(--color-status-present)}.picker button.on.late{background:var(--color-status-late-bg);color:var(--color-status-late)}.picker button.on.leave{background:var(--color-status-leave-bg);color:var(--color-status-leave)}.picker button.on.absent{background:var(--color-status-absent-bg);color:var(--color-status-absent)}.picker button.on.unexcused{background:var(--color-status-unexcused-bg);color:var(--color-status-unexcused)}.picker button.on small{color:inherit}.submit-bar{position:sticky;bottom:0;z-index:10;display:flex;align-items:center;gap:12px;padding:12px 20px;background:var(--color-surface-card);border-top:1px solid var(--color-border-default)}.score-input{width:96px;text-align:right;font-variant-numeric:tabular-nums}.weight-bar{display:flex;height:8px;border-radius:var(--radius-pill);overflow:hidden;gap:2px}.weight-bar span:first-child{background:var(--color-primary-default)}.weight-bar span:last-child{background:var(--color-accent-gold)}.progress{height:6px;background:var(--color-surface-sunken);overflow:hidden;width:100%}.progress,.progress span{border-radius:var(--radius-pill)}.progress span{display:block;height:100%;background:var(--color-primary-default)}.template-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px 16px}.impact-points{display:flex;flex-direction:column;gap:12px;padding:14px 20px}.impact-points>div{display:flex;gap:10px;align-items:flex-start}.impact-points b{display:block;font-weight:500}.impact-points small{font-size:12px;color:var(--color-text-muted)}.chart-dist{display:flex;align-items:flex-end;justify-content:center;gap:24px;height:180px;padding:16px 20px 0;border-bottom:1px solid var(--color-border-strong);margin:0 20px}.chart-dist .col{display:flex;flex-direction:column;align-items:center;gap:6px;width:44px}.chart-dist .bar{width:44px;min-height:2px;background:var(--color-primary-default);border-radius:4px 4px 0 0}.chart-dist .bar.zero{background:var(--color-border-strong)}.chart-dist .val{font-weight:600;font-variant-numeric:tabular-nums}.chart-dist-labels{display:flex;justify-content:center;gap:24px;padding:6px 20px 0;margin:0 20px}.chart-dist-labels span{width:44px;text-align:center;font-weight:500;color:var(--color-text-secondary)}.chart-legend{display:flex;gap:16px;flex-wrap:wrap;font-size:12px;color:var(--color-text-secondary)}.chart-legend i{display:inline-block;width:12px;height:12px;border-radius:2px;margin-right:6px;vertical-align:-1px}.chart-pairs{display:flex;flex-direction:column;gap:4px;padding:12px 20px 16px}.chart-pair{display:grid;grid-template-columns:88px minmax(0,1fr);gap:12px;align-items:center;padding:6px 0}.chart-pair-bars{display:flex;flex-direction:column;gap:3px}.hbar{display:flex;align-items:center;gap:8px;font-size:12px;font-weight:600;font-variant-numeric:tabular-nums}.hbar i{height:12px;border-radius:0 4px 4px 0;min-width:2px}.hbar i.prev{background:var(--color-chart-previous)}.hbar i.curr{background:var(--color-primary-default)}.hbar.none{font-weight:400;color:var(--color-text-muted);height:12px}.paper-stage{background:var(--color-surface-sunken);padding:20px;display:flex;justify-content:center;overflow-x:auto}.paper{width:100%;max-width:640px;background:#fff;border:1px solid var(--color-border-default);padding:32px 36px;display:flex;flex-direction:column;gap:16px;font-size:13px;line-height:20px}.paper-head{display:flex;align-items:flex-end;gap:12px;padding-bottom:10px;border-bottom:2px solid var(--color-accent-gold)}.paper-head strong{display:block;font-family:var(--font-serif);font-size:15px;color:var(--color-primary-default);font-weight:600}.paper-head span{font-size:12px;color:var(--color-text-muted)}.paper-title h3{font-family:var(--font-serif);font-size:24px;line-height:32px;font-weight:600;color:var(--color-primary-default)}.paper-title p{font-family:var(--font-serif);font-size:16px;color:var(--color-text-secondary)}.paper-title small{display:block;font-size:12px;color:var(--color-text-muted)}.paper-info{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 16px;padding:12px 14px;background:var(--color-surface-sunken);border-radius:4px}.paper-info small{display:block;font-size:11px;color:var(--color-text-muted)}.paper-info b{font-weight:500}.paper-section h4{display:flex;align-items:center;gap:8px;font-family:var(--font-serif);font-size:15px;font-weight:600;color:var(--color-primary-default);margin-bottom:8px}.paper-section h4:before{content:"";width:3px;height:15px;background:var(--color-accent-gold)}.paper-section h4 span{font-family:var(--font-ui);font-size:12px;font-weight:400;color:var(--color-text-muted)}.paper-table{width:100%;border-collapse:collapse;font-size:12px}.paper-table th{text-align:left;font-weight:500;color:var(--color-text-secondary);padding:6px;background:var(--color-surface-sunken);border-top:1.5px solid var(--color-primary-default);line-height:16px}.paper-table td small,.paper-table th span{display:block;font-weight:400;font-size:11px;color:var(--color-text-muted)}.paper-table td{padding:6px;border-bottom:1px solid var(--color-border-default);vertical-align:top;overflow-wrap:anywhere}.paper-table .num{text-align:right}.paper-table .grade{text-align:right;font-weight:600;color:var(--color-primary-default)}.paper-table tr.comment td{color:var(--color-text-secondary);font-size:12px}.paper-att{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:6px}.paper-att div{background:var(--color-surface-sunken);border-radius:4px;padding:6px;text-align:center}.paper-att strong{display:block;font-size:16px;font-variant-numeric:tabular-nums}.paper-att span{font-size:11px;line-height:14px;color:var(--color-text-muted);display:block}.paper-scale{display:flex;flex-wrap:wrap;gap:6px;font-size:12px}.paper-scale span{border:1px solid var(--color-border-default);padding:2px 8px;border-radius:4px}.paper-sign{display:flex;align-items:flex-end;justify-content:space-between;gap:24px;padding-top:16px}.paper-sign div{flex:1;border-top:1px solid var(--color-text-muted);padding-top:6px;font-size:11px;color:var(--color-text-muted)}.paper-sign .stamp{flex:0 0 72px;height:72px;border:1px dashed var(--color-border-strong);border-radius:50%;display:flex;align-items:center;justify-content:center;padding:0;line-height:14px}.paper-foot,.paper-sign .stamp{text-align:center;font-size:11px}.paper-foot{color:var(--color-text-placeholder);border-top:1px solid var(--color-border-default);padding-top:8px}.comment-editor textarea{width:100%;min-height:160px}.counter{font-size:12px;color:var(--color-text-muted);font-variant-numeric:tabular-nums}.counter.over{color:var(--color-feedback-danger);font-weight:600}.pill-row{display:flex;flex-wrap:wrap;gap:8px}.dropzone{display:flex;align-items:center;gap:12px;padding:16px;border:1px dashed var(--color-border-strong);border-radius:var(--radius-control);background:var(--color-surface-sunken);cursor:pointer}.dropzone:hover{border-color:var(--color-primary-default)}.dropzone input{display:none}.steps{display:flex;flex-direction:column;padding:6px 0}.step{display:flex;align-items:center;gap:12px;padding:10px 20px}.step.error{background:var(--color-feedback-danger-bg)}.step .done{color:var(--color-feedback-success)}.step .bad{color:var(--color-feedback-danger)}.step .todo{color:var(--color-text-placeholder)}.check-list{display:flex;flex-direction:column;gap:10px;padding:14px 20px 16px;margin:0;list-style:none;font-size:13px;line-height:20px;color:var(--color-text-secondary)}.check-list li{display:flex;gap:8px;align-items:flex-start}.check-list svg{color:var(--color-feedback-success);margin-top:3px}.kv-row{display:flex;gap:10px;align-items:flex-start;padding:10px 20px;border-top:1px solid var(--color-border-default)}.kv-row b{font-weight:500}.kv-row .ok{color:var(--color-feedback-success)}.periods{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}.period-cell{display:flex;align-items:center;gap:8px;padding:6px 10px;border:1px solid var(--color-border-default);border-radius:var(--radius-control)}.period-cell b{font-size:13px;font-weight:500;color:var(--color-text-secondary);white-space:nowrap}.period-cell input{height:30px!important;padding:0 6px!important;font-size:13px;width:112px;flex:none}.radio-group{display:flex;flex-wrap:wrap;gap:8px 24px}.radio-group label{display:flex;align-items:center;gap:8px;cursor:pointer}.note-icon{width:32px;height:32px;border-radius:50%;background:var(--color-primary-subtle);color:var(--color-primary-default);display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.unread-dot{width:6px;height:6px;border-radius:50%;background:var(--color-feedback-danger);display:inline-block}.list-row.unread{background:#f7f9fc}@media (max-width:1180px){.cols,.cols.narrow-aside,.cols.report-cols,.cols.three,.cols.wide-aside{grid-template-columns:minmax(0,1fr)}.template-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:900px){.app{background:var(--color-surface-page)}.sidebar{position:fixed;left:0;top:0;transform:translateX(-100%);transition:transform .2s;box-shadow:8px 0 24px rgba(26,34,48,.12)}.sidebar.open{transform:none}.shade{display:block;position:fixed;inset:0;z-index:35;background:rgba(26,34,48,.32)}.topbar{padding:0 8px;gap:4px}.topbar .menu-btn{display:inline-flex}.topbar .lang-select,.topbar-date,.topbar-term{display:none}.topbar-title{display:block;flex:1;min-width:0;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar-spacer{display:none}.content{padding:16px 16px 32px;gap:12px}.page-header h1{font-size:20px;line-height:28px}.form-grid,.template-grid{grid-template-columns:minmax(0,1fr)}.stats{grid-template-columns:repeat(2,minmax(0,1fr))}.card-foot,.card-head,.card-note,.list-row{padding-left:14px;padding-right:14px}.table td:first-child,.table th:first-child{padding-left:14px}.roster-row{grid-template-columns:minmax(0,1fr);padding:12px 14px}.picker{display:grid;width:100%;grid-template-columns:repeat(5,minmax(0,1fr))}.picker button{min-height:44px;padding:4px 2px}.lesson-cards{grid-template-columns:minmax(0,1fr)}.submit-bar{padding:12px 14px calc(12px + env(safe-area-inset-bottom))}.submit-bar .btn{height:44px}.dialog{max-height:calc(100vh - 32px)}.overlay{padding:16px}.drawer{width:100%}.paper{padding:20px 16px}.paper-att{grid-template-columns:repeat(3,minmax(0,1fr))}.toast{left:16px;right:16px;bottom:76px}.app.parent .tabbar{display:flex;position:fixed;left:0;right:0;bottom:0;z-index:30;background:var(--color-surface-card);border-top:1px solid var(--color-border-default);padding-bottom:env(safe-area-inset-bottom)}.tabbar button{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:8px 0 6px;font-size:12px;line-height:16px;color:var(--color-text-muted);position:relative}.tabbar button.active{color:var(--color-primary-default);font-weight:600}.tabbar .dot{top:4px;right:calc(50% - 16px)}.tabbar .tab-label{display:flex;flex-direction:column;align-items:center;line-height:14px}.tabbar .tab-label small{font-size:10px;line-height:12px;font-weight:400}.tabbar.bilingual button{padding-top:6px}.app.parent .content{padding-bottom:88px}.app.parent .topbar .menu-btn{display:none}.hide-mobile{display:none!important}}@media (min-width:901px){.show-mobile{display:none!important}}@media print{.sidebar,.tabbar,.topbar{display:none}}