.roster-grid{--row-label:22px;--row-sub:16px;--row-cell:24px;--name-w:96px;--day-min:110px;--in-fr:1fr;--out-fr:1fr;--code-fr:1.1fr;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;background:#fff;border:1px solid #c8c8c8;border-radius:6px;width:100%;max-width:100%;display:block;overflow:auto}.rg-week{width:100%;min-width:calc(var(--name-w) + 7 * var(--day-min));border-bottom:2px solid #bdbdbd;display:flex}.rg-week:last-child{border-bottom:none}.rg-names{width:var(--name-w);min-width:var(--name-w);z-index:3;box-sizing:border-box;background:#f3f3f3;border-right:1px solid #c8c8c8;flex-direction:column;display:flex;position:sticky;left:0}.rg-corner-week{height:var(--row-label);box-sizing:border-box;background:#ececec;border-bottom:1px solid #d0d0d0;flex-shrink:0;align-items:baseline;gap:.35rem;padding:0 .5rem;display:flex}.rg-corner-eyebrow{letter-spacing:.08em;text-transform:uppercase;color:#777;font-size:.62rem;font-weight:700}.rg-corner-range{color:#222;white-space:nowrap;text-overflow:ellipsis;font-size:.68rem;font-weight:700;overflow:hidden}.rg-staff-head{height:var(--row-sub);letter-spacing:.08em;text-transform:uppercase;color:#666;box-sizing:border-box;background:#e8e8e8;border-bottom:1px solid #d0d0d0;flex-shrink:0;align-items:center;padding:0 .5rem;font-size:.62rem;font-weight:700;display:flex}.rg-block,.rg-spacer{height:var(--row-label);letter-spacing:.07em;text-transform:uppercase;color:#555;box-sizing:border-box;background:#e4e4e4;border-bottom:1px solid #d0d0d0;flex-shrink:0;align-items:center;padding:0 .5rem;font-size:.66rem;font-weight:700;display:flex}.rg-block.doctors-block{color:#1a3a52;background:#c5d6e4;border-bottom-color:#a8bdcf}.rg-block.nurses-block{color:#3a4a3a;background:#d8e0d6;border-bottom-color:#bcc9bb}.rg-spacer{padding:0}.rg-name{height:var(--row-cell);color:#111;box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;text-transform:uppercase;background:#f7f7f7;border-bottom:1px solid #e0e0e0;flex-shrink:0;align-items:center;padding:0 .5rem;font-size:.72rem;font-weight:700;display:flex;overflow:hidden}.rg-name.doctor{color:#0f2a3d;background:#e4eef6;border-bottom-color:#c5d6e4;border-left:3px solid #2a5f7a;padding-left:calc(.5rem - 3px);font-weight:800}.rg-name.nurse{color:#1a2a1a;background:#f3f5f2;border-bottom-color:#dde3da}.rg-days{flex:auto;min-width:0;display:flex}.rg-day{width:0;min-width:var(--day-min);box-sizing:border-box;background:#fff;border-left:1px solid #d8d8d8;flex-direction:column;flex:1 1 0;display:flex}.rg-day.outside{background:#f7f7f7}.rg-day.outside .rg-day-head,.rg-day.outside .rg-subheads{color:#aaa;background:#efefef}.rg-day.outside .rg-dow,.rg-day.outside .rg-date{color:#bbb}.rg-tri.outside-slot{pointer-events:none;background:#f7f7f7;border-bottom-color:#ececec}.rg-day.has-gap{box-shadow:inset 0 0 0 1.5px #8a1f1f}.rg-day.has-extra{box-shadow:inset 0 0 0 1.5px #2f6b3a}.rg-day.has-gap.has-extra{box-shadow:inset 0 0 0 1.5px #8a1f1f}.rg-day-head{height:var(--row-label);box-sizing:border-box;background:#ececec;border-bottom:1px solid #d0d0d0;flex-shrink:0;justify-content:center;align-items:center;gap:.35rem;padding:0 4px;display:flex}.rg-day-head.staff-short{color:#5c1010;background:#f3d6d6}.rg-day-head.staff-extra{color:#1e4d28;background:#d9ebdd}.rg-day-head.staff-closed{color:#777;background:#ececec}.rg-dow{letter-spacing:.04em;font-size:.68rem;font-weight:800}.rg-date{color:#444;font-size:.68rem;font-weight:600}.rg-day-head.staff-short .rg-date,.rg-day-head.staff-extra .rg-date{color:inherit}.staff-chip{letter-spacing:.02em;font-variant-numeric:tabular-nums;border-radius:2px;flex-shrink:0;padding:1px 4px;font-size:.58rem;font-weight:800;line-height:1.1}.staff-chip.short{color:#fff;background:#8a1f1f}.staff-chip.extra{color:#fff;background:#2f6b3a}.rg-subheads{height:var(--row-sub);grid-template-columns:var(--in-fr) var(--out-fr) var(--code-fr);box-sizing:border-box;background:#e8e8e8;border-bottom:1px solid #d0d0d0;flex-shrink:0;display:grid}.rg-subheads span{letter-spacing:.06em;text-transform:uppercase;color:#666;box-sizing:border-box;border-left:1px solid #d5d5d5;justify-content:center;align-items:center;font-size:.58rem;font-weight:700;display:flex}.rg-subheads span:first-child{border-left:none}.rg-tri{height:var(--row-cell);min-height:var(--row-cell);max-height:var(--row-cell);cursor:pointer;color:#111;box-sizing:border-box;background:#fff;border:none;border-bottom:1px solid #e4e4e4;border-radius:0;flex-shrink:0;width:100%;margin:0;padding:0;font-family:inherit;overflow:hidden}.rg-tri.work{grid-template-columns:var(--in-fr) var(--out-fr) var(--code-fr);display:grid}.rg-tri.span{justify-content:center;align-items:center;display:flex}.rg-tri:hover:not(.empty){filter:brightness(.93)}.rg-tri.doctor.cell-work,.rg-tri.doctor.work{background:#eef5fa}.rg-tri.nurse.cell-work,.rg-tri.nurse.work{background:#fafafa}.rg-tri.selected{outline-offset:-2px;z-index:1;outline:2px solid #111}.rg-tri.empty{cursor:default;background:0 0}.rg-tri.empty.doctor{background:#f3f7fa}.rg-tri.empty.nurse{background:#f7f7f7}.rg-tri.cell-off{color:#1f5c28;background:#d8ecd4}.rg-tri.cell-ro{color:#1a3a5c;background:#d6e4f0}.rg-tri.cell-al{color:#5c2e0a;background:#f0c090}.rg-tri.cell-ph{color:#3a2a55;background:#c9b6de}.rg-tri.cell-mc{color:#1a5c4e;background:#b8ddd4}.rg-tri.cell-ul{color:#6b1f1f;background:#e5b0b0}.rg-tri.reception.cell-work .rg-code{background:#eef3f7}.rg-tri.sterilisation.cell-work .rg-code{background:#f0edf5}.rg-in,.rg-out,.rg-code{box-sizing:border-box;border-left:1px solid #e8e8e8;justify-content:center;align-items:center;min-width:0;height:100%;display:flex}.rg-in{font-variant-numeric:tabular-nums;letter-spacing:-.03em;white-space:nowrap;border-left:none;font-size:.58rem;font-weight:700}.rg-out{font-variant-numeric:tabular-nums;letter-spacing:-.03em;white-space:nowrap;color:#333;font-size:.58rem;font-weight:600}.rg-code{padding:0 2px}.code-badge{color:#333;white-space:nowrap;text-overflow:ellipsis;background:#e8e8e8;border:1px solid #bbb;border-radius:2px;max-width:100%;padding:1px 2px;font-size:.52rem;font-weight:700;line-height:1;overflow:hidden}.rg-tri.assistant.cell-work .code-badge{background:#fff;border-color:#888}.rg-status{letter-spacing:.04em;text-transform:uppercase;font-size:.64rem;font-weight:800}@media (width<=1099px){.roster-grid{--name-w:84px;--day-min:100px}.rg-name{font-size:.68rem}.rg-in,.rg-out{font-size:.58rem}}@media (width<=768px){.roster-grid{--name-w:72px;--day-min:92px;--row-cell:28px}.rg-name{font-size:.62rem}}.person-roster{flex-direction:column;gap:1rem;min-height:0;display:flex;overflow:hidden}.person-roster>.person-picker{flex:none}.person-roster>.person-weeks{-webkit-overflow-scrolling:touch;overscroll-behavior:contain;flex:auto;min-height:0;padding-bottom:.5rem;overflow:hidden auto}.person-empty{color:var(--muted);margin:0;padding:1.5rem}.person-picker{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);flex-wrap:wrap;justify-content:space-between;align-items:end;gap:1rem;padding:.85rem 1rem;display:flex}.person-picker label{text-transform:uppercase;letter-spacing:.06em;color:var(--muted);flex-direction:column;gap:.35rem;font-size:.72rem;display:flex}.person-picker select{font:inherit;text-transform:none;letter-spacing:0;color:var(--ink);border:1px solid var(--line);background:#fff;border-radius:8px;min-width:12rem;padding:.45rem .65rem;font-size:1rem;font-weight:700}.person-stats{color:var(--muted);flex-wrap:wrap;gap:.85rem 1.25rem;font-size:.85rem;display:flex}.person-stats strong{color:var(--ink);font-weight:700}.person-weeks{flex-direction:column;gap:1rem;display:flex}.person-week{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:.75rem .85rem .9rem}.person-week-head{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:.65rem 1rem;margin-bottom:.65rem;display:flex}.person-week-head h3{letter-spacing:-.01em;margin:0;font-size:.95rem;font-weight:700}.person-week-sum{color:var(--muted);max-width:52ch;margin:.25rem 0 0;font-size:.78rem;line-height:1.35}.person-week-sum strong{color:var(--ink)}.person-week-total{color:var(--muted);flex-direction:column;align-items:flex-end;gap:.1rem;font-size:.72rem;display:flex}.person-week-total strong{color:var(--ink);font-size:1.25rem;font-weight:800;line-height:1}.person-days{grid-template-columns:repeat(7,minmax(0,1fr));gap:.4rem;display:grid}.person-day.outside{opacity:.4;pointer-events:none;background:#f5f5f5;border-style:dashed}@media (width<=900px){.person-days{-webkit-overflow-scrolling:touch;grid-template-columns:repeat(7,minmax(88px,1fr));padding-bottom:.25rem;overflow-x:auto}}@media (width<=768px){.person-picker{flex-direction:column;align-items:stretch;gap:.75rem}.person-picker select{width:100%;min-width:0;min-height:2.75rem;font-size:1.05rem}.person-stats{justify-content:space-between;gap:.5rem}.person-days{grid-template-columns:repeat(7,minmax(96px,1fr));gap:.4rem}.person-day{min-height:5.5rem}.person-week-total strong{font-size:1.1rem}}.person-day{border:1px solid var(--line);cursor:pointer;text-align:left;color:var(--ink);background:#fff;border-radius:10px;flex-direction:column;align-items:flex-start;gap:.2rem;padding:.65rem .7rem;font-family:inherit;display:flex}.person-day:hover:not(.status-empty){filter:brightness(.93)}.person-day.selected{outline-offset:-2px;z-index:1;outline:2px solid #111}.person-day.sun{opacity:.92}.person-day.outside{opacity:.55}.pd-date{text-transform:uppercase;letter-spacing:.04em;color:var(--muted);font-size:.72rem}.pd-label{font-size:.92rem;font-weight:700}.pd-times{flex-direction:column;gap:.1rem;display:flex}.pd-in,.pd-out{font-variant-numeric:tabular-nums;font-size:.88rem;font-weight:700;line-height:1.2}.pd-out{color:#333;font-weight:600}.pd-duty{text-transform:uppercase;letter-spacing:.05em;color:var(--muted);font-size:.68rem}.pd-hours{color:var(--accent);font-size:.72rem;font-weight:700}.person-day.status-work{background:#fff;border-color:#c8c8c8}.person-day.status-off{color:#1f5c28;background:#d8ecd4;border-color:#a8d0a0}.person-day.status-ro{color:#1a3a5c;background:#d6e4f0;border-color:#9bb8d4}.person-day.status-empty{cursor:default;opacity:.45;pointer-events:none;background:0 0;border-style:dashed}.person-day.status-al{color:#5c2e0a;background:#f0c090;border-color:#e0a060}.person-day.status-al .pd-date,.person-day.status-al .pd-duty,.person-day.status-off .pd-date,.person-day.status-off .pd-duty,.person-day.status-ro .pd-date,.person-day.status-ro .pd-duty{color:inherit;opacity:.75}.person-day.status-ph{color:#3a2a55;background:#c9b6de;border-color:#a994c4}.person-day.status-mc{color:#1a5c4e;background:#b8ddd4;border-color:#7ab8aa}.person-day.status-ul{color:#6b1f1f;background:#e5b0b0;border-color:#d09090}:root{--ink:#14110c;--muted:#6b6560;--line:#d8d2c8;--bg:#f6f3ee;--panel:#fff;--accent:#1a3a52;color:var(--ink);background:var(--bg);font-family:Segoe UI,system-ui,sans-serif;line-height:1.4}*{box-sizing:border-box}body{background:radial-gradient(ellipse 80% 50% at 10% -10%, #e8f0f6 0%, transparent 55%), radial-gradient(ellipse 60% 40% at 100% 0%, #f0e8dc 0%, transparent 50%), var(--bg);min-height:100vh;margin:0}#root{min-height:100vh}.app{flex-direction:column;gap:1rem;max-width:1400px;min-height:100vh;margin:0 auto;padding:1rem 1.25rem 2rem;display:flex}.topbar{flex-direction:column;align-items:stretch;gap:.75rem;display:flex}.topbar-main{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.75rem 1.25rem;display:flex}.brand h1{letter-spacing:-.02em;margin:0;font-size:1.35rem;font-weight:800}.controls{flex-wrap:wrap;align-items:center;gap:.5rem;display:flex}.controls label{text-transform:uppercase;letter-spacing:.06em;color:var(--muted);align-items:center;gap:.4rem;font-size:.72rem;font-weight:700;display:flex}.controls label.clinic-pick{flex:0 auto;max-width:14rem}.controls select{font:inherit;border:1px solid var(--line);background:var(--panel);color:var(--ink);border-radius:8px;max-width:11rem;padding:.4rem .55rem;font-size:.85rem;font-weight:700}.month-nav{justify-content:center;align-items:center;gap:.4rem;width:100%;display:flex}.month-nav button{font:inherit;border:1px solid var(--line);background:var(--panel);color:var(--ink);cursor:pointer;border-radius:8px;padding:.4rem .7rem;font-size:.8rem;font-weight:700}.month-nav button:hover{border-color:#111}.month-label{text-align:center;white-space:nowrap;flex:none;min-width:7.5rem;padding:0 .25rem;font-size:.95rem;font-weight:800}.view-toggle{border:1px solid var(--line);background:var(--panel);border-radius:8px;display:inline-flex;overflow:hidden}.view-toggle button{font:inherit;color:var(--muted);cursor:pointer;background:0 0;border:0;padding:.4rem .75rem;font-size:.78rem;font-weight:700}.view-toggle button+button{border-left:1px solid var(--line)}.view-toggle button.on{color:#fff;background:#111}.roster-shell{--surface:#fff;--panel:#fff;--radius:12px;--shadow:none;--accent:#1a3a52;background:var(--panel);border:1px solid var(--line);border-radius:12px;flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden;box-shadow:0 10px 40px #14110c0f}.roster-shell .roster-grid{border:none;border-radius:0;flex:1;max-height:calc(100vh - 8.5rem)}.roster-shell .person-roster{flex:1;min-height:0;padding:.75rem}.roster-grid.view-only .rg-tri{cursor:default}.roster-grid.view-only .rg-tri:hover{filter:none}.person-roster.view-only .person-day{cursor:default}.person-roster.view-only .person-day:hover{filter:none}.state{text-align:center;color:var(--muted);padding:3rem 1.5rem;font-weight:600}.state.error{color:#8a1f1f}.legend{border-top:1px solid var(--line);color:var(--muted);background:#faf8f5;flex-wrap:wrap;gap:.65rem 1rem;padding:.65rem .85rem;font-size:.72rem;font-weight:700;display:flex}.legend span{align-items:center;gap:.35rem;display:inline-flex}.legend i{border-radius:3px;width:12px;height:12px;display:inline-block}.lg-work{background:#fff;border:1px solid #bbb}.lg-off{background:#d8ecd4}.lg-ro{background:#d6e4f0}.lg-al{background:#f0c090}.lg-ph{background:#c9b6de}.lg-mc{background:#b8ddd4}@media (width<=768px){.app{gap:.75rem;padding:.75rem .65rem 1.25rem}.brand h1{font-size:1.15rem}.topbar-main{flex-direction:column;align-items:stretch}.controls{width:100%}.controls label.clinic-pick{flex:auto;max-width:none}.controls select{max-width:none;min-height:2.5rem}.view-toggle button{min-height:2.5rem}.month-nav button{min-height:2.5rem;padding:.45rem .65rem}.month-label{min-width:7rem;font-size:.9rem}.roster-shell .roster-grid{max-height:calc(100vh - 12rem)}.roster-shell.mode-person .person-roster{max-height:calc(100vh - 12rem);overflow:auto}.legend{gap:.45rem .75rem;font-size:.68rem}}
