:root{--bg:#f7f7f9;--surface:#fff;--surface-2:#f1f2f5;--border:#d9dbe1;--border-strong:#b9bcc6;--text:#1c1d22;--text-muted:#5c6070;--accent:#3b5bdb;--accent-soft:#3b5bdb1f;--accent-contrast:#fff;--rule-soft:#7048e82e;--ok:#2f9e44;--ok-soft:#2f9e4424;--warn:#e8590c;--warn-soft:#e8590c24;--danger:#c92a2a;--danger-soft:#c92a2a1f;--male:#1c7ed6;--female:#d6336c;--other:#7048e8;--unspecified:#868e96;--on-solid:#fff;--backdrop:#0a0c1273;--cell:64px;--seat:56px;--gap:8px;--radius:8px;--radius-sm:5px;--field-label-w:56px;--font:system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--fs-sm:12px;--fs:14px;--fs-lg:16px;--shadow-1:0 1px 2px #10121b14;--shadow-2:0 4px 12px #10121b1f;--shadow-drag:0 12px 28px #10121b3d;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-theme=dark]{--bg:#14151a;--surface:#1c1e25;--surface-2:#23262f;--border:#333743;--border-strong:#4a4f5e;--text:#e9eaee;--text-muted:#a0a5b4;--accent:#7c93f5;--accent-soft:#7c93f52e;--accent-contrast:#10121a;--rule-soft:#9775fa4d;--ok:#51cf66;--ok-soft:#51cf6629;--warn:#ffa94d;--warn-soft:#ffa94d29;--danger:#ff6b6b;--danger-soft:#ff6b6b29;--male:#4dabf7;--female:#f06595;--other:#9775fa;--unspecified:#909296;--on-solid:#10121a;--backdrop:#0009;--shadow-1:0 1px 2px #0006;--shadow-2:0 4px 12px #00000080;--shadow-drag:0 12px 28px #0009;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@media (prefers-color-scheme:dark){:root:not([data-theme]){--bg:#14151a;--surface:#1c1e25;--surface-2:#23262f;--border:#333743;--border-strong:#4a4f5e;--text:#e9eaee;--text-muted:#a0a5b4;--accent:#7c93f5;--accent-soft:#7c93f52e;--accent-contrast:#10121a;--rule-soft:#9775fa4d;--ok:#51cf66;--ok-soft:#51cf6629;--warn:#ffa94d;--warn-soft:#ffa94d29;--danger:#ff6b6b;--danger-soft:#ff6b6b29;--male:#4dabf7;--female:#f06595;--other:#9775fa;--unspecified:#909296;--on-solid:#10121a;--backdrop:#0009;--shadow-1:0 1px 2px #0006;--shadow-2:0 4px 12px #00000080;--shadow-drag:0 12px 28px #0009;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}*,:before,:after{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{font-family:var(--font);font-size:var(--fs);color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased;line-height:1.45}button{font:inherit;color:inherit;cursor:pointer;border:1px solid var(--border);background:var(--surface);border-radius:var(--radius-sm);padding:6px 10px;transition:background .12s,border-color .12s}button:hover:not(:disabled){background:var(--surface-2)}button:disabled{cursor:not-allowed;opacity:.5}button.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-contrast)}button.primary:hover:not(:disabled){filter:brightness(1.08)}button.ghost{background:0 0;border-color:#0000}button.danger{color:var(--danger);border-color:var(--danger)}input,select{font:inherit;color:inherit;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);min-width:0;padding:6px 8px}input:focus-visible,select:focus-visible,button:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}input[type=file]::file-selector-button{font:inherit;color:var(--text);background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;margin-right:8px;padding:4px 10px}input[type=file]::file-selector-button:hover{border-color:var(--border-strong)}h1,h2,h3{color:var(--text);margin:0;font-weight:600}h1{font-size:var(--fs-lg)}h2{font-size:var(--fs);text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted)}.app{grid-template-rows:auto minmax(0,1fr) auto;height:100dvh;display:grid;overflow:hidden}@supports not (height:100dvh){.app{height:100vh}}.stage{min-width:0;min-height:0;display:grid;position:relative}.toolbar{align-items:center;gap:var(--gap);background:var(--surface);border-bottom:1px solid var(--border);flex-wrap:wrap;padding:10px 14px;display:flex}.toolbar__title{align-items:center;gap:8px;margin-right:auto;font-weight:600;display:flex}.toolbar__logo{width:auto;height:24px;display:block}.toolbar__title input{background:0 0;border-color:#0000;width:200px;padding:4px 6px;font-weight:600}.toolbar__title input:hover{border-color:var(--border)}.toolbar__status--bad{border-color:var(--danger);color:var(--danger)}.toolbar__more{letter-spacing:.1em;font-weight:700}@media (width<=720px){.toolbar{scrollbar-width:none;flex-wrap:nowrap;gap:6px;padding:8px 10px;overflow-x:auto}.toolbar::-webkit-scrollbar{display:none}.toolbar__title input{width:120px}.toolbar>button,.toolbar .popover>button{flex:none;min-height:40px}}.popover{flex:none;position:relative}.popover>button{align-items:center;gap:6px;display:inline-flex}.popover__badge{font-variant-numeric:tabular-nums;background:var(--surface-2);color:var(--text-muted);border-radius:999px;padding:0 5px;font-size:10px;line-height:16px}.popover__panel{z-index:60;width:var(--popover-w,320px);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);max-width:min(100vw - 16px,420px);max-height:min(70dvh,560px);box-shadow:var(--shadow-2);text-align:left;padding:12px;position:absolute;top:calc(100% + 6px);right:0;overflow-y:auto}.popover__panel--above{top:auto;bottom:calc(100% + 6px)}.popover__panel--align-left{left:0;right:auto}@media (width>=900px){.popover__panel{max-width:min(100vw - 16px,560px)}}@media (width<=720px){.popover__panel{top:auto;bottom:calc(8px + env(safe-area-inset-bottom));max-width:none;max-height:60dvh;position:fixed;left:8px;right:8px;width:auto!important}}.popover__summary{font-size:var(--fs-sm);color:var(--text-muted);margin:0 0 10px}.menu{flex-direction:column;gap:4px;display:flex}.menu>button{text-align:left;background:0 0;border-color:#0000;min-height:40px}.menu__option{align-items:center;gap:8px;display:flex}.menu__option--active{background:var(--accent-soft);color:var(--accent);font-weight:600}.menu__option--active:hover:not(:disabled){background:var(--accent-soft)}.toolbar__theme{font-size:var(--fs-lg);padding:6px 8px;line-height:1}.stack{flex-direction:column;min-height:0;padding:0 0 12px;display:flex}.stack+.stack{border-top:1px solid var(--border);padding-top:12px}.stack:last-child{padding-bottom:0}.stack__header{align-items:center;gap:8px;margin-bottom:8px;display:flex}.stack__header h2{margin:0}.stack__meta{font-size:var(--fs-sm);color:var(--text-muted);font-variant-numeric:tabular-nums;margin-left:auto}.stack__body{flex-direction:column;min-height:0;display:flex;container-type:inline-size}.hint-text{font-size:var(--fs-sm);color:var(--text-muted);margin:0}.selection-card{z-index:40;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);width:min(320px,100% - 24px);max-height:calc(100% - 24px);box-shadow:var(--shadow-2);flex-direction:column;display:flex;position:absolute;top:12px;right:12px}.selection-card__bar{border-bottom:1px solid var(--border);flex:none;align-items:center;gap:8px;padding:4px 4px 4px 12px;display:flex}.selection-card__hint{min-width:0;color:var(--text-muted);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:11px;overflow:hidden}.selection-card__close{border-radius:var(--radius-sm);background:0 0;border:none;width:32px;height:32px;padding:0;font-size:18px;line-height:1}.selection-card__scroll{min-height:0;padding:12px;overflow-y:auto}@media (width<=720px){.selection-card{width:auto;max-height:55%;inset:auto 8px 8px}}.strip{min-height:0;padding:6px 12px calc(8px + env(safe-area-inset-bottom));background:var(--surface);border-top:1px solid var(--border);flex-direction:column;display:flex}.strip__head{align-items:center;gap:8px;margin-bottom:6px;display:flex}.strip__title{font-size:var(--fs-sm);text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);align-items:baseline;gap:8px;font-weight:600;display:flex}.strip__count{letter-spacing:0;text-transform:none;font-weight:400}.strip__add{min-height:36px;font-size:var(--fs-sm);margin-left:auto;padding:2px 12px}.strip__cancel{min-height:36px;font-size:var(--fs-sm);border-color:var(--accent);color:var(--accent);padding:2px 12px}@media (hover:none),(width<=720px){.strip__add,.strip__cancel{min-height:44px}.strip .student-card{min-height:52px}}.strip__track{border-radius:var(--radius-sm);scrollbar-width:thin;border:1px dashed #0000;align-items:stretch;min-height:52px;padding:4px;transition:background .12s;display:flex;overflow:auto hidden}.strip__track--over{background:var(--accent-soft);border-color:var(--accent)}.strip__track--picking{border-color:var(--accent)}.strip__item{cursor:pointer;border-radius:var(--radius-sm);flex:none}.strip__item--picked{outline:2px solid var(--accent);outline-offset:2px}.strip .student-list{flex-direction:row;align-items:stretch;gap:8px}.strip .student-card__wrap{width:auto;max-width:200px}.strip .student-card{width:auto;min-width:96px;min-height:44px}.student-list{flex-direction:column;gap:6px;margin:0;padding:0;list-style:none;display:flex}.student-card__wrap{width:100%;min-width:0;display:flex}.student-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-1);text-align:left;touch-action:none;-webkit-user-select:none;user-select:none;align-items:center;gap:8px;width:100%;padding:6px 8px;display:flex}.strip .student-card{touch-action:pan-x}.student-card:hover{border-color:var(--border-strong)}.student-card--selected{outline:2px solid var(--accent);outline-offset:1px}.student-card--ruled{background:var(--rule-soft);border-color:var(--other)}.student-card--compact.student-card--ruled{background:var(--rule-soft);border:none;border-radius:0}.student-card--dragging{opacity:.4}.student-card__name{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.student-card__lock{background:0 0;border:none;border-radius:4px;padding:2px 4px;line-height:1}.student-card__lock:hover{background:var(--surface-2)}.gender-chip{width:18px;height:18px;color:var(--on-solid);border-radius:50%;flex:none;justify-content:center;align-items:center;font-size:10px;font-weight:700;display:inline-flex}.gender-chip--male{background:var(--male)}.gender-chip--female{background:var(--female)}.gender-chip--other{background:var(--other)}.gender-chip--unspecified{background:var(--unspecified)}.form-row{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.form-row input[type=text]{flex:1}.form-row--equal>button{flex:1 1 0;min-width:0}.field{flex-direction:column;gap:4px;margin-bottom:10px;display:flex}.field>label{font-size:var(--fs-sm);color:var(--text-muted)}.inline-field{font-size:var(--fs-sm);color:var(--text-muted);flex:1 1 0;align-items:center;gap:6px;display:flex}@container (width<=250px){.inline-field{flex:100%}}@container (width<=340px){.form-row--indent{flex-direction:column;align-items:stretch;padding-left:0}}.inline-field>span{min-width:var(--field-label-w);flex:none}.inline-field input{flex:1;min-width:0}.form-row--indent{padding-left:calc(var(--field-label-w) + 6px)}.stepper{flex:1 1 0;align-items:stretch;min-width:0;display:flex}.stepper>*+*{margin-left:-1px}.stepper input{text-align:center;appearance:textfield;border-radius:0;flex:1;min-width:0}.stepper input::-webkit-outer-spin-button{appearance:none;margin:0}.stepper input::-webkit-inner-spin-button{appearance:none;margin:0}.stepper input:focus-visible{z-index:1;position:relative}.stepper__btn{flex:none;justify-content:center;align-items:center;width:32px;padding:0;font-size:16px;line-height:1;display:inline-flex}.stepper__btn:first-child{border-radius:var(--radius-sm) 0 0 var(--radius-sm)}.stepper__btn:last-child{border-radius:0 var(--radius-sm) var(--radius-sm) 0}.empty-state{color:var(--text-muted);font-size:var(--fs-sm);text-align:center;padding:12px 4px}.canvas-wrap{background:var(--bg);touch-action:pan-x pan-y;min-width:0;min-height:0;padding:24px;overflow:auto}@media (width<=720px){.canvas-wrap{overscroll-behavior:contain;padding:12px}}.canvas-wrap--picking{cursor:crosshair}.canvas{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow-1);gap:0;width:max-content;margin:0 auto;display:grid;position:relative}.grid-cell{width:var(--cell);height:var(--cell);border-right:1px dashed var(--border);border-bottom:1px dashed var(--border)}.grid-cell--over{background:var(--accent-soft)}.grid-cell--invalid{background:var(--danger-soft)}.island-preview{z-index:2;pointer-events:none;border:2px dashed var(--accent);border-radius:var(--radius);background:var(--accent-soft);position:absolute}.island-preview--invalid{border-color:var(--danger);background:var(--danger-soft)}.island{z-index:1;border:1px solid var(--border-strong);border-radius:var(--radius);background:var(--surface-2);box-shadow:var(--shadow-1);flex-direction:column;display:flex;position:absolute}.island__body{border-radius:var(--radius-sm);flex:1;transition:background .12s;position:relative}.island__body--over{background:var(--accent-soft);outline:2px dashed var(--accent);outline-offset:-2px}.island--selected{outline:2px solid var(--accent);outline-offset:2px}.island--locked{border-style:dashed}.island--warn{border-color:var(--warn);box-shadow:0 0 0 2px var(--warn-soft)}.island__header{color:var(--text-muted);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;flex:none;align-items:center;gap:4px;padding:0 4px;font-size:10px;display:flex}.island__header:active{cursor:grabbing}.island__header--disabled{cursor:not-allowed}.island__label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.island__pos{font-variant-numeric:tabular-nums;color:var(--text);background:var(--surface);border:1px solid var(--border);border-radius:3px;flex:none;margin-left:auto;padding:0 3px;font-weight:600;line-height:12px}.island--dragging{opacity:.35}.island-ghost,.teacher-ghost{background:var(--surface);border:1px solid var(--accent);border-radius:var(--radius);font-size:var(--fs-sm);color:var(--text);padding:8px 12px}.teacher--over{background:var(--accent-soft)}.teacher--dragging{opacity:.4}.seat .student-card__wrap{align-items:stretch;height:100%}.student-card--compact{box-shadow:none;background:0 0;border:none;justify-content:center;gap:4px;height:100%;padding:2px 4px;font-size:11px}.student-card--compact .student-card__name{-webkit-line-clamp:2;line-clamp:2;white-space:normal;overflow-wrap:anywhere;text-align:center;-webkit-box-orient:vertical;max-width:100%;line-height:1.15;display:-webkit-box}.student-card--compact .student-card__lock{display:none}.seat{width:var(--seat);height:var(--seat);border:1px dashed var(--border-strong);border-radius:var(--radius-sm);background:var(--surface);font-size:var(--fs-sm);justify-content:center;align-items:center;display:flex;position:relative;overflow:hidden}.seat--over{border-color:var(--accent);background:var(--accent-soft)}.seat--occupied{border-style:solid;border-color:var(--border)}.seat--gender-male{border-color:var(--male);border-width:2px}.seat--gender-female{border-color:var(--female);border-width:2px}.seat--gender-other{border-color:var(--other);border-width:2px}.seat--gender-unspecified{border-color:var(--unspecified);border-width:2px}.seat--ok{border-color:var(--ok);box-shadow:0 0 0 2px var(--ok-soft)}.seat--violation{border-color:var(--danger);box-shadow:0 0 0 2px var(--danger-soft)}.seat__remove{background:var(--surface-2);width:16px;height:16px;color:var(--text-muted);opacity:0;border:none;border-radius:50%;padding:0;font-size:11px;line-height:1;position:absolute;top:1px;right:1px}.seat:hover .seat__remove,.seat:focus-within .seat__remove{opacity:1}@media (hover:none),(width<=720px){.seat__remove{opacity:1;width:24px;height:24px;font-size:14px}}.seat--target{border-style:solid;border-color:var(--accent);background:var(--accent-soft)}.seat__target-hint{color:var(--accent);pointer-events:none;font-size:18px}.seat__add{width:100%;height:100%;color:var(--text-muted);background:0 0;border:none;font-size:18px}.seat__badge{font-variant-numeric:tabular-nums;color:var(--text-muted);background:var(--surface-2);border-radius:3px;padding:0 3px;font-size:9px;position:absolute;bottom:1px;right:2px}.teacher{z-index:0;border:2px solid var(--accent);border-radius:var(--radius-sm);background:var(--accent-soft);color:var(--accent);touch-action:none;-webkit-user-select:none;user-select:none;cursor:grab;justify-content:center;align-items:center;font-size:11px;font-weight:600;display:flex;position:absolute}.toasts{bottom:calc(16px + env(safe-area-inset-bottom));z-index:100;pointer-events:none;flex-direction:column;gap:8px;display:flex;position:fixed;left:50%;transform:translate(-50%)}.toast{background:var(--text);color:var(--bg);border-radius:var(--radius);box-shadow:var(--shadow-2);font-size:var(--fs-sm);max-width:420px;padding:8px 14px}.toast--error{background:var(--danger);color:var(--on-solid)}.dialog-backdrop{background:var(--backdrop);z-index:200;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.dialog{background:var(--surface);border-radius:var(--radius);box-shadow:var(--shadow-2);flex-direction:column;width:min(640px,100%);max-height:80vh;display:flex;overflow:hidden}.dialog__header,.dialog__footer{border-bottom:1px solid var(--border);align-items:center;gap:8px;padding:12px 16px;display:flex}.dialog__footer{border-bottom:none;border-top:1px solid var(--border);justify-content:flex-end}.dialog__body{padding:12px 16px;overflow:auto}.dialog__table{border-collapse:collapse;width:100%;font-size:var(--fs-sm)}.dialog__table th,.dialog__table td{text-align:left;border-bottom:1px solid var(--border);padding:4px 6px}.dialog__table tr.row--error{background:var(--danger-soft)}.demo-settings{flex-direction:column;gap:6px;margin:12px 0 0;padding:0;list-style:none;display:flex}.demo-setting{align-items:flex-start;gap:8px;padding:8px 10px;line-height:1.45}.demo-setting__body{flex-direction:column;gap:2px;min-width:0;display:flex}.demo-setting__title{color:var(--text)}.toolbar__demo-label{display:inline}@media (width<=720px){.toolbar__demo-label{display:none}}.visually-hidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.drag-ghost{box-shadow:var(--shadow-drag);opacity:.95;cursor:grabbing}.chip-picker{flex-wrap:wrap;gap:4px;max-height:160px;padding:2px;display:flex;overflow-y:auto}.chip{font-size:var(--fs-sm);border:1px solid var(--border);background:var(--surface);border-radius:999px;align-items:center;gap:4px;max-width:100%;padding:3px 8px;display:inline-flex}.chip--on{border-color:var(--accent);background:var(--accent-soft);color:var(--text)}.rule-group{margin-top:10px}.rule-group__title{font-size:var(--fs-sm);color:var(--text-muted);margin-bottom:4px;font-weight:600}.rule-list{flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.rule{border:1px solid var(--border);border-radius:var(--radius-sm);font-size:var(--fs-sm);background:var(--surface);align-items:center;gap:6px;padding:4px 6px;display:flex}.rule--ok{border-color:var(--ok);background:var(--ok-soft)}.rule--bad{border-color:var(--danger);background:var(--danger-soft)}.rule__icon{flex:none;font-weight:700}.rule__names{text-overflow:ellipsis;flex:1;overflow:hidden}.rule__remove{width:20px;height:20px;color:var(--text-muted);background:0 0;border:1px solid #0000;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;font-size:14px;line-height:1;display:inline-flex}.rule__remove:hover:not(:disabled){background:var(--danger-soft);border-color:var(--danger);color:var(--danger)}.toggle-row{font-size:var(--fs-sm);color:var(--text-muted);align-items:center;gap:6px;margin-bottom:8px;display:flex}.rule select{font-size:var(--fs-sm);padding:2px 4px}.canvas-hint{border:1px dashed var(--border-strong);border-radius:var(--radius);max-width:420px;color:var(--text-muted);font-size:var(--fs-sm);text-align:center;background:var(--surface);margin:0 auto 16px;padding:10px 14px}.csv-help{font-size:var(--fs-sm);color:var(--text-muted);margin-bottom:12px}.csv-help summary{cursor:pointer;padding:4px 0}.csv-help pre{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);white-space:pre-wrap;color:var(--text);margin:6px 0 0;padding:8px 10px;font-family:ui-monospace,monospace;font-size:11px;line-height:1.5}.menu__details{border-bottom:1px solid var(--border)}.menu__details summary{cursor:pointer;font-size:var(--fs-sm);color:var(--text-muted);padding:10px 4px;list-style:none}.menu__details summary::-webkit-details-marker{display:none}.menu__details summary:before{content:"▸";margin-right:6px;transition:transform .12s;display:inline-block}.menu__details[open] summary:before{transform:rotate(90deg)}.menu__details>.stack{padding-bottom:12px}
