:root{--font-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Inter, Roboto, Helvetica, Arial, sans-serif;--font-mono: ui-monospace, "JetBrains Mono", "Fira Code", Menlo, Consolas, monospace;--paper: #ffffff;--bg: #fafafa;--surface: #ffffff;--surface-2: #f5f5f5;--surface-3: #ececec;--line: #e3e3e3;--line-soft: #efefef;--line-strong: #1a1a1a;--ink: #0a0a0a;--ink-2: #1f1f1f;--ink-3: #3a3a3a;--muted: #5a5a5a;--faint: #7a7a7a;--hairline: #c4c4c4;--focus: #0a0a0a;--danger-ink: #1a1a1a;--danger-bg: #111111;--radius-sm: 4px;--radius: 6px;--radius-lg: 10px;--shadow-sm: 0 1px 0 rgba(0,0,0,.04);--shadow: 0 1px 2px rgba(0,0,0,.06), 0 4px 16px rgba(0,0,0,.05);--shadow-lg: 0 2px 4px rgba(0,0,0,.06), 0 18px 42px rgba(0,0,0,.1);--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 14px;--space-5: 18px;--space-6: 22px;--space-8: 28px;--space-10: 36px;--nav-height: 52px;--ease: cubic-bezier(.2,.8,.2,1)}@media (max-width: 720px){:root{--nav-height: 46px}}*,*:before,*:after{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;font-family:var(--font-sans);font-size:12.5px;line-height:1.4;color:var(--ink);background:var(--bg);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}@media (max-width: 720px){body{font-size:11.5px;line-height:1.38}}@media (max-width: 480px){body{font-size:11px;line-height:1.35}}a{color:var(--ink);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px}a:hover{color:var(--ink);text-decoration-thickness:2px}h1{font-size:1.55rem;font-weight:700;letter-spacing:-.02em;margin:0 0 var(--space-4) 0;color:var(--ink)}h2{font-size:1rem;font-weight:600;letter-spacing:-.01em;margin:0 0 var(--space-3) 0;color:var(--ink)}h3{font-size:.76rem;font-weight:600;margin:0 0 var(--space-2) 0;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}p{margin:0 0 var(--space-3) 0;color:var(--ink-3)}button,.btn{font:inherit;font-weight:500;padding:.5rem .9rem;background:var(--paper);color:var(--ink);border:1px solid var(--hairline);border-radius:var(--radius-sm);cursor:pointer;display:inline-flex;align-items:center;gap:.5rem;transition:background .12s var(--ease),border-color .12s var(--ease),transform .08s var(--ease);white-space:nowrap}button:hover{background:var(--surface-2);border-color:var(--ink)}button:active{transform:translateY(1px)}button:focus-visible{outline:2px solid var(--focus);outline-offset:2px}button:disabled{opacity:.45;cursor:not-allowed}button:disabled:hover{background:var(--paper);border-color:var(--hairline)}button.primary{background:var(--ink);color:var(--paper);border-color:var(--ink);font-weight:600}button.primary:hover{background:#000}button.primary:focus-visible{outline-color:#000}button.ghost{background:transparent;border-color:transparent;color:var(--ink-3)}button.ghost:hover{background:var(--surface-2);color:var(--ink)}button.danger{background:var(--paper);border-color:var(--hairline);color:var(--ink)}button.danger:hover{background:var(--ink);color:var(--paper);border-color:var(--ink)}button.small{padding:.25rem .55rem;font-size:.78rem}.segmented{display:inline-flex;border:1px solid var(--hairline);border-radius:var(--radius-sm);overflow:hidden;background:var(--paper)}.segmented button{border:none;border-right:1px solid var(--line-soft);border-radius:0;padding:.4rem .8rem;background:transparent;font-size:.82rem}.segmented button:last-child{border-right:none}.segmented button:hover{background:var(--surface-2)}.segmented button.on{background:var(--ink);color:var(--paper)}input,select,textarea{font:inherit;color:var(--ink);background:var(--paper);border:1px solid var(--hairline);border-radius:var(--radius-sm);padding:.5rem .7rem;transition:border-color .12s var(--ease),box-shadow .12s var(--ease);width:100%}input:focus,select:focus,textarea:focus{outline:none;border-color:var(--ink);box-shadow:0 0 0 3px #0000000f}input:disabled,select:disabled{opacity:.55;background:var(--surface-2);cursor:not-allowed}textarea{resize:vertical;min-height:72px;font-family:inherit}label{font-size:.76rem;font-weight:600;color:var(--muted);letter-spacing:.02em;display:block;margin-bottom:.3rem;text-transform:uppercase}.app-shell{min-height:100vh;display:flex;flex-direction:column}.nav{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-3) var(--space-6);background:var(--paper);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:50}.nav .brand{font-weight:800;font-size:1.02rem;letter-spacing:-.015em;color:var(--ink);margin-right:var(--space-5);display:inline-flex;align-items:center;gap:.5rem;text-decoration:none}.nav .brand:hover{text-decoration:none;color:var(--ink)}.nav .brand .mark{width:18px;height:18px;background:var(--ink);border-radius:2px;display:inline-block}.nav-tabs{display:contents}.nav-tabs a,.nav-tabs .nav-link{color:var(--ink-3);font-weight:500;font-size:.88rem;padding:.4rem .65rem;border-radius:var(--radius-sm);text-decoration:none;transition:background .1s var(--ease)}.nav-tabs a:hover,.nav-tabs .nav-link:hover{background:var(--surface-2);color:var(--ink)}.nav-tabs a.active{color:var(--paper);background:var(--ink)}.nav-end{margin-left:auto;display:flex;align-items:center;gap:var(--space-3);color:var(--muted);font-size:.85rem}.nav-burger{display:none;margin-left:auto;padding:.4rem .6rem;font-size:1.1rem;line-height:1;background:transparent;border:1px solid var(--hairline)}.nav-burger:hover{background:var(--surface-2);border-color:var(--ink)}.nav-drawer-scrim{position:fixed;top:0;right:0;bottom:0;left:0;background:#0006;z-index:90;animation:fadeIn .14s var(--ease) both}.nav-drawer{position:fixed;top:0;right:0;bottom:0;width:min(320px,88vw);background:var(--paper);border-left:1px solid var(--line);box-shadow:var(--shadow-lg);z-index:95;display:flex;flex-direction:column;animation:drawer-in .16s var(--ease) both}@keyframes drawer-in{0%{transform:translate(100%)}to{transform:none}}.nav-drawer-head{display:flex;align-items:center;justify-content:space-between;padding:var(--space-4);border-bottom:1px solid var(--line)}.nav-drawer-head .brand{margin:0}.nav-drawer-links{display:flex;flex-direction:column;padding:var(--space-3);gap:2px;overflow-y:auto;flex:1}.nav-drawer-links a{display:block;padding:.7rem .9rem;font-size:.95rem;color:var(--ink);text-decoration:none;border-radius:var(--radius-sm)}.nav-drawer-links a:hover{background:var(--surface-2)}.nav-drawer-links a.active{background:var(--ink);color:var(--paper)}.nav-drawer-foot{padding:var(--space-4);border-top:1px solid var(--line)}.page{padding:var(--space-5) var(--space-6) var(--space-8);max-width:1440px;margin:0 auto;width:100%;animation:fadeInOpacity .18s var(--ease) both}@keyframes fadeInOpacity{0%{opacity:0}to{opacity:1}}@media (max-width: 720px){.page{padding:var(--space-3) var(--space-3) var(--space-8)}.nav{padding:var(--space-2) var(--space-3)}.nav .brand{margin-right:var(--space-2);font-size:.92rem;flex:none}.nav .brand .mark{width:14px;height:14px}.nav-tabs{display:none}.nav-burger{display:inline-flex}h1{font-size:1.25rem}.card{padding:var(--space-4);margin-bottom:var(--space-3)}.grid-2,.grid-3,.grid-4{grid-template-columns:1fr;gap:var(--space-3)}.stat-value{font-size:1.4rem}.prefs-intro{padding:var(--space-3) var(--space-4);font-size:.86rem}button:not(.tk-info-btn),.btn,.shift-chip,.block-chip,.pref-cell{min-height:32px}.day-btn{min-height:44px;min-width:56px}.calendar .cal-day{min-height:48px;font-size:.86rem}.swatch-picker .swatch-btn{height:36px}.deadline-banner{padding:var(--space-3) var(--space-4)}.deadline-when{font-size:1rem}.open-prefs-body{padding:var(--space-3) var(--space-4)}.open-prefs-body .headline{font-size:1.05rem}.modal{width:100%;max-width:none;max-height:calc(100vh - var(--nav-height) - 32px);border-radius:var(--radius)}.modal-back{padding:16px 12px}.modal-head{padding:14px 16px 12px}.modal-foot{padding:12px 16px}.modal-body{padding:14px 16px}.next-step-card{padding:var(--space-4)}.next-step-head{font-size:1.05rem}}@media (max-width: 480px){.nav{padding:var(--space-2)}.nav .brand{font-size:.88rem}.nav .brand .mark{width:14px;height:14px}h1{font-size:1.15rem}}.rota-page{display:grid;grid-template-columns:minmax(0,1fr) 280px;grid-template-areas:"main side";gap:var(--space-4);align-items:start}.rota-page .rota-main{grid-area:main;min-width:0}.rota-page .rota-side{grid-area:side;position:sticky;top:calc(var(--nav-height) + 8px);max-height:calc(100vh - var(--nav-height) - 16px);overflow-y:auto;padding-right:6px;padding-bottom:var(--space-6);scroll-behavior:smooth}.rota-page .rota-side::-webkit-scrollbar{width:6px}.rota-page .rota-side::-webkit-scrollbar-thumb{background:var(--hairline);border-radius:6px;border:none}.rota-page .rota-side .card{margin-bottom:var(--space-3);padding:var(--space-4)}.rota-page .rota-side .card:last-child{margin-bottom:0}.rota-side-toggle{display:none}@media (max-width: 980px){.rota-page{grid-template-columns:1fr;grid-template-areas:"main"}.rota-page .rota-side{position:fixed;top:calc(var(--nav-height) + 12px);left:50%;transform:translate(-50%) translateY(-8px);width:min(380px,92vw);max-height:calc(100vh - var(--nav-height) - 24px);background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);padding:var(--space-4);z-index:60;opacity:0;pointer-events:none;transition:transform .16s var(--ease),opacity .14s var(--ease);grid-column:unset;grid-area:unset}.rota-page.side-open .rota-side{transform:translate(-50%) translateY(0);opacity:1;pointer-events:auto}.rota-page.side-open:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;background:#0a0a0a6b;z-index:55;animation:fadeIn .14s var(--ease) both}.rota-side-toggle{display:inline-flex;align-items:center;gap:.35rem;position:fixed;right:14px;bottom:14px;z-index:62;background:var(--ink);color:var(--paper);border:1px solid var(--ink);padding:.7rem 1.1rem;border-radius:999px;box-shadow:var(--shadow-lg);font-weight:600;font-size:.88rem}.rota-side-toggle:hover{background:#000;color:var(--paper)}}@keyframes fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}.policy-gate-back{position:fixed;top:0;right:0;bottom:0;left:0;background:#0a0a0a94;z-index:200;display:flex;align-items:center;justify-content:center;padding:16px;animation:fadeIn .18s var(--ease) both}.policy-gate{width:min(680px,100%);max-height:92vh;background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;overflow:hidden}.policy-gate-head{padding:var(--space-4) var(--space-5);border-bottom:1px solid var(--line)}.policy-gate-body{padding:var(--space-4) var(--space-5);overflow-y:auto;flex:1;line-height:1.5;font-size:.82rem}.policy-gate-body p{color:var(--ink-2);margin:0 0 8px;max-width:none}.policy-gate-foot{padding:var(--space-3) var(--space-5);border-top:1px solid var(--line);background:var(--surface-2)}.policy-h1{font-size:1.05rem;font-weight:700;margin:0 0 4px;letter-spacing:-.01em;color:var(--ink);text-transform:none}.policy-h2{font-size:.86rem;font-weight:700;margin:14px 0 4px;letter-spacing:0;color:var(--ink);text-transform:none}.policy-em{color:var(--muted);font-size:.76rem;font-style:italic;margin-bottom:10px}.policy-list{padding-left:18px;margin:4px 0 8px}.policy-list li{margin-bottom:3px;color:var(--ink-2);line-height:1.45}@media (max-width: 720px){.policy-gate{max-height:96vh}.policy-gate-head,.policy-gate-body,.policy-gate-foot{padding:var(--space-3) var(--space-4)}}.lazy-placeholder{background:linear-gradient(135deg,var(--surface-2) 0%,var(--paper) 50%,var(--surface-2) 100%);background-size:200% 200%;border:1px solid var(--line-soft);border-radius:var(--radius);margin-bottom:var(--space-3);animation:lazy-shimmer 2.4s ease-in-out infinite}@keyframes lazy-shimmer{0%,to{background-position:0% 50%}50%{background-position:100% 50%}}@media (prefers-reduced-motion: reduce){.lazy-placeholder{animation:none}}.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:var(--space-5);margin-bottom:var(--space-4);box-shadow:var(--shadow-sm)}.card-header{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--space-3);margin-bottom:var(--space-3)}.card-title{font-size:.98rem;font-weight:700;margin:0;color:var(--ink);letter-spacing:-.005em}.card-subtitle{color:var(--muted);font-size:.8rem;margin-top:3px;font-weight:400}.grid{display:grid;gap:var(--space-3)}.grid-2{grid-template-columns:1fr 1fr}.grid-3{grid-template-columns:repeat(3,1fr)}.grid-4{grid-template-columns:repeat(4,1fr)}@media (max-width: 900px){.grid-2,.grid-3,.grid-4{grid-template-columns:1fr}}.badge{display:inline-flex;align-items:center;gap:.25rem;padding:.15rem .5rem;border-radius:999px;font-size:.7rem;font-weight:600;background:var(--paper);color:var(--ink);border:1px solid var(--hairline);line-height:1.3;white-space:nowrap;text-transform:uppercase;letter-spacing:.04em}.badge.solid{background:var(--ink);color:var(--paper);border-color:var(--ink)}.badge.outline{background:var(--paper);color:var(--ink);border-color:var(--ink)}.badge.muted{color:var(--muted);border-color:var(--line)}.badge.ok,.badge.info,.badge.accent{background:var(--ink);color:var(--paper);border-color:var(--ink)}.badge.warn{background:var(--paper);color:var(--ink);border-color:var(--ink)}.badge.danger{background:var(--paper);color:var(--ink);border:1px dashed var(--ink)}.grade-pill{font-weight:700;font-size:.7rem;padding:.1rem .5rem;border-radius:3px;color:var(--ink);background:var(--surface-2);border:1px solid var(--hairline);letter-spacing:.03em}.grade-ST1{background:var(--paper)}.grade-ST2{background:var(--surface-2)}.grade-ST3{background:var(--surface-3)}.grade-ST4{background:#dcdcdc}.grade-ST5{background:var(--ink);color:var(--paper);border-color:var(--ink)}.grade-ST6{background:#000;color:var(--paper);border-color:#000}.alert{padding:.7rem .9rem;border-radius:var(--radius-sm);font-size:.86rem;margin-bottom:var(--space-3);border:1px solid var(--hairline);background:var(--paper);color:var(--ink);display:flex;gap:.5rem;align-items:flex-start}.alert:before{content:"";flex:none;width:3px;align-self:stretch;background:var(--ink);border-radius:2px}.alert.error{background:var(--paper);border-color:var(--ink)}.alert.error:before{background:var(--ink)}.alert.info{background:var(--surface-2)}.alert.info:before{background:var(--ink-3)}.alert.ok{background:var(--surface-2)}.alert.ok:before{background:var(--ink)}.alert.warn{background:var(--paper);border-style:dashed}.alert.warn:before{background:var(--ink)}.col-center{text-align:center}.col-right{text-align:right}.ladder-table td{vertical-align:middle}.ladder-table .mono{letter-spacing:0}.table-responsive{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;margin-right:-1px}table{width:100%;border-collapse:separate;border-spacing:0;font-size:.88rem;background:transparent}th,td{padding:.55rem .75rem;border-bottom:1px solid var(--line);text-align:left;vertical-align:middle}th{font-weight:600;color:var(--muted);text-transform:uppercase;font-size:.7rem;letter-spacing:.08em;background:var(--surface-2);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:1}tr:last-child td{border-bottom:none}tr:hover td{background:var(--surface-2)}.rota-wrap{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);overflow:auto;-webkit-overflow-scrolling:touch}.rota-grid{display:grid;gap:1px;background:var(--line);min-width:720px}@media (max-width: 720px){.page{padding:var(--space-2) var(--space-2) var(--space-8)}.rota-wrap{border-radius:var(--radius-sm)}.rota-grid{min-width:0;--rota-label-col: 54px;--rota-day-col: minmax(22px, 1fr)}.rota-cell{padding:2px 3px;font-size:.66rem;min-height:26px;gap:1px}.rota-cell.header{font-size:.54rem;letter-spacing:.02em;padding:2px 3px}.rota-cell.header .date{font-size:.54rem}.rota-cell.header .bh{font-size:.52rem}.rota-cell.label{font-size:.5rem;padding:3px 4px;letter-spacing:.02em;white-space:normal;word-break:break-word;line-height:1.05}.shift-chip,.block-chip{font-size:.6rem;padding:0 2px;gap:1px;min-height:20px;border-radius:3px}.chip-swatch{width:6px;height:6px}.shift-chip .muted,.block-chip .muted,.block-chip .swap-hint{display:none}.teaching-badge{padding:0 2px;font-size:.42rem;letter-spacing:.02em}.swap-history-icon{width:11px;height:11px}.swap-history-icon svg{width:8px;height:8px}}@media (max-width: 420px){.rota-grid{--rota-label-col: 44px;--rota-day-col: minmax(18px, 1fr)}.rota-cell{padding:2px;font-size:.6rem}.rota-cell.label{font-size:.46rem;padding:2px 3px}.shift-chip,.block-chip{font-size:.56rem;padding:0 1px;min-height:18px}}.rota-cell{background:var(--paper);padding:.35rem .5rem;font-size:.74rem;min-height:36px;display:flex;flex-direction:column;gap:2px}.rota-cell.header{background:var(--surface-2);font-weight:700;font-size:.7rem;color:var(--ink);text-transform:uppercase;letter-spacing:.06em}.rota-cell.header .date{color:var(--muted);font-size:.66rem;font-weight:500;text-transform:none;letter-spacing:0}.rota-cell.header .bh{color:var(--ink);font-size:.66rem;font-weight:600;text-transform:none}.rota-cell.weekend{background:var(--surface-2)}.rota-cell.bh{background:repeating-linear-gradient(135deg,var(--surface-2) 0 6px,var(--paper) 6px 12px)}.rota-cell.label{background:var(--surface-2);color:var(--ink);font-weight:700;font-size:.62rem;text-transform:uppercase;letter-spacing:.06em;text-align:left;justify-content:center;padding:.35rem .55rem;border-right:1px solid var(--line);line-height:1.15}.rota-cell.label.cat-duty{background:#f2f2f2}.rota-cell.label.cat-oncall{background:#ebebeb}.rota-cell.label.cat-us{background:#e3e3e3}.rota-cell.label.cat-teach{background:#f5f5f5}.rota-cell.derived{color:var(--muted);font-size:.72rem;font-style:normal;background:var(--paper)}.rota-cell.derived .derived-inner{font-family:var(--font-mono);font-size:.72rem;color:var(--ink-3)}.block-chip{background:var(--paper);border:1px solid var(--ink);border-radius:var(--radius-sm);padding:.28rem .45rem;font-weight:600;font-size:.72rem;cursor:pointer;display:flex;align-items:center;gap:.35rem;transition:background .1s var(--ease);line-height:1.2;min-height:28px;width:100%;overflow:hidden}.block-chip>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.block-chip:hover{background:var(--surface-2)}.block-chip.selected{background:var(--ink);color:var(--paper);border-color:var(--ink)}.block-chip.selected .swap-hint{color:var(--paper)}.block-chip.empty{color:var(--muted);font-weight:500;font-size:.68rem;font-style:italic;border:1px dashed var(--hairline);padding:.2rem .4rem;min-height:22px;background:transparent}.block-chip.empty:hover{border-color:var(--ink);color:var(--ink)}.block-chip .swap-hint{color:var(--muted);font-size:.7rem;font-weight:400;margin-left:auto}.shift-chip{display:inline-flex;align-items:center;gap:.28rem;background:var(--paper);padding:.16rem .38rem;border-radius:3px;cursor:pointer;transition:background .1s var(--ease);font-weight:500;font-size:.7rem;border:1px solid var(--hairline);line-height:1.2;max-width:100%;overflow:hidden}.shift-chip>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.shift-chip.empty{font-size:.66rem;padding:.1rem .35rem;border-style:dashed;border-color:var(--hairline);color:var(--muted);background:transparent;font-style:italic;font-weight:500}.shift-chip.empty:hover{border-color:var(--ink);color:var(--ink)}.shift-chip:hover{background:var(--surface-2);border-color:var(--ink)}.shift-chip.empty{color:var(--muted);font-style:italic;border-style:dashed}.chip-swatch{display:inline-block;width:8px;height:8px;border-radius:50%;box-shadow:inset 0 0 0 1px #00000040;flex:none}.pref-cell{padding:.5rem;border-radius:var(--radius-sm);text-align:center;cursor:pointer;font-weight:700;font-size:.72rem;text-transform:uppercase;letter-spacing:.04em;border:1px solid var(--hairline);transition:all .12s var(--ease);-webkit-user-select:none;user-select:none;background:var(--paper);color:var(--muted)}.pref-cell.PREFER{background:var(--ink);color:var(--paper);border-color:var(--ink)}.pref-cell.AVOID{background:var(--paper);color:var(--ink);border:1px dashed var(--ink)}.pref-cell.NEUTRAL{background:var(--paper);color:var(--muted)}.pref-cell:hover{border-color:var(--ink)}.pref-cell:focus-visible{outline:2px solid var(--ink);outline-offset:2px}.rota-cell.pref-cell{font-family:inherit}.swatch{display:inline-block;width:12px;height:12px;border-radius:50%;vertical-align:middle;box-shadow:inset 0 0 0 1px #0006}.swatch-picker{display:grid;grid-template-columns:repeat(8,1fr);gap:8px}.swatch-picker .swatch-btn{width:100%;height:30px;border-radius:6px;border:2px solid transparent;cursor:pointer;position:relative;transition:transform .08s var(--ease);box-shadow:inset 0 0 0 1px #00000040;padding:0}.swatch-picker .swatch-btn:hover{transform:scale(1.05)}.swatch-picker .swatch-btn.selected{border-color:var(--ink);box-shadow:0 0 0 2px var(--paper),0 0 0 3px var(--ink)}.swatch-picker .swatch-btn.taken{opacity:.2;cursor:not-allowed;filter:grayscale(.6)}.swatch-picker .swatch-btn.taken:after{content:"×";position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;color:#000000b3;font-weight:700}.day-row{display:flex;gap:.5rem;flex-wrap:wrap}.day-btn{flex:1 0 auto;min-width:64px;padding:.55rem .8rem;text-align:center;font-weight:500;font-size:.82rem}.calendar{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;background:var(--line);border:1px solid var(--line);border-radius:var(--radius);padding:2px;-webkit-user-select:none;user-select:none}.calendar .cal-head{background:var(--surface-2);color:var(--muted);padding:.45rem 0;text-align:center;font-size:.68rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.calendar .cal-day{background:var(--paper);min-height:46px;padding:4px 6px;font-size:.82rem;display:flex;flex-direction:column;gap:2px;align-items:flex-start;cursor:pointer;position:relative;transition:background .08s var(--ease);border:none;color:inherit;text-align:left;font-family:inherit;font-weight:500;width:100%;border-radius:0}.calendar .cal-day:disabled{opacity:.3;cursor:not-allowed}.calendar .cal-day:focus-visible{outline:2px solid var(--ink);outline-offset:-2px}.calendar .cal-day:hover{background:var(--surface-2)}.calendar .cal-day.muted-month{color:var(--faint);background:var(--surface-2)}.calendar .cal-day.weekend{background:var(--surface-2)}.calendar .cal-day.today{outline:1px solid var(--ink);outline-offset:-3px}.calendar .cal-day.selected{background:var(--ink);color:var(--paper)}.calendar .cal-day.selected .cat-tag{color:var(--paper);border-color:var(--paper)}.calendar .cal-day.in-range{background:var(--ink-3);color:var(--paper)}.calendar .cal-day .num{font-weight:600;font-size:.78rem}.calendar .cal-day .cat-tag{font-size:.62rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;border:1px solid var(--hairline);border-radius:3px;padding:1px 4px;align-self:flex-start;color:var(--ink)}.calendar-header{display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem}.calendar-header .month-label{font-weight:700;font-size:1rem;flex:1}.leave-range-row{display:flex;align-items:center;gap:.75rem;padding:.55rem .75rem;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--paper);margin-bottom:6px}.leave-range-row .cat{font-size:.68rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;border:1px solid var(--ink);padding:1px 6px;border-radius:3px}.leave-range-row .dates{font-family:var(--font-mono);font-size:.85rem;flex:1}.leave-range-row .count{color:var(--muted);font-size:.8rem}.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:var(--space-6);background:var(--bg)}.login-card{width:100%;max-width:400px;background:var(--paper);padding:var(--space-8);border-radius:var(--radius-lg);border:1px solid var(--line);box-shadow:var(--shadow)}.login-brand{font-size:1.6rem;font-weight:800;letter-spacing:-.025em;color:var(--ink);margin:0 0 var(--space-1) 0;display:flex;align-items:center;gap:.5rem}.login-brand .mark{width:20px;height:20px;background:var(--ink);border-radius:3px;display:inline-block}.login-sub{color:var(--muted);font-size:.85rem;margin:0 0 var(--space-3) 0}.login-lede{color:var(--ink-3);font-size:.78rem;line-height:1.45;margin:0 0 var(--space-6) 0}.stat-card{padding:var(--space-4) var(--space-5);border-radius:var(--radius);background:var(--paper);border:1px solid var(--line);position:relative;box-shadow:var(--shadow-sm)}.stat-card:before{content:"";position:absolute;top:0;left:0;width:3px;height:100%;background:var(--ink);border-top-left-radius:var(--radius);border-bottom-left-radius:var(--radius)}.stat-label{font-size:.68rem;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.stat-value{font-size:1.7rem;font-weight:700;letter-spacing:-.02em;color:var(--ink);margin-top:2px;line-height:1.15}.stat-sub{font-size:.78rem;color:var(--muted);margin-top:3px}.hstack{display:flex;gap:var(--space-3);align-items:center}.vstack{display:flex;flex-direction:column;gap:var(--space-3)}.spacer{flex:1}.mono{font-family:var(--font-mono);font-size:.82em;color:var(--ink-3)}.muted{color:var(--muted);font-size:.82rem}.tight{margin:0}.hr{height:1px;background:var(--line);margin:var(--space-4) 0;border:none}.empty{padding:var(--space-10) var(--space-6);text-align:center;color:var(--muted)}.empty .icon{font-size:1.5rem;margin-bottom:var(--space-3);opacity:.6;font-weight:700;letter-spacing:-.02em}.empty h3{color:var(--ink);margin-bottom:var(--space-2);text-transform:none;letter-spacing:-.01em;font-size:1rem;font-weight:600}.live-dot{display:inline-flex;align-items:center;gap:.35rem;font-size:.72rem;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-weight:600}.live-dot:before{content:"";width:8px;height:8px;border-radius:50%;background:var(--hairline)}.live-dot.on:before{background:var(--ink);animation:pulse 2s infinite}.live-dot.off:before{background:var(--hairline)}.live-dot.err:before{background:var(--ink);opacity:.4}@keyframes pulse{0%{box-shadow:0 0 #00000040}70%{box-shadow:0 0 0 6px #0000}to{box-shadow:0 0 #0000}}.info-popover{position:fixed;z-index:200;width:360px;max-width:calc(100vw - 16px);background:var(--paper);border:1px solid var(--ink);border-radius:6px;padding:12px 14px;font-size:13px;color:var(--ink);box-shadow:var(--shadow);line-height:1.45}.info-popover-title{font-weight:700;letter-spacing:.02em;font-size:12px;text-transform:uppercase;color:var(--muted);margin-bottom:8px}.info-popover-body{color:var(--ink-2)}.info-popover-body p{margin:4px 0;color:var(--ink-2)}.info-popover-body ul,.info-popover-body ol{padding-left:18px;margin:4px 0}.modal-back{position:fixed;top:var(--nav-height);left:0;right:0;bottom:0;background:#0000006b;z-index:100;display:flex;align-items:flex-start;justify-content:center;padding:24px 20px;overflow-y:auto;overscroll-behavior:contain}.modal{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-lg);width:540px;max-width:100%;max-height:calc(100vh - var(--nav-height) - 48px);display:flex;flex-direction:column;overflow:hidden;animation:modal-pop .14s var(--ease) both}.modal-head{flex:none;padding:18px 22px 14px;border-bottom:1px solid var(--line);display:flex;align-items:flex-start;gap:12px;background:var(--paper)}.modal-head>:first-child{flex:1;min-width:0}.modal-body{flex:1 1 auto;overflow-y:auto;padding:18px 22px;min-height:0}.modal-body>*:first-child{margin-top:0}.modal-body>*:last-child{margin-bottom:0}.modal-foot{flex:none;padding:14px 22px;border-top:1px solid var(--line);background:var(--surface-2)}@keyframes modal-pop{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:none}}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:var(--bg)}::-webkit-scrollbar-thumb{background:var(--hairline);border-radius:6px;border:2px solid var(--bg)}::-webkit-scrollbar-thumb:hover{background:var(--muted)}.stat-card-link{text-decoration:none;color:inherit;display:flex}.stat-card-link .stat-card{flex:1}.stat-card-link:hover .stat-card{border-color:var(--ink)}.next-step-card{background:var(--paper);border:2px solid var(--ink);border-radius:var(--radius);padding:var(--space-5);margin-bottom:var(--space-5)}.next-step-label{font-size:.72rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.next-step-head{font-size:1.25rem;font-weight:700;margin:2px 0 6px;color:var(--ink);letter-spacing:-.01em}.next-step-card p{color:var(--ink-3);margin:4px 0 0}.btn-link{text-decoration:none}.btn-link button{font:inherit}.open-prefs-cta{display:block;text-decoration:none;margin-bottom:var(--space-5);background:var(--paper);color:var(--ink);border:2px solid var(--ink);border-radius:var(--radius);transition:background .12s var(--ease)}.open-prefs-cta:hover{background:var(--surface-2);text-decoration:none}.open-prefs-cta.urgent{background:var(--ink);color:var(--paper)}.open-prefs-cta.urgent:hover{background:#000}.open-prefs-body{display:flex;align-items:center;gap:var(--space-4);padding:var(--space-4) var(--space-5);flex-wrap:wrap}.open-prefs-body>div:first-child{flex:1;min-width:220px}.open-prefs-body .eyebrow{font-size:.7rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;opacity:.75}.open-prefs-body .headline{font-size:1.2rem;font-weight:700;margin-top:2px}.open-prefs-body .sub{font-size:.88rem;opacity:.85;margin-top:2px}.open-prefs-cta .ghost-invert{background:var(--paper);color:var(--ink);border-color:var(--paper)}.open-prefs-cta .ghost-invert:hover{background:var(--surface-2)}.btn-full{width:100%;justify-content:center}.table-actions{text-align:right;white-space:nowrap}.info-list{padding-left:18px;margin:4px 0 8px}.card-box{padding:10px 12px;border:1px solid var(--line);border-radius:6px;background:var(--paper)}.mt-3{margin-top:12px}.mt-4{margin-top:16px}.mb-3{margin-bottom:12px}.mb-4{margin-bottom:16px}.hstack-wrap{display:flex;gap:var(--space-3);align-items:center;flex-wrap:wrap}.ghost:focus-visible,.segmented button:focus-visible,.swatch-btn:focus-visible{outline:2px solid var(--ink);outline-offset:2px}.segmented button:focus-visible{outline-offset:-2px}.rota-page.swap-active .rota-wrap{outline:2px solid var(--ink);outline-offset:-2px;border-radius:var(--radius)}.rota-page.swap-active .rota-side .card{border-color:var(--ink)}.shift-chip.selectable,.block-chip.selectable{background:var(--paper);border-color:var(--ink);color:var(--ink);box-shadow:0 0 0 2px #0a0a0a14;cursor:pointer}.shift-chip.selectable:hover,.block-chip.selectable:hover{background:var(--ink);color:var(--paper)}.shift-chip.dim,.block-chip.dim{background:var(--surface-2);border-color:var(--line);color:var(--faint);cursor:not-allowed;opacity:.5;box-shadow:none}.shift-chip.dim .chip-swatch,.block-chip.dim .chip-swatch{filter:grayscale(1) opacity(.45)}.rota-page.swap-active .shift-chip.empty,.rota-page.swap-active .block-chip.empty{opacity:.4}.card.this-week{border-color:var(--ink);border-width:2px;box-shadow:0 0 0 4px #0000000a}.rota-cell.header.today-col{position:relative;background:var(--surface-2)}.rota-cell.header.today-col:before{content:"";position:absolute;top:0;left:6px;right:6px;height:3px;background:var(--ink);border-radius:0 0 2px 2px}.rota-cell.header.today-col .today-tag{font-size:.58rem;font-weight:800;letter-spacing:.06em;color:var(--ink);text-transform:uppercase}.past-weeks-divider{margin-top:var(--space-8);padding-top:var(--space-4);border-top:1px dashed var(--hairline)}.past-weeks-divider h2{font-weight:700;color:var(--muted);font-size:1rem;margin-bottom:var(--space-1)}.past-weeks-divider p{font-size:.82rem;margin-bottom:var(--space-3)}.past-week .card,.card.read-only-week{opacity:.6;filter:grayscale(.3)}.card.read-only-week .shift-chip,.card.read-only-week .block-chip{cursor:default}.prefs-intro{margin-bottom:var(--space-4);padding:var(--space-4) var(--space-5);border:1px solid var(--line);border-radius:var(--radius);background:var(--surface-2)}.prefs-intro p{margin:0 0 .5rem;color:var(--ink-2);font-size:.92rem}.prefs-intro p:last-child{margin-bottom:0}.deadline-banner{margin-bottom:var(--space-4);padding:var(--space-4) var(--space-5);border:2px solid var(--ink);border-radius:var(--radius);background:var(--paper);display:flex;flex-direction:column;gap:4px}.deadline-banner.urgent{background:var(--ink);color:var(--paper)}.deadline-banner.urgent .deadline-label,.deadline-banner.urgent .deadline-when,.deadline-banner.urgent .deadline-sub b{color:var(--paper)}.deadline-banner.locked{border-style:dashed;background:var(--surface-2)}.deadline-main{display:flex;align-items:baseline;gap:var(--space-3);flex-wrap:wrap}.deadline-label{font-size:.72rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.deadline-when{font-size:1.1rem;font-weight:700;color:var(--ink);letter-spacing:-.01em}.deadline-sub{font-size:.85rem;color:var(--ink-3)}.email-pref-list{display:flex;flex-direction:column;gap:4px;margin-top:6px}.email-pref-row{display:grid;grid-template-columns:24px minmax(0,1fr);gap:12px;align-items:flex-start;padding:8px 10px;border-radius:var(--radius-sm);cursor:pointer}.email-pref-row:hover{background:var(--surface-2)}.email-pref-row input[type=checkbox]{margin-top:2px;width:auto}.email-pref-label{font-weight:600;color:var(--ink);font-size:.9rem}.email-pref-hint{font-size:.78rem;margin-top:1px}.admin-quicklinks{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:8px;margin:var(--space-3) 0 var(--space-4)}.admin-quicklink{display:flex;flex-direction:column;gap:2px;padding:10px 14px;background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);text-decoration:none;transition:border-color .12s var(--ease),transform .08s var(--ease)}.admin-quicklink:hover{border-color:var(--ink);text-decoration:none;transform:translateY(-1px)}.admin-quicklink-label{font-weight:700;color:var(--ink);letter-spacing:-.005em;font-size:.92rem}.admin-quicklink-sub{color:var(--muted);font-size:.72rem}.swap-history-icon{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;margin-left:3px;border-radius:50%;background:var(--paper);color:var(--ink);line-height:1;cursor:pointer;border:1px solid var(--ink);flex:none;transition:background .12s var(--ease),color .12s var(--ease),transform .12s var(--ease)}.swap-history-icon svg{width:10px;height:10px;display:block}.swap-history-icon:hover{background:var(--ink);color:var(--paper);transform:rotate(-12deg)}.swap-history-icon:focus-visible{outline:2px solid var(--ink);outline-offset:1px}.swap-history-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:6px}.swap-history-row{display:grid;grid-template-columns:34px minmax(0,1fr) auto;gap:10px;padding:8px 10px;background:var(--surface-2);border:1px solid var(--line);border-radius:var(--radius-sm);align-items:center}.swap-history-step{font-family:var(--font-mono);font-size:.72rem;color:var(--muted);font-weight:700}.swap-history-names{font-size:.88rem}.swap-history-when{font-size:.76rem;color:var(--muted);white-space:nowrap}.teaching-badge{display:inline-flex;align-items:center;padding:1px 4px;border:1px solid var(--ink);border-radius:3px;font-size:.52rem;font-weight:800;letter-spacing:.06em;text-transform:uppercase;background:var(--ink);color:var(--paper);line-height:1.3;flex:none}.shift-chip.teaching,.block-chip.teaching{background:repeating-linear-gradient(45deg,var(--surface-2) 0 6px,var(--paper) 6px 12px);border-color:var(--ink)}.locum-badge{display:inline-flex;align-items:center;padding:1px 5px;border:1px dashed var(--ink);border-radius:3px;font-size:.58rem;font-weight:800;letter-spacing:.07em;text-transform:uppercase;background:var(--paper);color:var(--ink);line-height:1.3;flex:none}.shift-chip.primary .locum-badge,.block-chip[style*=ink] .locum-badge{background:var(--paper);color:var(--ink)}.tk-attribution{margin-top:var(--space-5);padding-top:var(--space-3);border-top:1px dashed var(--line);text-align:center;color:var(--faint);font-size:.72rem;letter-spacing:.04em;text-transform:uppercase}.tk-attribution b{color:var(--ink-3);font-weight:600;letter-spacing:0;text-transform:none}.tk-footprint{margin-top:var(--space-8);padding:var(--space-4) 0 0;border-top:1px solid var(--line-soft);color:var(--faint);font-size:.72rem;letter-spacing:.04em;display:flex;justify-content:space-between;gap:var(--space-3)}.tk-footprint b{color:var(--ink-3);font-weight:600}.tk-spinner{display:inline-block;width:12px;height:12px;border-radius:50%;border:2px solid currentColor;border-top-color:transparent;animation:tk-spin .7s linear infinite;vertical-align:-2px}@keyframes tk-spin{to{transform:rotate(360deg)}}.share-btn{display:inline-flex;align-items:center;gap:.35rem;padding:.3rem .55rem;font-size:.78rem;font-weight:500;background:transparent;color:var(--ink-3);border:1px solid var(--hairline);border-radius:var(--radius-sm);cursor:pointer;flex:none}.share-btn:hover{background:var(--surface-2);border-color:var(--ink);color:var(--ink)}.share-btn svg{width:14px;height:14px;flex:none}.tk-toast-stack{position:fixed;top:68px;right:16px;z-index:210;display:flex;flex-direction:column;gap:8px;pointer-events:none}.tk-toast{background:var(--ink);color:var(--paper);padding:.55rem .85rem;border-radius:6px;font-size:.85rem;box-shadow:var(--shadow);animation:toast-in .18s var(--ease) both;pointer-events:auto;cursor:pointer;max-width:360px}.tk-toast-ok{background:var(--ink);color:var(--paper)}.tk-toast-error{background:#111;color:#fff;border-left:3px solid #c62828}.tk-toast-info{background:var(--surface-3);color:var(--ink);border:1px solid var(--hairline)}@keyframes toast-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}kbd{font-family:var(--font-mono);font-size:.72rem;padding:1px 5px;border:1px solid var(--hairline);border-bottom-width:2px;border-radius:3px;background:var(--paper);color:var(--ink-3)}
