: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;--color-success:#0f7b3a;--color-warning:#b45309;--color-weekend-bg:#f7f3ea;--color-holiday-bg:#f6eef0;--color-error-border:#ffd4d8;--color-request:#4e5968;--color-preview-outline:#191f28;--space-xs:4px;--space-sm:8px;--space-md:16px;--space-lg:24px;--space-xl:32px;--radius-sm:4px;--radius-md:6px;--radius-control:8px}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:var(--radius-control);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-danger:hover:not(:disabled){filter:brightness(.94)}.btn-utility{border-color:var(--color-border);color:var(--color-body)}.btn-utility,.btn:hover:not(:disabled):not(.btn-primary):not(.btn-danger):not([type=submit]),button.btn:hover:not(:disabled):not(.btn-primary):not(.btn-danger){background:var(--color-surface)}.btn-sm{margin-top:0;padding:4px 8px;min-height:32px;font-size:13px}.btn:disabled,button:disabled{opacity:.45;cursor:not-allowed}.error{color:var(--color-danger)}.error,.timeout{margin-top:12px;font-size:14px}.timeout{color:var(--color-warning)}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:4px 8px;min-height:auto;background:none;border:none;border-radius:var(--radius-sm);color:var(--color-body);text-decoration:none;font-size:14px;font-weight:500}nav.top a.on{color:var(--color-foreground);font-weight:700;background:var(--color-surface);box-shadow:inset 0 -2px 0 var(--color-foreground)}main.page{padding:var(--space-lg)}.page-header{margin:0 0 var(--space-lg)}.page-header h1,main.page h1{margin:0;font-size:24px;line-height:36px;font-weight:600}.page-header .page-lead,.page-lead,main.page>p{margin:var(--space-xs) 0 0;color:var(--color-body);font-size:16px;line-height:24px;max-width:52rem}.section-title{margin:var(--space-lg) 0 var(--space-sm);font-size:18px;line-height:1.4;font-weight:600}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-surface)}.toolbar-group{display:inline-flex;align-items:center;gap:var(--space-sm)}.toolbar-sep{display:inline-block;width:1px;height:22px;background:var(--color-border)}label.inline{display:flex;align-items:center;gap:var(--space-xs);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:var(--color-weekend-bg)}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 var(--color-error-border);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)}.request-conflict{background:var(--color-canvas);border:1px solid var(--color-error-border);padding:12px var(--space-md);border-radius:var(--radius-md);margin:var(--space-md) 0;color:var(--color-body);font-size:14px}.request-conflict>strong{display:block;color:var(--color-danger)}.request-conflict-title{margin:8px 0 4px;font-weight:600}.request-conflict p{margin:6px 0}.request-conflict ul{margin:6px 0 6px 1.2em}.request-conflict a{color:var(--color-weak-fg)}.partial-failure.alert-warning{border-color:var(--color-warning)}.partial-failure.alert-warning>strong{color:var(--color-warning)}.partial-failure-actions{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-sm)}.ok{color:var(--color-success);font-size:14px}.preview-banner{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:var(--space-sm) var(--space-md);margin:0 0 var(--space-sm);padding:8px 0 10px;background:transparent;border:0;border-bottom:1px solid var(--color-border);border-radius:0}.preview-strip-copy{min-width:0;flex:1 1 16rem}.preview-strip-actions{display:flex;align-items:center;gap:var(--space-sm)}.preview-strip-actions .btn{margin-top:0;min-height:32px}.preview-banner .ok{margin:0}.preview-banner-title{display:block;margin:0 0 var(--space-xs);color:var(--color-foreground);font-size:14px;font-weight:700}.preview-metrics{display:grid;grid-gap:4px;gap:4px;margin-top:var(--space-xs);font-size:14px;line-height:21px}.preview-metrics[hidden]{display:none}.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}main.page.schedule-page{padding-top:var(--space-md)}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.schedule-workspace{display:flex;flex-direction:column;gap:var(--space-sm)}.workspace-head{display:flex;flex-direction:column;gap:6px}.workspace-title-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md);flex-wrap:wrap}.workspace-month{margin:0;font-size:28px;line-height:1.2;font-weight:700;letter-spacing:-.03em}.workspace-month-nav{display:flex;align-items:center;gap:6px}.workspace-nav-btn{margin:0;width:32px;min-height:32px;padding:0;border-radius:var(--radius-md);font-size:20px;font-weight:500;color:var(--color-foreground);background:transparent}.workspace-meta{display:flex;flex-wrap:wrap;align-items:center;gap:6px var(--space-sm);margin:0;color:var(--color-body);font-size:13px;line-height:1.4}.workspace-meta .grant{font-weight:600;color:var(--color-foreground)}.workspace-commands{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm) var(--space-md)}.workspace-commands .btn,.workspace-commands button{margin-top:0;min-height:32px;padding:6px 12px;border-radius:var(--radius-control)}.workspace-commands .btn:not(.btn-primary):not(.btn-danger){background:transparent}.workspace-commands .preview-actions .btn-primary{min-width:7rem}.workspace-partial{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm) var(--space-md)}.workspace-partial-toggle{margin:0;padding:0;min-height:auto;border:0;background:transparent;color:var(--color-body);font-size:13px;font-weight:600}.workspace-partial-body{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm)}.workspace-partial-body[hidden]{display:none}.workspace-partial-body label{margin:0;font-size:13px}.workspace-partial-body input[type=date]{width:auto;min-height:32px;padding:4px 8px;font-size:13px}.workspace-partial-body .btn{margin-top:0;min-height:32px}.toolbar input[type=date],.toolbar input[type=month],.toolbar input[type=number]{width:auto}.schedule-grid{width:100%;height:calc(100vh - 13rem);min-height:28rem;background:var(--color-canvas);position:relative;border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:none}.schedule-grid .ag-cell,.schedule-grid .ag-header-cell{border-right-color:#eceff2}.schedule-grid .ag-row{border-bottom-color:#eceff2}.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,.schedule-grid .ag-header-cell .ag-header-cell-comp-wrapper{width:100%;height:100%}.day-head{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;box-sizing:border-box;line-height:1.15;text-align:center}.day-head-status{flex:0 0 1.55rem;flex-direction:row;flex-wrap:nowrap;gap:2px;min-height:1.55rem;overflow:hidden}.day-head-hit,.day-head-status{display:flex;align-items:center;justify-content:center}.day-head-hit{flex:1 0 auto;flex-direction:column;margin:0;padding:1px 0 0;min-height:1.85rem;border:0;background:transparent;color:inherit;font:inherit;cursor:pointer}.day-head-hit strong{font-size:.85rem;font-weight:700}.day-head.today .day-head-hit strong{text-decoration:underline;text-underline-offset:2px}.day-head-hit span,.day-head-sep,.day-head-status .hol{font-weight:400;font-size:.7rem;color:var(--color-muted)}.day-head-status .hol{max-width:100%;overflow:hidden;color:var(--color-danger);font-size:11px;font-weight:600;line-height:1.1;text-overflow:ellipsis;white-space:nowrap}.day-head-sep,.min-badge{flex:0 0 auto}.min-badge{margin:0;padding:0 3px;min-height:18px;border:0;border-radius:3px;background:transparent;color:var(--color-muted);font-size:.62rem;font-weight:600;line-height:1.25;cursor:pointer}.min-badge.is-override{background:var(--color-surface);color:var(--color-foreground);font-weight:700}.emp-name{display:flex;align-items:center;justify-content:space-between;gap:.35rem;min-width:0;width:100%}.emp-name-block{display:flex;min-width:0;flex:1 1 auto;flex-direction:column;line-height:1.15}.emp-name-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600}.emp-role{color:var(--color-muted);font-size:11px;font-weight:500}.night-badge{flex:0 0 auto;margin:0;padding:1px 4px;min-height:18px;border:0;border-radius:3px;background:transparent;color:var(--color-body);font-size:.62rem;font-weight:600;line-height:1.3;white-space:nowrap;cursor:pointer}.night-badge.is-off{color:var(--color-warning);font-weight:700}.status-chip{display:inline-flex;align-items:center;justify-content:center;padding:1px 4px;font-size:.6rem}.status-chip:hover:not(:disabled){box-shadow:inset 0 0 0 1px var(--color-border)}.schedule-grid .wkd,.schedule-grid .wkd-h{background-color:var(--color-weekend-bg)}.schedule-grid .hol,.schedule-grid .hol-h{background-color:var(--color-holiday-bg)}.schedule-grid .today-h{background-image:none}.schedule-grid .is-do{color:var(--color-foreground);font-weight:650}.schedule-grid .preview-changed{background-color:transparent;outline:2px solid var(--color-preview-outline);outline-offset:-2px}.schedule-grid .request-lock{background-color:transparent}.schedule-grid .manual-edit{font-weight:600}.schedule-grid .today{box-shadow:inset 0 -2px 0 var(--color-foreground)}.shift-cell{display:flex;align-items:center;justify-content:center;gap:.15rem;width:100%}.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.request{font-size:.65rem;font-weight:700;color:var(--color-request)}.cell-picker{min-width:11rem;padding:.5rem .55rem;background:var(--color-canvas);border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:0 8px 24px rgba(25,31,40,.12)}.cell-picker-title{margin:0 0 .4rem;font-size:.8rem;font-weight:700}.cell-picker-note{margin:0 0 .35rem;font-size:.72rem;color:var(--color-body)}.cell-picker-release-block{margin:0 0 .4rem;padding-bottom:.4rem;border-bottom:1px solid var(--color-border)}.cell-picker-release{display:block;width:100%;margin:0;padding:6px 8px;min-height:0;text-align:left;background:var(--color-surface)}.cell-picker-list{display:grid;grid-template-columns:1fr 1fr;grid-gap:.25rem;gap:.25rem}.cell-picker-list button{margin:0;min-height:32px;border-radius:var(--radius-md)}.cell-picker-list button:hover:not(:disabled){background:var(--color-surface)}.cell-picker-list button.is-current{background:var(--color-surface);color:var(--color-foreground);font-weight:700;box-shadow:inset 0 0 0 1px var(--color-foreground)}.board-popover-mask{position:fixed;inset:0;z-index:40;display:flex;align-items:center;justify-content:center;background:rgba(25,31,40,.28)}.board-popover{width:min(22rem,calc(100vw - 2rem));padding:var(--space-md);background:var(--color-canvas);border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:0 12px 32px rgba(25,31,40,.16)}.board-popover h2{margin:0 0 var(--space-sm);font-size:1.05rem;font-weight:700}.board-popover-label{margin:0 0 var(--space-xs);font-weight:700}.board-radio{display:flex;align-items:center;gap:.4rem;margin:.35rem 0}.board-radio input[type=radio]{width:auto}.board-inline-num{width:4.5rem;margin:0}.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-surface);color:var(--color-foreground)}.status-badge.status-manually_edited{background:var(--color-weekend-bg)}.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}.form-dialog{width:min(26rem,calc(100vw - 32px))}.form-dialog-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-sm);margin-bottom:var(--space-sm)}.form-dialog-head h2{margin:0;font-size:18px;font-weight:600}.form-dialog-close{margin:0;padding:0;min-width:32px;min-height:32px;line-height:1;font-size:20px;font-weight:400;color:var(--color-muted)}.form-dialog-desc{margin:0 0 var(--space-md);color:var(--color-body);font-size:14px;line-height:21px}.form-dialog-body label{margin-top:var(--space-md)}.form-dialog-body label:first-child{margin-top:0}.form-dialog-body .inline{margin-top:var(--space-md)}.form-dialog .dialog-actions{margin-top:var(--space-lg)}.popover-divider{height:1px;margin:var(--space-sm) 0;background:var(--color-border)}.alert{padding:var(--space-sm) var(--space-md);border:1px solid var(--color-border);border-radius:var(--radius-md)}.alert-error{border-color:var(--color-error-border);border-left:3px solid var(--color-danger)}.alert-warning{border-left:3px solid var(--color-warning)}.login-shell{max-width:28rem;margin:4rem auto;padding:var(--space-xl) var(--space-lg);background:var(--color-canvas);border:1px solid var(--color-border);border-radius:var(--radius-md)}.login-shell h1{margin:0;font-size:24px;line-height:36px;font-weight:600}.login-shell .page-lead{margin:var(--space-xs) 0 var(--space-lg)}.login-shell-wide{max-width:36rem}.cell-picker{padding:var(--space-sm) var(--space-md)}@media (max-width:1100px){.month-inputs{grid-template-columns:1fr}}main.page.dashboard-page{max-width:1440px;margin:0 auto}.dashboard{display:flex;flex-direction:column;gap:var(--space-lg)}.dashboard-head{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--space-md)}.dashboard-title{margin:0;font-size:28px;line-height:1.2;font-weight:700;letter-spacing:-.03em}.dashboard-focus-meta{margin:0;color:var(--color-muted);font-size:13px}.dashboard-section-title{margin:0 0 var(--space-sm);font-size:16px;line-height:1.4;font-weight:700}.dashboard-section-head{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-md)}.dashboard-section-head a{color:var(--color-body);font-size:13px}.month-status-row{display:grid;grid-template-columns:1fr 1fr;grid-gap:var(--space-md);gap:var(--space-md)}.month-status{display:flex;flex-direction:column;justify-content:space-between;min-height:148px;padding:var(--space-md);background:var(--color-canvas);border:1px solid var(--color-border);border-radius:var(--radius-md)}.month-status.focus{border-color:var(--color-foreground)}.month-status-select{display:block;width:100%;margin:0;padding:0;border:0;background:transparent;text-align:left;color:inherit}.month-status-select h2{margin:0;font-size:20px;line-height:1.3;font-weight:700}.month-status-state{margin:6px 0 0;font-size:14px;font-weight:600}.month-status.confirmed .month-status-state{color:var(--color-success)}.month-status.unconfirmed .month-status-state{color:var(--color-warning)}.month-status-note,.month-status-role{margin:4px 0 0;color:var(--color-body);font-size:13px}.month-status-action{margin-top:var(--space-md);color:var(--color-foreground);font-size:13px;font-weight:600}.attention-list,.condition-list{list-style:none;margin:0;padding:0;border-top:1px solid var(--color-border)}.attention-item,.condition-list li{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-md);padding:10px 0;border-bottom:1px solid var(--color-border)}.attention-item p,.attention-item strong{margin:0}.attention-item p{margin-top:2px;color:var(--color-body);font-size:14px}.attention-item.integrity p{color:var(--color-danger)}.attention-item a,.condition-list a{flex:0 0 auto;color:var(--color-body);font-size:13px}.condition-counts{margin:0 0 var(--space-sm);font-size:13px;color:var(--color-body)}.condition-list li{justify-content:flex-start;gap:var(--space-md);font-size:13px}.condition-date{width:3rem;color:var(--color-muted)}.condition-name{min-width:4.5rem;font-weight:600}.condition-shift{min-width:2rem}.condition-source{color:var(--color-muted)}.balance-wrap{overflow-x:auto}.balance-table{width:100%;border-collapse:collapse;font-size:13px}.balance-table td,.balance-table th{padding:8px 10px;border-bottom:1px solid var(--color-border);text-align:right;white-space:nowrap}.balance-table td.name,.balance-table th.name{text-align:left;width:8rem}.balance-table thead button{display:flex;flex-direction:column;align-items:flex-end;width:100%;margin:0;padding:0;border:0;background:transparent;color:inherit;font:inherit;font-weight:700}.balance-table tbody small,.balance-table thead small{display:block;color:var(--color-muted);font-size:11px;font-weight:500}.balance-table .metric-head th{color:var(--color-muted);font-size:12px;font-weight:500}.balance-table .focus-col{background:var(--color-surface)}.balance-table td[data-missing]{color:var(--color-muted)}@media (max-width:1279px){.month-status-row{grid-template-columns:1fr}}