:root{--bg: #f5f4ef;--card: #fffefa;--surface-soft: #f0eee6;--line: #e3e0d5;--line-soft: #edeade;--txt: #22211c;--sub: #6f6c60;--radius: 16px;--radius-sm: 12px;--radius-xs: 8px;--shadow: 0 1px 2px rgba(34, 33, 28, .05), 0 8px 24px rgba(34, 33, 28, .05);--font-ui: "Segoe UI", "Segoe UI Variable Text", "Microsoft YaHei UI", "Microsoft YaHei", "微软雅黑", system-ui, sans-serif;--font-display: var(--font-ui);--font-mono: Consolas, "Cascadia Mono", "Courier New", monospace;--font-num: "Times New Roman", "Liberation Serif", Georgia, serif;--peach-weak: #f6e7dc;--peach: #c15f3c;--peach-strong: #a94f30;--sage-weak: #e9f2eb;--sage: #3f6f51;--sage-strong: #2f543d;--sky-weak: #e9f1f5;--sky: #35657a;--sky-strong: #2a5164;--honey-weak: #f6f0de;--honey: #8a6a2f;--honey-strong: #6e5424;--rose-weak: #f8ecec;--rose: #a63a3a;--rose-strong: #8a2e2e;--acc: var(--peach);--acc-strong: var(--peach-strong);--acc-weak: var(--peach-weak);--accent-warm: var(--peach);--ok: var(--sage);--ok-weak: var(--sage-weak);--sky-info: var(--sky);--warn: var(--honey);--warn-weak: var(--honey-weak);--danger: var(--rose);--danger-weak: var(--rose-weak);--att-ok: var(--sage);--att-ok-weak: #eef4ef;--att-late: #b07324;--att-late-weak: #f7efe0;--att-leave: var(--sky);--att-leave-weak: var(--sky-weak);--sp-1: 4px;--sp-2: 8px;--sp-3: 12px;--sp-4: 16px;--sp-5: 24px;--sp-6: 32px;--fs-title: 20px;--fs-stat-md: 18px;--fs-card: 15px;--fs-body: 13px;--fs-th: 12.5px;--fs-hint: 12px;--fs-badge: 11.5px;--fs-stat-lg: 22px;--fw-regular: 400;--fw-medium: 500;--fw-semi: 600;--fw-card: 650;--fw-bold: 700;--z-content: 0;--z-handle: 10;--z-float: 20;--z-menu: 40;--z-modal: 100;--z-toast: 200;--ease-out: cubic-bezier(.2,.8,.2,1);--t-fast: .14s;--t: .18s;--t-slow: .2s}.error-strip{display:flex;align-items:center;gap:8px;padding:8px 16px;background:var(--danger-weak);border-bottom:1px solid var(--danger);color:var(--danger);font-size:var(--fs-body)}.error-dismiss{margin-left:auto;border:0;background:transparent;color:inherit;font-size:var(--fs-title);line-height:1;cursor:pointer}*{box-sizing:border-box}html,body,#app{height:100%;margin:0}body{font-family:var(--font-ui);background:var(--bg);color:var(--txt);font-size:var(--fs-body);font-weight:var(--fw-regular);line-height:1.55;letter-spacing:0}.app-shell{display:grid;grid-template-rows:auto minmax(0,1fr);grid-template-columns:minmax(148px,11.5rem) minmax(0,1fr);height:100dvh;min-width:0;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px);padding-left:env(safe-area-inset-left,0px);padding-right:env(safe-area-inset-right,0px);position:relative;overflow:hidden;background-color:var(--bg);background-image:radial-gradient(ellipse 78% 58% at 12% 18%,rgba(193,95,60,.2),transparent 56%),radial-gradient(ellipse 70% 52% at 88% 12%,rgba(53,101,122,.18),transparent 52%),radial-gradient(ellipse 86% 64% at 72% 88%,rgba(63,111,81,.15),transparent 55%),radial-gradient(ellipse 64% 46% at 18% 82%,rgba(138,106,47,.12),transparent 50%),radial-gradient(ellipse 50% 40% at 50% 50%,rgba(246,231,220,.55),transparent 70%);background-size:210% 210%,230% 220%,200% 240%,250% 200%,180% 180%;background-position:0% 20%,100% 0%,50% 100%,0% 80%,50% 50%;background-repeat:no-repeat;animation:bg-drift 18s ease-in-out infinite alternate}.app-shell:before,.app-shell:after{content:"";position:absolute;border-radius:50%;pointer-events:none;z-index:var(--z-content);filter:blur(42px)}.app-shell:before{width:min(58vw,560px);height:min(58vw,560px);top:-10%;left:-8%;background:radial-gradient(circle,var(--peach) 0%,transparent 68%);opacity:.18;animation:blob-a 20s ease-in-out infinite alternate}.app-shell:after{width:min(52vw,500px);height:min(52vw,500px);right:-10%;bottom:-12%;background:radial-gradient(circle,var(--sky) 0%,transparent 68%);opacity:.16;animation:blob-b 22s ease-in-out infinite alternate}.app-shell>*{position:relative;z-index:1}@keyframes bg-drift{0%{background-position:0% 20%,100% 0%,50% 100%,0% 80%,50% 50%}50%{background-position:35% 55%,65% 40%,25% 45%,70% 25%,50% 50%}to{background-position:55% 35%,25% 65%,80% 25%,40% 70%,50% 50%}}@keyframes blob-a{0%{transform:translate(0) scale(1)}to{transform:translate(12vw,10vh) scale(1.18)}}@keyframes blob-b{0%{transform:translate(0) scale(1.1)}to{transform:translate(-14vw,-8vh) scale(.92)}}@supports (padding: var(--sa-top, 0px)){.app-shell{padding-top:var(--sa-top, env(safe-area-inset-top, 0px));padding-bottom:var(--sa-bottom, env(safe-area-inset-bottom, 0px));padding-left:var(--sa-left, env(safe-area-inset-left, 0px));padding-right:var(--sa-right, env(safe-area-inset-right, 0px))}}.topbar{grid-column:1 / 3;display:flex;align-items:center;gap:var(--sp-3);padding:0 clamp(12px,2vw,20px);background:var(--card);border-bottom:1px solid var(--line);min-height:52px;flex-wrap:wrap;position:relative}.topbar-strip{position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(90deg,#c15f3c,#e08a6a,#3f6f51,#7dba92,#35657a);pointer-events:none}.topbar .brand{font-family:var(--font-display);font-weight:var(--fw-card);font-size:var(--fs-card);letter-spacing:.01em;color:var(--txt);display:inline-flex;align-items:center;gap:var(--sp-2)}.brand-mark{width:28px;height:28px;border-radius:9px;background:linear-gradient(145deg,#d47452,var(--acc-strong));color:#fff;display:inline-flex;align-items:center;justify-content:center;font-size:var(--fs-body);font-weight:var(--fw-bold);flex-shrink:0}.brand-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}h1,h2,h3,.card h3,.panel-head h2{font-family:var(--font-display)}.topbar .ctx{display:flex;align-items:center;gap:var(--sp-2);margin-left:auto;flex-wrap:wrap}.topbar .ctx .lbl{color:var(--sub);font-size:var(--fs-body)}.topbar .ctx .wb-select{width:auto}.ctx-field{display:flex;align-items:center;gap:var(--sp-1);min-width:0}.btn.nav-toggle{display:none}.nav{background:var(--card);border-right:1px solid var(--line);padding:var(--sp-3) var(--sp-2);overflow-y:auto;min-width:0}.nav a{display:flex;align-items:center;gap:var(--sp-2);padding:9px 12px;margin:2px 0;border-radius:999px;color:var(--txt);text-decoration:none;font-size:13.5px;transition:background-color var(--t-fast) ease,color var(--t-fast) ease,transform var(--t-fast) ease}.nav a:hover{background:var(--acc-weak);color:var(--acc-strong);transform:translateY(-1px)}.nav a.router-link-active{background:var(--acc);color:#fff;font-weight:var(--fw-semi)}.nav-icon{width:18px;height:18px;display:inline-flex;flex-shrink:0}.nav-icon svg{width:18px;height:18px;display:block}.main{overflow:auto;min-height:0;padding:clamp(14px,2vw,24px) clamp(14px,2.5vw,28px) 40px;min-width:0}.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:16px;margin-bottom:16px}.card h3{margin:0 0 var(--sp-3);font-size:var(--fs-card);font-weight:var(--fw-card)}.card .hint{color:var(--sub);font-size:var(--fs-hint);font-weight:var(--fw-regular);margin-left:var(--sp-2)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:1px solid var(--line);background:var(--card);color:var(--txt);border-radius:var(--radius-sm);padding:6px 14px;font-size:var(--fs-body);cursor:pointer;font-family:inherit;font-weight:var(--fw-medium);line-height:1.3;white-space:nowrap;min-height:32px;box-sizing:border-box;transition:border-color .14s ease,color .14s ease,background-color .14s ease,opacity .14s ease}.btn:hover{border-color:var(--acc);color:var(--acc-strong);background:var(--surface-soft)}.btn:disabled{opacity:.45;cursor:not-allowed}.btn-primary{background:var(--acc);border-color:var(--acc);color:#fff}.btn-primary:hover{background:var(--acc-strong);border-color:var(--acc-strong);color:#fff}.btn-danger{background:var(--danger);border-color:var(--danger);color:#fff}.btn-danger:hover{background:var(--danger);border-color:var(--danger);color:#fff;opacity:.9}.btn-ghost{border-color:transparent;background:transparent}.btn-ghost:hover{background:var(--surface-soft)}.btn-sm{padding:3px 10px;font-size:var(--fs-hint);min-height:0;border-radius:7px}.overflow-menu{position:relative;display:inline-flex}.overflow-trigger{min-width:32px;padding-left:8px;padding-right:8px}.overflow-panel{position:absolute;top:calc(100% + 6px);right:0;min-width:168px;z-index:var(--z-menu);padding:6px;background:var(--card);border:1px solid var(--line);border-radius:var(--radius-sm);box-shadow:var(--shadow);display:flex;flex-direction:column;gap:2px}.overflow-item{display:flex;align-items:center;gap:8px;width:100%;border:0;background:transparent;color:var(--txt);font:inherit;font-size:var(--fs-body);text-align:left;text-decoration:none;padding:8px 10px;border-radius:8px;cursor:pointer;min-height:32px}.overflow-item:hover{background:var(--acc-weak);color:var(--acc-strong)}.overflow-item.danger{color:var(--danger)}.overflow-item.danger:hover{background:var(--danger-weak);color:var(--danger)}.overflow-item:disabled{opacity:.45;cursor:not-allowed}.overflow-divider{height:1px;background:var(--line-soft);margin:4px 2px}.wb-input,.wb-select,.wb-textarea{width:100%;border:1px solid var(--line);border-radius:10px;padding:7px 12px;font-size:var(--fs-body);font-family:inherit;background:#fff;color:var(--txt);box-shadow:inset 0 1px #22211c05}input[type=number],input[type=tel],input[inputmode=numeric],input[inputmode=decimal],.wb-input[type=number],.fr input[type=number],.fr input[inputmode=numeric],.fr input[inputmode=decimal],.wb-input.num,.fr input.num,.wb-input.tabular-number,.fr input.tabular-number,.wb-input.score-num-input,.fr .score-num-input{font-family:var(--font-num);font-variant-numeric:tabular-nums}.wb-input,.wb-select{min-height:36px;line-height:1.35;box-sizing:border-box}.wb-input,.wb-select,.wb-textarea{transition:border-color .14s ease,box-shadow .14s ease,background .14s ease}.wb-input:hover,.wb-select:hover,.wb-textarea:hover{border-color:#d0ccbf}.wb-input:focus,.wb-select:focus,.wb-textarea:focus{outline:none;border-color:var(--acc);box-shadow:0 0 0 3px var(--acc-weak)}.wb-textarea{min-height:72px;resize:vertical;border-radius:10px}.wb-input.is-err{border-color:var(--danger);box-shadow:0 0 0 3px var(--danger-weak)}.wb-input::placeholder,.wb-textarea::placeholder{color:#a8a494}.wb-table{width:100%;border-collapse:separate;border-spacing:0;background:var(--card)}.wb-table thead{background:var(--surface-soft)}.wb-table th,.wb-table td{border-bottom:1px solid var(--line);padding:8px 10px;text-align:left;font-size:var(--fs-body)}.wb-table th{background:var(--surface-soft);background-clip:padding-box;position:static;top:auto;z-index:var(--z-content);cursor:pointer;user-select:none;white-space:nowrap;font-weight:var(--fw-semi);font-size:var(--fs-th);color:var(--sub);box-shadow:0 1px 0 var(--line)}.wb-table th.plain{cursor:default}.wb-table tbody{z-index:var(--z-content)}.wb-table tbody td{background:var(--card)}.wb-table tbody tr:hover td{background:var(--surface-soft)}.wb-table td.clip{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:0}.table-freeze-card{padding:0;overflow:hidden}.table-freeze{display:flex;flex-direction:column;max-height:calc(100dvh - 170px - var(--sa-top, 0px) - var(--sa-bottom, 0px));min-height:0}.table-freeze-head-wrap{flex:0 0 auto;overflow:hidden;scrollbar-gutter:stable;background:var(--surface-soft)}.table-freeze-body{flex:1 1 auto;min-height:0;overflow:auto;overflow-anchor:none;scrollbar-gutter:stable}.table-freeze-head,.table-freeze-body-table{table-layout:fixed;width:100%}.table-freeze-head,.table-freeze-head thead,.table-freeze-head th{position:static;top:auto;z-index:var(--z-content);isolation:auto}.table-freeze-head,.table-freeze-head thead{background:var(--surface-soft)}.table-freeze-head th{position:static;background:var(--surface-soft);box-shadow:0 1px 0 var(--line)}.field-col-sort{width:56px}.field-col-name{width:16%}.field-col-control{width:96px}.field-col-opts{width:18%}.field-col-req{width:52px}.field-col-group{width:88px}.field-col-status{width:72px}.field-col-ops{width:320px}.field-ops{white-space:nowrap}.field-admin-mobile{display:none}.roster-col-check{width:36px}.roster-sep{border-right:1px solid var(--line)}.wb-table .roster-th,.wb-table th.col-resizable{position:relative}.roster-th-txt,.col-head-txt{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:4px}.roster-resizer,.col-resizer{position:absolute;top:0;bottom:0;right:-6px;width:12px;cursor:col-resize;z-index:var(--z-handle);touch-action:none;user-select:none}.roster-resizer:after,.col-resizer:after{content:"";position:absolute;top:0;bottom:0;left:5px;width:2px;background:transparent;transition:background-color .1s ease}.roster-resizer:hover:after,.roster-resizer.dragging:after,.col-resizer:hover:after,.col-resizer.dragging:after{background:var(--acc)}.wb-table th.col-sortable{cursor:pointer;user-select:none}.wb-table th.col-sortable:hover{background:var(--surface-soft)}.wb-table th.is-sorted .col-head-txt{color:var(--acc-strong)}.sort-mark{color:var(--acc);font-weight:var(--fw-semi);font-size:var(--fs-badge);font-family:var(--font-ui)}.table-freeze .wb-table .exam-col-seq,.table-freeze .wb-table .exam-col-name,.table-freeze .wb-table .exam-col-subject-rank,.table-freeze .wb-table .exam-col-total,.table-freeze .wb-table .exam-col-rank{width:auto}.exam-col-seq{width:56px}.exam-col-name{width:88px}.exam-col-subject-rank{width:76px}.exam-col-total{width:64px}.exam-col-rank{width:56px}.import-col-file{width:28%}.import-col-field{width:36%}.term-col-ops{width:120px}.photo-col-ops{width:220px}.leave-col-ops{width:140px}.wb-table .num{font-family:var(--font-num);font-variant-numeric:tabular-nums}.identifier-text{font-family:var(--font-num)!important;font-variant-numeric:tabular-nums;letter-spacing:.02em}.tabular-number{font-family:var(--font-num);font-variant-numeric:tabular-nums}.badge{display:inline-block;border-radius:6px;padding:1px 8px;font-size:var(--fs-badge);font-weight:var(--fw-medium);line-height:1.2}.toolbar-tag{display:inline-flex;align-items:center;justify-content:center;min-height:32px;padding:6px 14px;font-size:var(--fs-badge);font-weight:var(--fw-medium);line-height:1.3;border-radius:var(--radius-sm);box-sizing:border-box}.badge.red{background:var(--rose-weak);color:var(--rose)}.badge.blue{background:var(--sky-weak);color:var(--sky)}.badge.green{background:var(--sage-weak);color:var(--sage)}.badge.orange{background:var(--honey-weak);color:var(--honey)}.badge.gray{background:var(--bg);color:var(--sub)}.badge.late{background:var(--att-late-weak);color:var(--att-late)}.badge.leave{background:var(--att-leave-weak);color:var(--att-leave)}.badge.leave-soft{background:var(--surface-soft);color:var(--sub);font-weight:var(--fw-regular)}.badge.ok{background:var(--att-ok-weak);color:var(--att-ok)}.modal-mask{position:fixed;inset:0;background:#22211c6b;backdrop-filter:blur(2px);display:flex;z-index:var(--z-modal);padding:var(--sa-top, env(safe-area-inset-top, 0px)) var(--sa-right, env(safe-area-inset-right, 0px)) var(--sa-bottom, env(safe-area-inset-bottom, 0px)) var(--sa-left, env(safe-area-inset-left, 0px))}.modal-mask{align-items:center;justify-content:center}.modal-box{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);max-height:100%;display:flex;flex-direction:column;box-shadow:0 2px 6px #22211c0f,0 18px 48px #22211c24;overflow:hidden}.modal-box-sm{width:min(420px,94vw);min-width:min(320px,94vw);max-width:min(420px,94vw)}.modal-box-md{width:min(520px,94vw);min-width:min(360px,94vw);max-width:min(520px,94vw)}.modal-box-lg{width:min(720px,94vw);min-width:min(360px,94vw);max-width:min(760px,94vw)}.modal-mask-no-close{cursor:default}.modal-x{margin-left:auto;flex:0 0 auto}.modal-head{padding:16px 18px 14px;border-bottom:1px solid var(--line-soft);font-weight:var(--fw-card);font-family:var(--font-display);font-size:var(--fs-card);display:flex;align-items:center;gap:10px;background:linear-gradient(180deg,#faf8f2,var(--card))}.modal-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal-body{padding:16px 18px;overflow:auto;flex:1 1 auto;min-height:0}.modal-foot{padding:12px 18px;border-top:1px solid var(--line-soft);display:flex;gap:8px;justify-content:flex-end;align-items:center;background:#faf8f2}.modal-body .fr-label{font-size:var(--fs-body);font-weight:var(--fw-semi);color:var(--sub);letter-spacing:.01em}.modal-body .fr{gap:6px}.modal-body .statusbar{line-height:1.55}.modal-mask-page{background:var(--bg);align-items:stretch;justify-content:stretch;backdrop-filter:none}.modal-box-page{width:100%;min-width:0;max-width:none;height:100%;max-height:none;border-radius:0;border:0;box-shadow:none}.modal-box-page .modal-head{display:flex;align-items:center;gap:10px;padding:10px 12px}.modal-box-page .modal-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal-box-page .modal-back{flex:0 0 auto}.modal-box-page .modal-body{flex:1 1 auto;min-height:0;padding:12px}.modal-box-page .modal-foot{flex:0 0 auto}.form-help{border:1px solid var(--line-soft);border-radius:var(--radius-sm);background:var(--surface-soft);padding:0;margin-top:4px}.form-help>summary{cursor:pointer;list-style:none;padding:10px 12px;font-size:var(--fs-body);font-weight:var(--fw-semi);color:var(--sub);display:flex;align-items:center;gap:6px}.form-help>summary::-webkit-details-marker{display:none}.form-help>summary:before{content:"▸";color:var(--acc);transition:transform .14s ease}.form-help[open]>summary:before{transform:rotate(90deg)}.form-help>.form-help-body{padding:0 12px 12px;font-size:var(--fs-th);line-height:1.65;color:var(--sub)}.form-help>.form-help-body b{color:var(--txt)}.dyn-group{margin-bottom:18px}.dyn-group-title{margin:0 0 8px;font-size:var(--fs-body);color:var(--sub);border-bottom:1px dashed var(--line);padding-bottom:4px}.dyn-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:10px 14px}.fr{display:flex;flex-direction:column;gap:4px}.fr.wide{grid-column:1 / -1}.fr-label{font-size:var(--fs-body);font-weight:var(--fw-semi);color:var(--sub)}.fr-label .req{color:var(--danger);margin-left:2px}.fr-err{color:var(--danger);font-size:var(--fs-hint)}.fr-addr{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,140px),1fr));gap:6px}.fr-addr .addr-detail{grid-column:1 / -1}.stepper{display:flex;gap:6px;margin-bottom:16px}.step{display:flex;align-items:center;gap:6px;padding:6px 12px;border-radius:20px;background:var(--bg);color:var(--sub);font-size:var(--fs-body)}.step .step-no{width:20px;height:20px;border-radius:50%;background:var(--line);color:#fff;display:inline-flex;align-items:center;justify-content:center;font-size:var(--fs-hint);font-family:var(--font-num)}.step.active{background:var(--acc-weak);color:var(--acc-strong);font-weight:var(--fw-semi)}.step.active .step-no{background:var(--acc)}.step.done .step-no{background:var(--ok)}.filter-bar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:12px}.filter-row{display:flex;gap:6px;align-items:center}.filter-row .wb-select,.filter-row .wb-input{width:auto;min-width:120px}.toast-wrap{position:fixed;top:calc(14px + var(--sa-top, 0px));left:50%;transform:translate(-50%);z-index:var(--z-toast);display:flex;flex-direction:column;gap:8px}.toast-item{background:var(--card);border:1px solid var(--line);border-left:4px solid var(--acc);border-radius:var(--radius-sm);padding:8px 14px;box-shadow:var(--shadow);max-width:520px}.toast-item.error{border-left-color:var(--danger);color:var(--danger)}.toast-item.ok{border-left-color:var(--ok)}.stat-cards{display:flex;flex-wrap:wrap;gap:12px;margin-bottom:16px;align-items:stretch}.stat-card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:12px 18px;flex:0 1 auto;width:max-content;min-width:150px;max-width:100%;display:flex;flex-direction:column;gap:4px;overflow:hidden}.fluid-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:16px;margin-bottom:16px}.stat-card .v{font-size:var(--fs-stat-lg);font-weight:var(--fw-bold);font-family:var(--font-num);line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.stat-card .l{color:var(--sub);font-size:var(--fs-hint)}.icon-badge{width:36px;height:36px;border-radius:12px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--txt)}.icon-badge svg{width:20px;height:20px;display:block}.icon-badge.peach{background:var(--peach-weak);color:var(--peach)}.icon-badge.sage{background:var(--sage-weak);color:var(--sage)}.icon-badge.sky{background:var(--sky-weak);color:var(--sky)}.icon-badge.honey{background:var(--honey-weak);color:var(--honey)}.icon-badge.rose{background:var(--rose-weak);color:var(--rose)}.dashboard-panel{position:relative;background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px 14px;overflow:hidden}.dashboard-panel:before{content:"";position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(90deg,#c15f3c,#e08a6a,#3f6f51,#7dba92,#35657a)}.panel-head{display:flex;align-items:center;gap:10px;margin-bottom:10px}.panel-head h2{margin:0;font-size:var(--fs-card);font-weight:var(--fw-card)}.empty{text-align:center;color:var(--sub);padding:48px 0}.page-title{margin:0 0 var(--sp-2);font-size:var(--fs-title);font-weight:var(--fw-card);line-height:1.3}.toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:12px}.statusbar{color:var(--sub);font-size:var(--fs-hint);margin-top:8px}.warn-strip{background:var(--warn-weak);color:var(--warn);border:1px solid #e6d7b3;border-radius:var(--radius-sm);padding:8px 12px;margin-bottom:12px;font-size:var(--fs-body)}.mono{font-family:var(--font-mono);font-size:var(--fs-hint)}a{color:var(--acc)}@keyframes page-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes modal-in{0%{opacity:0;transform:translateY(6px) scale(.96)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes overlay-in{0%{opacity:0}to{opacity:1}}@keyframes menu-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes toast-in{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.btn{transition:background-color var(--t-fast) ease,border-color var(--t-fast) ease,color var(--t-fast) ease,transform var(--t-fast) ease,box-shadow var(--t-fast) ease}.btn:hover:not(:disabled){transform:translateY(-1px)}.btn:active:not(:disabled){transform:scale(.98);transition-duration:80ms}.btn-primary:hover:not(:disabled){background:var(--acc-strong);border-color:var(--acc-strong)}.card{transition:box-shadow .16s ease,border-color .16s ease}.card:hover{box-shadow:0 2px 4px #22211c0f,0 12px 32px #22211c14;border-color:#d0ccbf}.modal-mask{animation:overlay-in var(--t) ease}.modal-box{animation:modal-in var(--t-slow) var(--ease-out)}.overflow-panel{animation:menu-in var(--t-fast) var(--ease-out)}.toast-item{animation:toast-in var(--t) var(--ease-out)}.main>*,.matrix-page,.board-shell,.admin-list-card,.login-wrap{animation:page-in var(--t) var(--ease-out)}.sort-mark{animation:overlay-in .12s ease}.badge.orange{animation:overlay-in var(--t-fast) ease}.chip{transition:background-color var(--t-fast) ease,color var(--t-fast) ease,transform var(--t-fast) ease}.chip:hover,.chip.chipActive{transform:translateY(-1px)}.roster-card{transition:transform var(--t-fast) ease,box-shadow var(--t-fast) ease,border-color var(--t-fast) ease}.roster-card:hover{transform:translateY(-1px);box-shadow:var(--shadow)}.roster-index-bubble{animation:modal-in .12s var(--ease-out)}@media(prefers-reduced-motion:reduce){*,*:before,*:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}.app-shell{animation:none!important;background-image:radial-gradient(ellipse 78% 58% at 12% 18%,rgba(193,95,60,.16),transparent 56%),radial-gradient(ellipse 70% 52% at 88% 12%,rgba(53,101,122,.14),transparent 52%),radial-gradient(ellipse 86% 64% at 72% 88%,rgba(63,111,81,.12),transparent 55%),radial-gradient(ellipse 64% 46% at 18% 82%,rgba(138,106,47,.1),transparent 50%),radial-gradient(ellipse 50% 40% at 50% 50%,rgba(246,231,220,.45),transparent 70%);background-position:30% 30%,70% 20%,60% 80%,25% 70%,50% 50%}.app-shell:before,.app-shell:after{animation:none!important;transform:none!important;opacity:.12}}@media(max-width:900px){.field-admin-desktop{display:none}.field-admin-mobile{display:block}}@media(max-width:48rem){.app-shell{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto minmax(0,1fr)}.topbar{grid-column:1;gap:.5rem;padding:.5rem 3vw}.btn.nav-toggle{display:inline-flex}.topbar .brand{flex:1;min-width:0;font-size:var(--fs-card)}.topbar .ctx{flex-basis:100%;display:grid;grid-template-columns:minmax(0,3fr) minmax(0,2fr);gap:.5rem;margin:0}.ctx-field{gap:.25rem}.ctx-field .lbl{flex-shrink:0}.topbar .ctx .wb-select{width:100%;min-width:0}.nav{display:none;grid-column:1;grid-row:2;max-height:35dvh;border-right:0;border-bottom:1px solid var(--line);padding:.5rem 3vw}.nav.nav-open{display:grid;grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));gap:.25rem}.nav a{margin:0}.main{grid-column:1;grid-row:3;padding:3vw}}@media(pointer:coarse){.btn,.btn-sm,.wb-input,.wb-select,.wb-textarea,.nav a,.overflow-trigger,.overflow-item,.toolbar-tag,.chip,.chipEdit,.att-slot,.att-state-btn,.att-period-chip,.att-name,.roster-index-key,.roster-card,.step,.field-fold-head,.fold-card-head,.period-slot{min-height:2.75rem}.roster-index{min-width:28px;padding-right:4px;padding-left:4px}.roster-index-key{min-width:24px;min-height:2.75rem}.btn-sm{padding-top:8px;padding-bottom:8px}.overflow-trigger{min-width:2.75rem}.toolbar-tag{padding-top:8px;padding-bottom:8px}}.app-shell.standalone-shell{display:flex;flex-direction:column}.standalone-shell>.main{flex:1;display:flex;flex-direction:column;padding:0;overflow:hidden}.detail-page{flex:1;min-height:0;display:grid;grid-template-rows:auto minmax(0,1fr) auto}.detail-head,.detail-foot{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-3);padding:var(--sp-3) clamp(12px,3vw,48px);background:var(--card)}.detail-head{border-bottom:1px solid var(--line)}.detail-head h1{margin:0;font-size:var(--fs-title);font-weight:var(--fw-card);line-height:1.3}.detail-body{overflow:auto;min-height:0;padding:clamp(12px,2.5vmin,32px) clamp(12px,3vw,48px)}.detail-body .dyn-group{border:1px solid var(--line);border-radius:var(--radius);background:var(--card);padding:clamp(12px,2vmin,24px)}.detail-body .dyn-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-4) var(--sp-5)}.detail-body .dyn-group-title{margin-bottom:var(--sp-3);font-weight:var(--fw-semi);color:var(--txt);font-size:var(--fs-card)}.detail-foot{border-top:1px solid var(--line)}@media(max-width:64rem){.detail-body .dyn-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:40rem){.detail-body .dyn-grid{grid-template-columns:minmax(0,1fr)}.detail-foot{gap:var(--sp-2)}.detail-foot>span:empty{display:none}.detail-foot .btn{flex:1 1 40%}}.column-options{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));gap:.75rem}.column-option{display:flex;align-items:center;gap:.75rem;margin:0}.avatar-circle{position:relative;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;overflow:hidden;background:var(--acc-weak, #e8e4dc);color:var(--sub);font-weight:var(--fw-semi, 600);flex-shrink:0;vertical-align:middle;line-height:1;user-select:none}.avatar-circle img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}.avatar-ph{pointer-events:none}.avatar-28{width:28px;height:28px;font-size:12px}.avatar-30{width:30px;height:30px;font-size:13px}.avatar-32{width:32px;height:32px;font-size:13px}.avatar-96{width:96px;height:96px;font-size:2rem}.name-with-avatar{display:inline-flex;align-items:center;gap:8px;min-width:0;max-width:100%}.name-with-avatar .name-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.roster-card-name-row{display:inline-flex;align-items:center;gap:8px;min-width:0}.student-edit-layout{display:grid;grid-template-columns:140px minmax(0,1fr);gap:var(--sp-5);align-items:start}.student-edit-side{display:flex;flex-direction:column;align-items:center;gap:var(--sp-3);padding:var(--sp-4) var(--sp-2);border:1px solid var(--line);border-radius:var(--radius);background:var(--card)}.student-edit-name{font-weight:var(--fw-semi, 600);text-align:center;word-break:break-all}.student-edit-main{display:flex;flex-direction:column;gap:var(--sp-4);min-width:0}.student-edit-main .dyn-group{border:1px solid var(--line);border-radius:var(--radius);background:var(--card);padding:clamp(12px,2vmin,24px)}.student-edit-main .dyn-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-4) var(--sp-5)}.student-edit-main .dyn-group-title{margin-bottom:var(--sp-3);font-weight:var(--fw-semi, 600);color:var(--txt);font-size:var(--fs-card)}@media(max-width:64rem){.student-edit-main .dyn-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:48rem){.student-edit-layout{grid-template-columns:minmax(0,1fr)}.student-edit-side{flex-direction:row;justify-content:flex-start}}@media(max-width:40rem){.student-edit-main .dyn-grid{grid-template-columns:minmax(0,1fr)}}.pairing-orphan-row{display:grid;grid-template-columns:56px minmax(0,1fr) auto;gap:10px;align-items:center;padding:8px 0;border-bottom:1px solid var(--line-soft)}.pairing-orphan-row:last-child{border-bottom:0}.pairing-orphan-thumb{width:56px;height:56px;border-radius:var(--radius-sm, 6px);object-fit:cover;background:var(--bg);border:1px solid var(--line);display:block}.pairing-orphan-meta{min-width:0;font-size:var(--fs-sm, 12px);color:var(--sub)}.pairing-orphan-meta .mono{overflow-wrap:anywhere}.pairing-orphan-ops{display:inline-flex;gap:6px;flex-wrap:wrap;justify-content:flex-end}.pairing-missing-cat{margin-bottom:var(--sp-3)}.pairing-missing-cat .fr-label{margin-bottom:4px}.photo-detail-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,24rem),1fr));gap:1rem}.photo-preview{display:flex;align-items:center;justify-content:center}.photo-preview img{max-width:100%;max-height:65dvh;object-fit:contain}.photo-detail-grid .mono{overflow-wrap:anywhere}.photo-tags{margin:1rem 0;border:1px solid var(--line);border-radius:var(--radius-sm);display:flex;flex-wrap:wrap;gap:.75rem}.photo-tags label{display:inline-flex;align-items:center;gap:.5rem}.detail-body>.stat-cards .stat-card{flex:1 1 8rem;min-width:0}.backup-list{display:flex;flex-direction:column;border:1px solid var(--line);border-radius:var(--radius-sm);overflow:hidden}.backup-row{display:grid;grid-template-columns:minmax(0,1fr) 5.5rem 11rem auto;gap:10px;align-items:center;padding:7px 10px;border-bottom:1px solid var(--line-soft);font-size:var(--fs-body)}.backup-row:last-child{border-bottom:0}.backup-ops{display:inline-flex;gap:6px;justify-content:flex-end}.backup-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.backup-size,.backup-time{color:var(--sub)}@media(max-width:40rem){.backup-row{grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"name ops" "size ops" "time ops";row-gap:1px;align-items:start}.backup-name{grid-area:name;white-space:normal;overflow-wrap:anywhere}.backup-size{grid-area:size}.backup-time{grid-area:time}.backup-row>.backup-ops{grid-area:ops;align-self:center}}.kv-list{margin:0 0 8px}.kv-list>div{display:grid;grid-template-columns:minmax(7rem,9rem) minmax(0,1fr);gap:4px 12px;padding:7px 0;border-bottom:1px solid var(--line-soft);align-items:baseline}.kv-list>div:last-child{border-bottom:0}.kv-list dt{color:var(--sub);font-size:var(--fs-body)}.kv-list dd{margin:0;min-width:0;overflow-wrap:anywhere;font-size:var(--fs-body)}.kv-list dd .wb-input,.kv-list dd input{max-width:420px}.wrap-anywhere{overflow-wrap:anywhere;word-break:break-word}.sync-ok{color:var(--ok)}.sync-bad{color:var(--danger)}.field-inline{margin-left:8px;width:min(220px,60vw)}.confirm-word{display:flex;flex-direction:column;gap:5px;margin-top:12px}.confirm-word .field-inline{margin-left:0;width:100%}@media(max-width:40rem){.kv-list>div{grid-template-columns:minmax(0,1fr);gap:2px}.kv-list dd .wb-input,.kv-list dd input{max-width:100%}.field-inline{margin-left:0;display:block;margin-top:4px;width:100%}}.roster-mobile-search{margin-bottom:10px}.roster-cards{display:flex;flex-direction:column;gap:8px}.roster-card{display:flex;flex-direction:column;gap:4px;text-align:left;padding:10px 12px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--card);color:var(--txt);font:inherit;cursor:pointer;box-shadow:var(--shadow)}.roster-card:hover{border-color:var(--acc)}.roster-card-top{display:flex;align-items:center;justify-content:space-between;gap:8px}.roster-card-name{font-weight:var(--fw-card);font-size:var(--fs-card)}.roster-card-meta{color:var(--sub);font-size:var(--fs-hint);overflow-wrap:anywhere}.roster-cards.has-index{padding-right:22px}.roster-index{position:fixed;right:2px;top:50%;transform:translateY(-50%);z-index:var(--z-float);display:flex;flex-direction:column;gap:1px;max-height:70dvh;overflow-y:auto;padding:4px 3px;border:1px solid var(--line);border-radius:10px;background:var(--card);box-shadow:var(--shadow);touch-action:none;user-select:none}.roster-index-key{min-width:24px;min-height:24px;padding:0 2px;border:0;background:none;color:var(--sub);font:inherit;font-size:var(--fs-badge);line-height:1.2;cursor:pointer}.roster-index-key.active{color:var(--acc);font-weight:var(--fw-bold)}.roster-index-bubble{position:fixed;right:36px;top:50%;transform:translateY(-50%);z-index:var(--z-float);width:72px;height:72px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:var(--acc);color:#fff;font-size:34px;font-weight:var(--fw-bold);box-shadow:var(--shadow);pointer-events:none}.board-scroll-x{overflow-x:auto;overflow-y:hidden;max-width:100%}.flex{display:flex}.flex-col{display:flex;flex-direction:column}.flex-wrap{display:flex;flex-wrap:wrap}.flex-1,.spacer{flex:1 1 auto;min-width:0}.items-center{display:flex;align-items:center}.items-baseline{display:flex;align-items:baseline}.gap-1{gap:var(--sp-1)}.gap-2{gap:var(--sp-2)}.gap-3{gap:var(--sp-3)}.gap-4{gap:var(--sp-4)}.mt-0{margin-top:0}.mt-1{margin-top:var(--sp-1)}.mt-2{margin-top:var(--sp-2)}.mt-3{margin-top:var(--sp-3)}.mt-4{margin-top:var(--sp-4)}.mb-0{margin-bottom:0}.mb-1{margin-bottom:var(--sp-1)}.mb-2{margin-bottom:var(--sp-2)}.mb-3{margin-bottom:var(--sp-3)}.ml-1{margin-left:var(--sp-1)}.ml-2{margin-left:var(--sp-2)}.ml-3{margin-left:var(--sp-3)}.mr-1{margin-right:var(--sp-1)}.mr-2{margin-right:var(--sp-2)}.p-1{padding:var(--sp-1)}.p-2{padding:var(--sp-2)}.pt-2{padding-top:var(--sp-2)}.w-110{width:110px}.w-140{width:140px}.w-150{width:150px}.w-160{width:160px}.w-180{width:180px}.w-200{width:200px}.w-220{width:220px}.w-280{width:280px}.max-w-280{max-width:280px}.text-sub{color:var(--sub)}.text-ok{color:var(--ok)}.text-acc{color:var(--acc)}.cursor-p{cursor:pointer}.chip-row{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center}.row-check{display:flex;gap:var(--sp-2);align-items:center;padding:2px 0}.row-label{display:flex;gap:var(--sp-1);align-items:center;color:var(--sub);font-size:var(--fs-body)}.scroll-box{overflow:auto;border:1px solid var(--line);border-radius:var(--radius-xs);padding:var(--sp-2)}.scroll-box-sm{max-height:200px}.scroll-box-md{max-height:260px}.scroll-box-lg{max-height:300px}.badge-pad{padding:var(--sp-1) 10px}.wrap-pre{white-space:pre-wrap}.ok-strip{background:var(--ok-weak);color:var(--ok);border:1px solid #c5ddd0;border-radius:var(--radius-sm);padding:var(--sp-2) var(--sp-3);margin-bottom:var(--sp-3);font-size:var(--fs-body)}.danger-strip{background:var(--danger-weak);color:var(--danger);border:1px solid #e4c4c4;border-radius:var(--radius-sm);padding:var(--sp-2) var(--sp-3);margin-bottom:var(--sp-3);font-size:var(--fs-body)}.soft-card{background:var(--surface-soft);border:1px solid var(--line-soft);border-radius:var(--radius-sm);padding:var(--sp-3);margin-top:var(--sp-3)}.step.is-clickable,.step.is-clickable:hover{cursor:pointer}.btn-danger-text{color:var(--danger)}.acc-link{color:var(--acc)}.fold-card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-sm);margin-bottom:var(--sp-2);overflow:hidden}.fold-card-head{width:100%;border:0;background:var(--card);color:var(--txt);padding:var(--sp-3);display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2);text-align:left;font:inherit;cursor:pointer}.fold-card-head:hover{background:var(--surface-soft)}.fold-card-title,.fold-card-state{display:inline-flex;align-items:center;gap:var(--sp-2);min-width:0}.fold-card-title b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fold-card-state{flex-shrink:0}.fold-card-chevron{color:var(--sub);font-size:var(--fs-hint)}.fold-card-body{border-top:1px solid var(--line);padding:var(--sp-3)}.fold-card-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-2) var(--sp-3);margin:0}.fold-card-grid>div{min-width:0}.fold-card-grid dt{color:var(--sub);font-size:var(--fs-hint);margin-bottom:2px}.fold-card-grid dd{margin:0;overflow-wrap:anywhere}.fold-card-actions{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-3)}.period-slots{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-2)}.period-slot{display:flex;flex-direction:column;align-items:center;gap:1px;min-width:0;min-height:52px;padding:var(--sp-1) 2px;border:1px solid var(--line-soft);border-radius:var(--radius-xs);background:var(--card);color:var(--txt);font:inherit;cursor:pointer;transition:border-color var(--t-fast) ease,background-color var(--t-fast) ease}.period-slot:hover{border-color:var(--acc)}.period-slot-label{color:var(--sub);font-size:11px;line-height:1.2}.period-slot-state{font-size:var(--fs-body);font-weight:var(--fw-semi);line-height:1.3}.period-slot-note{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--sub);font-size:10px;line-height:1.2}.log-cards{display:flex;flex-direction:column;gap:var(--sp-2)}.log-card{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--card);padding:var(--sp-2) var(--sp-3)}.log-card.is-editing{border-color:var(--acc);background:var(--acc-weak)}.log-card-head{display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-2)}.log-card-meta{color:var(--sub);font-size:var(--fs-hint);overflow-wrap:anywhere}.log-card-reason{font-size:var(--fs-body);overflow-wrap:anywhere}.log-card-ops{display:flex;gap:var(--sp-2);margin-top:var(--sp-1)}.seat-pool{min-height:120px}.seat-cell.is-over,.seat-pool.is-over{border-color:var(--acc);background:var(--acc-weak)}@media(max-width:900px){.fold-card-grid{grid-template-columns:minmax(0,1fr)}.fold-card-actions .btn{flex:1 1 auto}}@media(pointer:coarse){.period-slot,.roster-index-key{min-height:44px}.roster-index-key{min-width:24px;min-height:2.75rem}.att-state-btn,.att-period-chip{min-height:44px}}
