:root{--bg:#f3efe7;--card:#fffdf9;--ink:#22201d;--muted:#6e675e;--line:#d9d2c7;--accent:#2f5f55;--accent2:#234940;--warn:#8c5a13;--danger:#8b3030;--ok:#2e6546;--chip:#eee8de;--shadow:0 8px 28px rgba(45,37,27,.08)}
*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.45 system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}.app-shell{max-width:1500px;margin:auto;padding:18px}.topbar{display:flex;justify-content:space-between;gap:18px;align-items:flex-start;margin-bottom:12px}.brand h1{margin:0;font-size:30px;letter-spacing:.02em}.brand p{margin:3px 0 0;color:var(--muted)}.inline{display:flex;gap:9px;align-items:center}.wrap{flex-wrap:wrap}.server-pill,.badge{border:1px solid var(--line);border-radius:999px;padding:6px 10px;background:#f7f3ec;font-size:12px}.server-pill.ok{border-color:#aac8b6;color:var(--ok)}.server-pill.bad{border-color:#d7aaaa;color:var(--danger)}.tabs{position:sticky;top:0;z-index:20;display:flex;gap:5px;overflow-x:auto;background:rgba(243,239,231,.96);backdrop-filter:blur(8px);padding:8px 0 11px;border-bottom:1px solid var(--line)}.tabs button{white-space:nowrap;border:0;background:transparent;padding:10px 14px;border-radius:10px;font-weight:650;color:var(--muted)}.tabs button.active{background:var(--accent);color:white}.tab-panel{display:none;padding-top:14px}.tab-panel.active{display:block}.card{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:16px;margin:0 0 14px;box-shadow:var(--shadow)}.section-head,.section-page-head{display:flex;justify-content:space-between;gap:12px;align-items:flex-start}.section-page-head{padding:14px 0}.section-head h2,.section-page-head h2{margin:0}.section-page-head p{margin:4px 0;color:var(--muted)}h3{margin:18px 0 8px;font-size:15px}.grid{display:grid;gap:12px}.grid-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-4{grid-template-columns:repeat(4,minmax(0,1fr))}.field{display:flex;flex-direction:column;gap:5px}.field label{font-size:12px;font-weight:700;color:var(--muted)}input,select,button{font:inherit}input,select{width:100%;border:1px solid var(--line);border-radius:9px;padding:9px 10px;background:white;color:var(--ink)}button{cursor:pointer}.btn{border:1px solid var(--accent);border-radius:10px;background:#f7faf9;color:var(--accent2);padding:9px 12px;font-weight:700}.btn:hover{filter:brightness(.98)}.btn.primary{background:var(--accent);color:#fff}.btn.ghost{border-color:var(--line);background:#fff;color:var(--ink)}.btn.danger{border-color:#d8afaf;color:var(--danger);background:#fff8f8}.btn.small{padding:7px 9px;font-size:13px}.hidden{display:none!important}.gap-top{margin-top:12px}.smalltext{font-size:12px}.muted{color:var(--muted)}.notice{border:1px solid var(--line);background:#f8f5ef;border-radius:10px;padding:9px 11px}.notice.mini{padding:7px 9px}.notice.warn{border-color:#dcc69e;background:#fff8e9;color:#725018}.notice.ok{border-color:#b9d2c3;background:#f4fbf6;color:#315d42}.notice.bad{border-color:#dab6b6;background:#fff6f6;color:#7a3030}.table-wrap{overflow:auto;border:1px solid var(--line);border-radius:12px}table{width:100%;border-collapse:collapse;background:#fff}th,td{padding:8px 9px;border-bottom:1px solid #ece7df;text-align:left;vertical-align:top;white-space:nowrap}th{position:sticky;top:0;background:#f7f3ec;font-size:12px;color:var(--muted);z-index:1}.week-head,.month-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}.week-head{font-size:11px;color:var(--muted);text-align:center;margin-top:10px}.day-cell{min-height:58px;border:1px solid var(--line);border-radius:10px;background:#fff;padding:6px;display:flex;flex-direction:column;gap:4px;align-items:flex-start}.day-cell.blank{border-color:transparent;background:transparent}.day-cell.holiday{background:#fff1e7;border-color:#e5bca0}.day-cell.requested{background:#eef7f2;border-color:#a8c9b6}.day-number{font-weight:800}.day-code{font-size:12px;font-weight:800;color:var(--accent)}.request-tabs{display:flex;gap:6px;overflow:auto}.request-tabs button{white-space:nowrap}.roster-wrap{overflow:auto;border:1px solid var(--line);border-radius:14px;background:#fff}.roster{min-width:950px}.roster th,.roster td{vertical-align:top}.drop-zone{min-height:38px;padding:4px;border-radius:8px}.drop-zone.drag-over{outline:2px dashed var(--accent);background:#edf6f2}.assignment-chip{display:inline-flex;align-items:center;gap:5px;margin:2px;padding:5px 7px;border-radius:999px;background:var(--chip);border:1px solid #d8d0c4;font-size:12px;cursor:grab}.assignment-chip.hard{border-color:#cf8e8e;background:#fff0f0}.assignment-chip.half::after{content:"½";font-weight:800}.warning-mark{color:var(--danger);font-weight:900}.panel-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:12px}.panel{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:12px}.panel h3{margin:0 0 8px}.metric-cards{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px;margin-bottom:12px}.metric-card{border:1px solid var(--line);background:#fff;border-radius:12px;padding:11px}.metric-card b{display:block;font-size:20px}.empty-state{border:1px dashed #c9c0b5;border-radius:14px;padding:30px;text-align:center;color:var(--muted);background:rgba(255,255,255,.5)}.modal-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.48);display:flex;align-items:center;justify-content:center;padding:16px;z-index:100}.modal{width:min(560px,100%);max-height:90vh;overflow:auto;background:#fff;border-radius:16px;padding:18px;box-shadow:0 20px 60px rgba(0,0,0,.25)}.modal.large{width:min(900px,100%)}.modal-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:14px}.ack{display:block;margin-top:14px;padding:10px;border:1px solid var(--line);border-radius:10px}.validation-group{margin:10px 0;border:1px solid var(--line);border-radius:10px;overflow:hidden}.validation-group h4{margin:0;padding:9px 11px;background:#f7f3ec}.validation-row{padding:8px 11px;border-top:1px solid #eee7de}.severity-hard{color:var(--danger)}.severity-soft{color:var(--warn)}.severity-warn{color:#6b5a2f}.version-badge{display:inline-block;border:1px solid var(--line);border-radius:999px;padding:4px 8px;font-size:12px;margin-bottom:8px}footer{padding:22px 4px 8px;color:var(--muted);font-size:12px;text-align:center}
@media(max-width:900px){.app-shell{padding:10px}.topbar{flex-direction:column}.grid-4,.grid-3{grid-template-columns:repeat(2,minmax(0,1fr))}.panel-grid{grid-template-columns:1fr}.metric-cards{grid-template-columns:repeat(2,minmax(0,1fr))}.section-page-head{flex-direction:column}.section-page-head>.inline{width:100%}.section-page-head .btn,.section-page-head select{flex:1}.day-cell{min-height:52px;padding:4px;font-size:12px}}
@media(max-width:560px){body{font-size:14px}.grid-4,.grid-3,.grid-2{grid-template-columns:1fr}.card{padding:12px}.week-head,.month-grid{gap:3px}.day-cell{min-height:48px;border-radius:7px;padding:4px}.day-number{font-size:12px}.metric-cards{grid-template-columns:1fr 1fr}.tabs button{padding:9px 10px}.brand h1{font-size:27px}}
@media print{body{background:#fff}.topbar,.tabs,footer,.no-print,.section-page-head .inline,.btn{display:none!important}.app-shell{max-width:none;padding:0}.tab-panel{display:none!important}.tab-panel.print-target{display:block!important}.card,.panel,.roster-wrap{box-shadow:none;border:0}.print-roster-only .panel-grid,.print-roster-only .proof-extra,.print-roster-only .card:not(.roster-card){display:none!important}.roster{min-width:0;font-size:10px}th,td{padding:4px}.roster-wrap{overflow:visible}@page{size:portrait;margin:8mm}}


/* FRAME v1.0.2 — visual calendar/request amendments */
.calendar-legend,.request-code-legend{display:flex;flex-wrap:wrap;gap:8px 14px;align-items:center;margin:10px 0 4px;font-size:12px;color:var(--muted)}
.calendar-legend span,.request-code-legend span{display:inline-flex;align-items:center;gap:6px}
.legend-swatch{display:inline-block;width:16px;height:16px;border-radius:5px;border:1px solid var(--line);background:#fff}
.legend-swatch.saturday{background:#edf4fb;border-color:#b9cde0}
.legend-swatch.sunday{background:#f8eeee;border-color:#dbbbbb}
.legend-swatch.selected-off{background:#fff0d8;border-color:#dda862;box-shadow:inset 0 0 0 2px rgba(166,105,26,.10)}
.day-cell{position:relative;transition:border-color .12s ease,background .12s ease,box-shadow .12s ease}
.day-cell.saturday{background:#edf4fb;border-color:#c3d5e6}
.day-cell.sunday{background:#f8eeee;border-color:#dfc4c4}
.day-cell.selected-off{background:#fff0d8;border-color:#d8a25e;box-shadow:inset 0 0 0 1px rgba(161,100,21,.08)}
.day-cell.selected-off.saturday,.day-cell.selected-off.sunday{background:#fff0d8;border-color:#d39b51}
.day-cell.selected-off::after{content:"";position:absolute;inset:2px;border:1px solid rgba(160,99,20,.20);border-radius:7px;pointer-events:none}
.day-cell.requested{box-shadow:inset 0 -3px 0 #6f9b82}
.day-cell.requested:not(.selected-off){background:#eef7f2;border-color:#a8c9b6}
.day-cell.saturday.requested:not(.selected-off){background:linear-gradient(#edf4fb 0 48%,#eef7f2 48% 100%)}
.day-cell.sunday.requested:not(.selected-off){background:linear-gradient(#f8eeee 0 48%,#eef7f2 48% 100%)}
.day-name{font-weight:650;color:var(--muted)}
.day-code.off-code{color:#8a5414;background:rgba(255,255,255,.66);border:1px solid rgba(170,111,35,.28);border-radius:999px;padding:1px 5px}
.req-day{min-height:88px;cursor:default;justify-content:space-between;align-items:stretch}
.request-day-head{display:flex;gap:6px;align-items:center;min-height:24px}
.request-day-head .day-name{margin-right:auto}
.request-day-select{width:100%;min-width:0;padding:7px 7px;border-radius:8px;background:rgba(255,255,255,.92);font-size:12px}
.request-day-select:focus{outline:2px solid rgba(48,105,82,.25);outline-offset:1px;border-color:var(--accent)}
@media(max-width:720px){
  .month-grid,.week-head{gap:3px}
  .day-cell{min-height:62px;padding:5px}
  .req-day{min-height:96px}
  .request-day-head{gap:3px;flex-wrap:wrap}
  .request-day-select{font-size:11px;padding:6px 4px}
  .calendar-legend,.request-code-legend{gap:6px 10px}
}
