:root{--color-primary:#3182f6;--color-primary-hover:#2272eb;--color-canvas:#ffffff;--color-foreground:#191f28;--color-body:#4e5968;--color-muted:#8b95a1;--color-surface:#f2f4f6;--color-border:#e5e8eb;--color-on-primary:#ffffff;--color-weak-bg:#e8f3ff;--color-weak-fg:#1b64da;--color-danger:#e42939;--space-xs:4px;--space-sm:8px;--space-md:16px;--space-lg:24px;--space-xl:32px;--radius-sm:4px;--radius-md:6px}body,html{margin:0;padding:0;font-family:system-ui,Malgun Gothic,Apple SD Gothic Neo,sans-serif;color:var(--color-foreground);background:var(--color-surface)}.wrap{max-width:28rem;margin:4rem auto;padding:var(--space-lg);background:var(--color-canvas);border:1px solid var(--color-border);border-radius:var(--radius-md)}.wrap h1{margin:0 0 var(--space-md);font-size:1.5rem;line-height:1.4;font-weight:700}label{display:block;margin:12px 0 var(--space-xs);font-size:14px;color:var(--color-body)}input,select{width:100%;box-sizing:border-box;padding:var(--space-sm) 12px;font-size:16px;line-height:24px;color:var(--color-foreground);border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-canvas)}button:focus-visible,input:focus,select:focus{outline:2px solid var(--color-primary);outline-offset:2px}.btn,button{margin-top:var(--space-md);padding:8px 16px;min-height:38px;font-size:14px;font-weight:600;line-height:1;cursor:pointer;border:1px solid var(--color-border);border-radius:10px;background:var(--color-canvas);color:var(--color-body)}.btn-primary,button[type=submit]{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-on-primary)}.btn-primary:hover:not(:disabled),button[type=submit]:hover:not(:disabled){background:var(--color-primary-hover);border-color:var(--color-primary-hover)}.btn-danger{background:var(--color-danger);border-color:var(--color-danger);color:var(--color-on-primary)}.btn:disabled,button:disabled{opacity:.45;cursor:not-allowed}.error{color:var(--color-danger)}.error,.timeout{margin-top:12px;font-size:14px}.timeout{color:#b45309}nav.top{display:flex;gap:var(--space-md);padding:12px var(--space-lg);background:var(--color-canvas);border-bottom:1px solid var(--color-border)}nav.top a,nav.top button{margin:0;padding:var(--space-xs) 0;min-height:auto;background:none;border:none;border-radius:0;color:var(--color-weak-fg);text-decoration:none;font-size:14px;font-weight:600}nav.top a.on{color:var(--color-foreground)}main.page{padding:var(--space-lg)}main.page h1{margin:0 0 var(--space-sm);font-size:24px;line-height:36px;font-weight:600}main.page>p{margin:0 0 var(--space-md);color:var(--color-body);font-size:16px;line-height:24px;max-width:52rem}main.page.wide{max-width:1100px}.toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm) var(--space-md);margin:0 0 var(--space-md);padding:var(--space-sm) var(--space-md);background:var(--color-canvas);border:1px solid var(--color-border);border-radius:var(--radius-md)}.toolbar .btn,.toolbar button{margin-top:0}.toolbar-debug{background:var(--color-weak-bg)}label.inline{display:flex;align-items:center;gap:6px;margin:12px 0}label.inline input{width:auto}table.grid{width:100%;border-collapse:collapse;background:var(--color-canvas)}table.grid td,table.grid th{border:1px solid var(--color-border);padding:8px 10px;text-align:left;font-size:14px}table.grid td.drag,table.grid tr.inactive td{color:var(--color-muted)}table.grid td.drag{cursor:-webkit-grab;cursor:grab;width:1.5rem}table.grid td .btn,table.grid td button{margin:0 6px 0 0;padding:4px 8px;min-height:32px}.panel{margin:var(--space-lg) 0}.table-scroll{overflow:auto;max-width:100%}table.req td,table.req th{min-width:4.8rem;vertical-align:top;font-size:.8rem}table.req tbody th.sticky,table.req td.sticky,table.req th.sticky{position:-webkit-sticky;position:sticky;left:0;background:var(--color-canvas);min-width:5.5rem;z-index:1}table.req th.weekend{background:#fff6d6}table.req span.hol{display:block;color:var(--color-danger);font-weight:400;font-size:.7rem}table.req td.locked{background:var(--color-weak-bg)}table.req select{padding:.15rem;font-size:.8rem}table.req label.lock{display:flex;align-items:center;gap:.2rem;margin:.2rem 0 0;font-size:.7rem}table.req label.lock input{width:auto}.violations{background:var(--color-canvas);border:1px solid #ffd4d8;padding:12px var(--space-md);border-radius:var(--radius-md);margin-bottom:var(--space-md)}.violations li{margin:var(--space-xs) 0;color:var(--color-body)}.ok{color:#0f7b3a;font-size:14px}.field-help,.hint,.muted{color:var(--color-muted);font-size:14px;line-height:21px}.hint{max-width:70rem}.field-help{display:block;margin-top:4px;font-size:12px}.empty{color:var(--color-muted);padding:var(--space-md) 0}main.page.full{max-width:none;min-width:1280px}.toolbar input[type=date],.toolbar input[type=month],.toolbar input[type=number]{width:auto}.schedule-grid{width:100%;height:calc(100vh - 16rem);min-height:28rem;background:var(--color-canvas);position:relative;border:1px solid var(--color-border);border-radius:var(--radius-md)}.schedule-grid .busy-mask{position:absolute;inset:0;z-index:5;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.82);font-weight:600}.day-head{display:flex;flex-direction:column;line-height:1.15;text-align:center;width:100%}.day-head span{font-weight:400;font-size:.7rem;color:var(--color-muted)}.day-head .hol{color:var(--color-danger);font-size:.65rem}.schedule-grid .wkd,.schedule-grid .wkd-h{background-color:#fff6d6}.schedule-grid .hol,.schedule-grid .hol-h{background-color:#ffe8ea}.schedule-grid .is-do{color:var(--color-muted);font-weight:600}.schedule-grid .preview-changed{outline:2px solid var(--color-primary);outline-offset:-2px}.schedule-grid .preview-changed,.schedule-grid .request-lock{background-color:var(--color-weak-bg)}.schedule-grid .manual-edit{font-weight:600}.shift-cell{display:flex;align-items:center;gap:.15rem}.shift-cell .shift-code{font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.shift-cell .mark.override{display:inline-block;width:.4rem;height:.4rem;border-radius:50%;background:var(--color-primary)}.shift-cell .mark.lock,.shift-cell .mark.request{font-size:.65rem;font-weight:700;color:var(--color-weak-fg)}.schedule-grid .agg-cell{font-size:.68rem;white-space:nowrap}.status-badge,.toolbar .grant{font-weight:600}.status-badge{display:inline-flex;align-items:center;padding:4px 8px;border-radius:var(--radius-sm);background:var(--color-surface);color:var(--color-body);font-size:12px}.status-badge.status-confirmed{background:var(--color-weak-bg);color:var(--color-weak-fg)}.status-badge.status-manually_edited{background:#fff6d6}.badge-weak{display:inline-flex;align-items:center;padding:4px 8px;border-radius:var(--radius-sm);background:var(--color-weak-bg);color:var(--color-weak-fg);font-size:12px;font-weight:600}.busy-label{color:var(--color-primary);font-weight:600}.schedule-grid .role-band{border-top:2px solid var(--color-foreground)}.schedule-grid .agg-footer{background-color:var(--color-surface);font-weight:600}.schedule-grid .agg-total{background-color:var(--color-border)}.month-inputs{display:grid;grid-template-columns:1fr 1fr;grid-gap:var(--space-md);gap:var(--space-md)}.month-inputs,.panel-card{margin-top:var(--space-lg)}.panel-card{padding:var(--space-md);background:var(--color-canvas);border:1px solid var(--color-border);border-radius:var(--radius-md)}.panel-card h2{margin:0 0 var(--space-sm);font-size:18px;line-height:1.4}.inline-add{display:flex;align-items:center;gap:var(--space-sm);margin:var(--space-md) 0}.inline-add input{width:auto}.snapshot-list{list-style:none;margin:0;padding:0}.snapshot-list li{display:flex;justify-content:space-between;align-items:center;gap:var(--space-md);padding:var(--space-sm) 0;border-bottom:1px solid var(--color-border)}.snapshot-list .muted{display:block}.dialog-mask{position:fixed;inset:0;z-index:20;display:flex;align-items:center;justify-content:center;background:rgba(25,31,40,.32)}.dialog{width:min(28rem,calc(100vw - 32px));padding:var(--space-lg);background:var(--color-canvas);border:1px solid var(--color-border);border-radius:var(--radius-md)}.dialog h2{margin:0 0 var(--space-sm);font-size:18px}.dialog p{margin:0 0 var(--space-md);color:var(--color-body)}.dialog-actions{display:flex;justify-content:flex-end;gap:var(--space-sm)}.dialog-actions .btn{margin-top:0}@media (max-width:1100px){.month-inputs{grid-template-columns:1fr}}