:root{--navy:#0b2341;--red:#d11f2a;--bg:#f4f6f9;--card:#fff;--line:#dfe3ea;--muted:#6b7280;--ok:#1f8a4c;--okbg:#e6f4ec;--warn:#b7791f;--warnbg:#fdf4e3;--bad:#c53030;--badbg:#fdeaea;--blue:#2563eb}
*{box-sizing:border-box}
body{margin:0;font-family:Segoe UI,Arial,sans-serif;background:var(--bg);color:#1f2937;font-size:13px}
header{background:var(--navy);color:#fff;padding:10px 18px;display:flex;align-items:center;gap:10px 16px;flex-wrap:wrap}
header h1{font-size:17px;margin:0;font-weight:600}
header .sub{opacity:.8;font-size:12px}
header .spacer{flex:1}
header label{font-size:12px;opacity:.9}
header input[type=date]{padding:4px 6px;border-radius:4px;border:0}
.who{font-size:12px;opacity:.85}
.pill{font-size:11px;font-weight:600;border-radius:12px;padding:3px 10px;background:rgba(255,255,255,.15);cursor:pointer;white-space:nowrap}
.pill.saving{background:#b7791f}.pill.offline{background:var(--bad)}
.btn{background:#fff;color:var(--navy);border:1px solid var(--line);border-radius:5px;padding:6px 11px;cursor:pointer;font-size:12px;font-weight:600;font-family:inherit}
.btn:hover{background:#eef2f7}
.btn.primary{background:var(--red);color:#fff;border-color:var(--red)}
.btn.primary:hover{background:#b81a24}
.btn.ghost{background:transparent;color:#fff;border-color:rgba(255,255,255,.4)}
.btn.ghost:hover{background:rgba(255,255,255,.1)}
.btn.sm{padding:3px 8px;font-weight:500}
.btn.del{color:var(--bad);border-color:transparent;background:transparent;font-size:15px;padding:0 6px}
.btn:disabled{opacity:.5;cursor:default}
nav{display:flex;gap:2px;background:#fff;border-bottom:1px solid var(--line);padding:0 18px;overflow-x:auto}
nav button{border:0;background:none;padding:11px 14px;font-size:13px;cursor:pointer;color:var(--muted);border-bottom:3px solid transparent;font-weight:600;white-space:nowrap;font-family:inherit}
nav button.active{color:var(--navy);border-bottom-color:var(--red)}
main{padding:16px 18px}
.tab{display:none}.tab.active{display:block}
.card{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:14px;margin-bottom:14px}
.card h2{font-size:14px;margin:0 0 10px;color:var(--navy)}
.card h2 small{font-weight:400;color:var(--muted);font-size:12px;margin-left:6px}
.scroll{overflow:auto}
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:14px}
.kpi{background:#fff;border:1px solid var(--line);border-radius:8px;padding:12px}
.kpi .v{font-size:24px;font-weight:700;color:var(--navy)}
.kpi .l{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.4px}
.kpi.bad .v{color:var(--bad)}.kpi.ok .v{color:var(--ok)}
table{border-collapse:collapse;width:100%}
th,td{border-bottom:1px solid var(--line);padding:5px 6px;text-align:left;vertical-align:middle}
th{background:#f8fafc;font-size:11px;text-transform:uppercase;color:var(--muted);letter-spacing:.3px;position:sticky;top:0;z-index:1}
td.c,th.c{text-align:center}td.r,th.r{text-align:right}
td.num{text-align:right;font-variant-numeric:tabular-nums}
.cov{display:inline-block;min-width:52px;padding:3px 6px;border-radius:4px;font-weight:600;text-align:center}
.cov.ok{background:var(--okbg);color:var(--ok)}.cov.warn{background:var(--warnbg);color:var(--warn)}.cov.bad{background:var(--badbg);color:var(--bad)}.cov.na{color:#c0c4cc}
.neg{color:var(--bad);font-weight:600}.pos{color:var(--ok);font-weight:600}
.toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:10px}
.toolbar select,.toolbar input{padding:5px 7px;border:1px solid var(--line);border-radius:4px;font-size:12px;font-family:inherit}
.bulk{background:#eef4ff;border:1px solid #c7d7fb;border-radius:6px;padding:6px 10px}
.grid input,.grid select{border:1px solid transparent;background:transparent;padding:3px 4px;font-size:12px;width:100%;border-radius:3px;font-family:inherit;color:inherit}
.grid input:hover,.grid select:hover{border-color:var(--line)}
.grid input:focus,.grid select:focus{border-color:var(--blue);background:#fff;outline:none}
.grid td{padding:2px 4px}
.grid input[type=checkbox]{width:auto}
.grid select[data-f=shift],.grid select[data-f=role]{min-width:150px}.grid select[data-f=status]{min-width:118px}.grid select[data-f=source]{min-width:90px}
.grid input.in{background:#fffbe6;color:#1d4ed8;border-color:#f3e3a1;text-align:right}
.daycell select{width:62px;text-align:center;font-weight:600}
.daycell.ovr select{box-shadow:inset 0 -2px 0 #93c5fd}
.d-W,.grid select.d-W{background:#e8f0fe;color:#1e40af}.d-OT,.grid select.d-OT{background:#ede9fe;color:#5b21b6}.d-PTO,.grid select.d-PTO{background:#fef3c7;color:#92400e}.d-CO,.grid select.d-CO{background:#fde2e2;color:#9b1c1c}.d-NS,.grid select.d-NS{background:#fecaca;color:#7f1d1d}.grid select.d-off{color:#b0b6c0}
.d-pre{background:repeating-linear-gradient(45deg,#f3f4f6,#f3f4f6 4px,#fff 4px,#fff 8px);color:#9ca3af;font-size:10px;text-align:center}
tr.grp td{background:var(--navy);color:#fff;font-weight:600;font-size:12px;padding:6px 8px}
tr.grp.unassigned td{background:#7c2d12}
tr.open td{background:#fff5f5;color:var(--bad);font-weight:600}
tr.open td.c span{display:inline-block;min-width:22px;background:var(--bad);color:#fff;border-radius:10px;padding:1px 6px}
tr.inactive td{opacity:.55}
tr.sum td{font-weight:700;background:#f8fafc}
tr.key td{background:#fff7ed}
.tag{display:inline-block;padding:1px 7px;border-radius:10px;font-size:11px;font-weight:600;background:#eef2f7;color:#334155}
.muted{color:var(--muted)}
.two{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px}
.legend{display:flex;gap:12px;flex-wrap:wrap;font-size:11px;color:var(--muted);margin-top:8px}
.legend span b{display:inline-block;width:12px;height:12px;border-radius:2px;vertical-align:middle;margin-right:4px}
.note{font-size:12px;color:var(--muted);margin:6px 0 0}
.banner{background:#eef4ff;border:1px solid #c7d7fb;border-radius:6px;padding:8px 12px;margin-bottom:10px;font-size:12px}
.req-head{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:8px 16px;margin-bottom:12px}
.req-head div b{display:block;font-size:11px;color:var(--muted);text-transform:uppercase}
.req-head input{width:100%;padding:5px;border:1px solid var(--line);border-radius:4px;font-family:inherit}
#toast{position:fixed;bottom:18px;right:18px;background:var(--navy);color:#fff;padding:10px 16px;border-radius:6px;display:none;z-index:99;max-width:90vw}
dialog{border:1px solid var(--line);border-radius:10px;padding:18px;max-width:640px;width:calc(100vw - 32px)}
dialog::backdrop{background:rgba(11,35,65,.4)}
dialog h2{margin:0 0 10px;font-size:16px;color:var(--navy)}
dialog ul{max-height:200px;overflow:auto;margin:4px 0 10px;padding-left:20px;font-size:12px}
.print-only{display:none}
.err{color:var(--bad);font-weight:600;min-height:1em}

/* login */
body.login{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:16px;background:var(--navy)}
.login-card{background:#fff;border-radius:12px;padding:28px 24px;width:100%;max-width:360px;display:flex;flex-direction:column;gap:12px}
.login-card h1{margin:0;font-size:20px;color:var(--navy)}
.login-card p{margin:0}
.login-card label{display:flex;flex-direction:column;gap:4px;font-weight:600;font-size:12px;color:#374151}
.login-card input{padding:10px;border:1px solid var(--line);border-radius:6px;font-size:16px;font-family:inherit}
.login-card .btn{padding:11px;font-size:15px}

@media (max-width:760px){
  header,main{padding-left:16px;padding-right:16px}
  nav{padding:0 8px}
  .two{grid-template-columns:minmax(0,1fr)}
  header h1{font-size:15px}
}
@media print{
  @page{size:landscape;margin:.4in}
  body{background:#fff;font-size:10.5px}
  header,nav,.toolbar,.no-print,.btn,.banner{display:none!important}
  main{padding:0}
  .tab{display:none!important}
  .tab.printing{display:block!important}
  .card{border:0;padding:0;margin-bottom:10px;break-inside:avoid}
  .scroll{overflow:visible!important;max-height:none!important}
  .grid input,.grid select{border:0!important;appearance:none;-webkit-appearance:none;padding:0}
  th{position:static}
  .print-only{display:block}
  tr.grp td,.cov,.d-W,.d-OT,.d-PTO,.d-CO,.d-NS,tr.open td,tr.open td.c span,tr.key td{-webkit-print-color-adjust:exact;print-color-adjust:exact}
}
