:root{--text:#404a54;--text-soft:#7b8590;--text-h:#1c2733;--bg:#f5f3ec;--surface:#fffefa;--border:#e4e0d3;--accent:#0e7568;--accent-strong:#0a5a50;--accent-soft:#e6f2ef;--accent-border:#9ec9c0;--warm:#b45309;--warm-soft:#fdf4e3;--danger:#c0392b;--boy:#dceafb;--boy-border:#9cc3ec;--girl:#fbe3ee;--girl-border:#f0aecb;--board:#33513f;--shadow:#2b261817 0 3px 14px -2px;--shadow-lift:#2b261824 0 8px 24px -6px;--radius:10px;--sans:"Avenir Next", "Avenir", -apple-system, "Segoe UI", "PingFang HK", "Microsoft JhengHei", system-ui, sans-serif;font:16px/1.55 var(--sans);color:var(--text);background:var(--bg);font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased}body{background-image:radial-gradient(#1c273307 1px,#0000 1px);background-size:22px 22px}*{box-sizing:border-box}body{margin:0}#root{flex-direction:column;min-height:100svh;display:flex}h1,h2,h3{color:var(--text-h);margin:0;font-weight:600}.btn{font:inherit;border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);color:var(--text);cursor:pointer;padding:8px 16px;font-weight:500;transition:border-color .15s,background .15s,color .15s,transform .1s,box-shadow .15s}.btn:hover{border-color:var(--accent);color:var(--accent-strong)}.btn:active{transform:translateY(1px)}:is(.btn,.tab,input,select,.seat,.student-chip,summary):focus-visible{outline:2px solid var(--accent);outline-offset:2px}.btn-primary{background:var(--accent);border-color:var(--accent);color:#fff;box-shadow:var(--shadow)}.btn-primary:hover{background:var(--accent-strong);border-color:var(--accent-strong);color:#fff}.btn-ghost{background:0 0;border-color:#0000}.page-loading{color:var(--text-soft);flex:1;place-items:center;display:grid}.signin-page{flex:1;place-items:center;padding:24px;display:grid}.signin-card{background:var(--surface);border:1px solid var(--border);border-top:4px solid var(--accent);box-shadow:var(--shadow-lift);text-align:center;border-radius:16px;flex-direction:column;gap:16px;max-width:420px;padding:48px 40px;animation:.4s cubic-bezier(.2,.8,.3,1) both card-in;display:flex}.signin-card h1{letter-spacing:.02em;font-size:26px}@keyframes card-in{0%{opacity:0;transform:translateY(10px)scale(.985)}}@media (prefers-reduced-motion:reduce){*{transition-duration:.01ms!important;animation-duration:.01ms!important}}.signin-tagline{color:var(--text-soft);margin:0}.signin-btn{padding:12px 24px}.signin-privacy{color:var(--text-soft);margin:0;font-size:13px}.signin-error{color:var(--danger);margin:0;font-size:14px}.app-shell{flex-direction:column;flex:1;display:flex}.app-header{background:var(--surface);border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;gap:16px;padding:10px 20px;display:flex;box-shadow:0 2px 8px #2b26180a}.app-title{color:var(--text-h);letter-spacing:.04em;font-weight:600}.app-title:before{content:"▦ ";color:var(--accent)}.app-header-actions{align-items:center;gap:8px;display:flex}.app-user{color:var(--text-soft);font-size:14px}.app-main{flex:1;padding:20px}.page-head{align-items:center;gap:16px;margin-bottom:20px;display:flex}.page-head-spacer{flex:1}.empty-hint{color:var(--text-soft);text-align:center;border:1.5px dashed var(--border);border-radius:var(--radius);background:var(--surface);padding:44px 24px}.empty-hint:before{content:"▦";color:var(--accent-border);margin-bottom:8px;font-size:28px;display:block}.classroom-cards{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:16px;margin:0;padding:0;list-style:none;display:grid}.classroom-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);flex-direction:column;transition:box-shadow .18s,transform .18s,border-color .18s;display:flex}.classroom-card:hover{box-shadow:var(--shadow-lift);border-color:var(--accent-border);transform:translateY(-2px)}.classroom-card-open{font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;flex-direction:column;gap:6px;padding:16px;display:flex}.classroom-card-name{color:var(--text-h);font-size:18px;font-weight:600}.classroom-card-meta{color:var(--text-soft);font-size:13px}.classroom-card-actions{border-top:1px solid var(--border);gap:4px;padding:4px 8px 8px;display:flex}.btn-sm{padding:4px 10px;font-size:13px}.btn-danger{color:var(--danger)}.btn-danger:hover{border-color:var(--danger);color:var(--danger)}.btn-danger-solid{background:var(--danger);border-color:var(--danger)}.btn-danger-solid:hover{background:#b93c3c}.dialog-overlay{z-index:50;background:#11182773;place-items:center;padding:24px;animation:.15s both overlay-in;display:grid;position:fixed;inset:0}@keyframes overlay-in{0%{opacity:0}}.dialog{background:var(--surface);border-top:4px solid var(--accent);box-shadow:var(--shadow-lift);border-radius:14px;width:100%;max-width:420px;padding:24px;animation:.22s cubic-bezier(.2,.8,.3,1) both card-in}.dialog-title{margin-bottom:16px;font-size:18px}.dialog-actions{justify-content:flex-end;gap:8px;margin-top:20px;display:flex}.field{color:var(--text-h);flex-direction:column;gap:6px;margin-bottom:12px;font-size:14px;display:flex}.field input{font:inherit;border:1px solid var(--border);background:var(--bg);border-radius:8px;padding:8px 10px}.field input:focus{outline:2px solid var(--accent-soft);border-color:var(--accent)}.field-row{align-items:flex-end;gap:12px;display:flex}.field-hint{color:var(--text-soft);margin:0 0 12px;font-size:13px}.layout-editor{max-width:none}.layout-toolbar .field{margin-bottom:0}.layout-toolbar input{width:72px}.desk-canvas-editor{background-image:linear-gradient(90deg,#1c27330f 1px,#0000 1px),linear-gradient(#1c27330f 1px,#0000 1px);background-size:calc(var(--cell,34px) + 2px) calc(var(--cell,34px) + 2px);border:1px solid var(--border);cursor:copy;border-radius:8px;padding:1px}.editor-desk{cursor:default;overflow:visible}.editor-desk-body{cursor:grab;touch-action:none;border-radius:8px;place-items:center;display:grid;position:absolute;inset:0}.editor-desk-dragging{opacity:.6;z-index:5}.editor-desk-occupant{color:var(--text-soft);text-overflow:ellipsis;white-space:nowrap;pointer-events:none;max-width:100%;padding:0 4px;font-size:11px;overflow:hidden}.editor-desk-btn{border:1px solid var(--border);background:var(--surface);box-shadow:var(--shadow);cursor:pointer;opacity:.65;z-index:6;border-radius:50%;place-items:center;width:22px;height:22px;font-size:13px;line-height:1;transition:opacity .12s;display:grid;position:absolute}.editor-desk:hover .editor-desk-btn,.editor-desk-btn:focus-visible{opacity:1}.editor-desk-rotate{color:var(--accent-strong);top:2px;left:2px}.editor-desk-remove{color:var(--danger);top:2px;right:2px}.seat{aspect-ratio:4/3;border:1px solid var(--accent-border);background:var(--accent-soft);cursor:pointer;border-radius:8px;min-height:34px;transition:border-color .12s,background .12s,box-shadow .12s}.seat:hover{border-color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent)}.blackboard-bar{background:var(--board);color:#f2f7f0;text-align:center;letter-spacing:.5em;text-indent:.5em;background-image:radial-gradient(#ffffff0d 1px,#0000 1px);background-size:5px 5px;border-bottom:3px solid #24382c;border-radius:6px;padding:7px;font-size:13px;font-weight:300}.layout-save{margin-bottom:12px}.saved-flash{color:#15803d;padding-bottom:18px;font-size:14px}.tabs{background:var(--bg);border:1px solid var(--border);border-radius:999px;gap:4px;padding:3px;display:flex}.tab{font:inherit;cursor:pointer;color:var(--text-soft);background:0 0;border:none;border-radius:999px;padding:6px 16px;font-size:14px}.tab-active{background:var(--surface);color:var(--text-h);box-shadow:var(--shadow)}.panel-toolbar{align-items:center;gap:8px;margin-bottom:12px;display:flex}.panel-count{color:var(--text-soft);font-size:14px}.csv-hint{background:var(--accent-soft);border:1px solid var(--accent-border);border-radius:var(--radius);margin-bottom:16px;padding:10px 14px;font-size:14px}.csv-hint summary{cursor:pointer;color:var(--accent-strong);font-weight:500}.csv-hint ul{margin:10px 0;padding-left:20px}.csv-hint li{margin:4px 0}.students-table{border-collapse:collapse;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);width:100%;font-size:14px;overflow:hidden}.students-table th,.students-table td{text-align:left;border-bottom:1px solid var(--border);padding:8px 12px}.students-table th{background:var(--bg);color:var(--text-soft);font-size:13px;font-weight:500}.students-table tbody tr:last-child td{border-bottom:none}.remark-cell{color:var(--text-soft);text-overflow:ellipsis;white-space:nowrap;max-width:180px;overflow:hidden}.row-actions{text-align:right;white-space:nowrap}.form-error{color:var(--danger);margin:4px 0 0;font-size:14px}select{font:inherit;border:1px solid var(--border);background:var(--bg);border-radius:8px;padding:8px 10px}.seating-layout{align-items:flex-start;gap:20px;display:flex}.seating-main{flex:1;min-width:0}.seating-toolbar{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:8px;display:flex}.room{flex-direction:column;gap:12px;width:fit-content;max-width:100%;margin-top:12px;display:flex;overflow-x:auto}.desk-canvas{grid-template-columns:repeat(var(--canvas-w,16), var(--cell,34px));grid-template-rows:repeat(var(--canvas-h,12), var(--cell,34px));gap:2px;width:fit-content;display:grid}.desk-cell{aspect-ratio:auto;place-items:center;height:auto;min-height:0;padding:1px;display:grid;position:relative;overflow:hidden}.student-chip-seated{max-width:100%;max-height:100%;padding:1px 2px}.student-card-zh{white-space:nowrap}.seat-over{border-color:var(--accent);background:#d3e9e3;border-width:2px}.seat-locked{border-style:dashed;border-color:var(--warm);background:var(--warm-soft)}.seat-lock{cursor:pointer;opacity:.45;z-index:2;background:0 0;border:none;padding:3px;font-size:11px;position:absolute;top:0;right:0}.seat-lock:hover,.seat-lock-on{opacity:1}.student-chip{background:var(--surface);border:1px solid var(--border);cursor:grab;touch-action:none;border-radius:8px;width:100%;padding:6px 8px;list-style:none;display:block}.student-chip-seated{text-align:center;background:0 0;border:none}.student-chip-dragging{opacity:.35}.student-chip-overlay{box-shadow:var(--shadow);cursor:grabbing}.student-card{border-radius:6px;justify-content:center;align-items:center;gap:6px;padding:2px 4px;display:flex}.student-card-m{background:var(--boy);outline:1px solid var(--boy-border)}.student-card-f{background:var(--girl);outline:1px solid var(--girl-border)}.student-card-no{color:var(--text-soft);text-align:center;background:#ffffffb3;border-radius:4px;flex-shrink:0;min-width:18px;padding:1px 5px;font-size:12px}.student-card-names{flex-direction:column;min-width:0;line-height:1.25;display:flex}.student-card-zh{color:var(--text-h);font-size:16px}.student-card-en{color:var(--text-soft);white-space:nowrap;font-size:12px}.unassigned-list .student-card-zh,.unassigned-list .student-card-en{text-overflow:ellipsis;max-width:100%;overflow:hidden}.unassigned-panel{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);flex-shrink:0;width:240px;max-height:70vh;padding:14px;overflow-y:auto}.unassigned-over{border-color:var(--accent);background:var(--accent-soft)}.unassigned-title{margin-bottom:10px;font-size:14px}.unassigned-list{flex-direction:column;gap:6px;margin:0;padding:0;display:flex}.table-photo{object-fit:cover;border-radius:50%;width:28px;height:28px;display:block}.table-photo-empty{background:var(--bg);border:1px dashed var(--border)}.photo-hints{color:var(--text-soft);margin:0 0 14px;padding-left:18px;font-size:14px}.photo-hints li{margin:4px 0}.student-card-with-photo{flex-direction:row;gap:4px;padding:1px}.desk-rot90 .student-card{flex-direction:column;gap:2px}.desk-rot90 .student-card-names{align-items:center}.desk-rot90 .student-card-line{flex-wrap:wrap}.desk-rot90 .student-card-zh,.desk-rot90 .student-card-en{white-space:normal;text-align:center;overflow-wrap:anywhere;line-height:1.15}.student-card-photo{width:min(calc(var(--cell,70px) - 24px), 64px);height:min(calc(var(--cell,70px) - 24px), 64px);object-fit:cover;pointer-events:none;border-radius:6px}.unassigned-list .student-card-photo{width:32px;height:32px}.student-card-line{justify-content:center;align-items:center;gap:4px;min-width:0;display:flex}.display-options-bar{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);flex-wrap:wrap;align-items:center;gap:14px;margin-bottom:8px;padding:10px 14px;font-size:14px;display:flex}.display-option{cursor:pointer;align-items:center;gap:6px;display:flex}.display-option-select select{padding:4px 8px}.print-header{display:none}.pdf-capture{background:#fff;padding:8px}.pdf-capture .print-header{border-bottom:2px solid #111;justify-content:space-between;align-items:baseline;margin-bottom:12px;padding-bottom:6px;display:flex}.pdf-capture .print-header .print-title{color:#111;font-size:22px;font-weight:700}.pdf-capture .print-header .print-date{color:#444;font-size:13px}.pdf-capture .seat-lock{display:none}.pdf-capture,.pdf-capture .room,.pdf-capture .desk-canvas{width:fit-content;max-width:none;overflow:visible}@media print{body{background:#fff}.app-header,.page-head,.seating-toolbar,.display-options-bar,.unassigned-panel,.field-hint,.seat-lock{display:none!important}.app-main{padding:0}.seating-layout{display:block}.print-header{border-bottom:1.5px solid #111;justify-content:space-between;align-items:baseline;margin-bottom:6mm;padding-bottom:2mm;display:flex}.print-title{color:#111;font-size:20pt;font-weight:700}.print-date{color:#444;font-size:11pt}.room{width:fit-content;max-width:none;margin:0 auto;overflow:visible}.desk-canvas{--print-cell:min(calc((257mm - var(--canvas-w,16) * 1mm) / var(--canvas-w,16)), calc((150mm - var(--canvas-h,12) * 1mm) / var(--canvas-h,12)));gap:1mm;width:fit-content;max-width:none;overflow:visible;grid-template-columns:repeat(var(--canvas-w,16), var(--print-cell))!important;grid-template-rows:repeat(var(--canvas-h,12), var(--print-cell))!important}.seat{break-inside:avoid;background:#fff;border:.4pt solid #888;border-radius:1.5mm;min-height:0;overflow:hidden}@media (orientation:portrait){.desk-canvas{--print-cell:min(calc((170mm - var(--canvas-w,16) * 1mm) / var(--canvas-w,16)), calc((237mm - var(--canvas-h,12) * 1mm) / var(--canvas-h,12)))}}.student-card-photo{width:9mm;height:9mm}.student-card-zh{font-size:10pt}.student-card-en{font-size:7pt}.seat-locked{background:#fff;border-style:solid;border-color:#888}.student-card,.student-card-m,.student-card-f{-webkit-print-color-adjust:exact;print-color-adjust:exact}.blackboard-bar{color:#fff;-webkit-print-color-adjust:exact;print-color-adjust:exact;background:#333}}.import-summary{color:var(--text-h);font-weight:600}.import-warn{color:#b45309;font-size:14px}.import-issues{background:#fef2f2;border:1px solid #fecaca;border-radius:8px;max-height:180px;padding:10px 14px;font-size:13px;overflow-y:auto}.import-issues ul{margin:6px 0 0;padding-left:18px}
