
:root{
  --ink:#12100F; --paper:#F7F5F2; --card:#FFF; --brand:#A80405; --muted:#6B6560;
  --rule:#DED8D1; --rule-soft:#EDE9E4; --hol:#B4690E;
  --ok:#14746F; --warn:#B4690E; --late:#A80405; --soon:#2F4858;
  --display:'Space Grotesk',Georgia,serif; --body:'IBM Plex Sans',Calibri,system-ui,sans-serif;
  --mono:'IBM Plex Mono',ui-monospace,Menlo,monospace;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{background:var(--paper);color:var(--ink);font-family:var(--body);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased}
h1,h2,h3,h4{font-family:var(--display);margin:0;letter-spacing:-0.02em}
.wrap{max-width:1400px;margin:0 auto;padding:0 20px 70px}
.masthead{border-bottom:2px solid var(--ink);padding:18px 0 12px;display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap}
.crest{display:flex;align-items:center;gap:11px}
.crest-mark{width:40px;height:40px;border:2px solid var(--brand);color:var(--brand);font-family:var(--display);font-weight:700;font-size:15px;display:grid;place-items:center}
.crest-txt .org{font-family:var(--display);font-weight:700;font-size:14px;letter-spacing:0.16em;text-transform:uppercase}
.crest-txt .sub{font-family:var(--mono);font-size:10px;color:var(--muted);letter-spacing:0.08em;text-transform:uppercase}
.masthead h1{font-size:22px;font-weight:600}
.masthead h1 span{color:var(--brand)}

.nav{display:flex;gap:0;border-bottom:1px solid var(--rule);background:var(--card);flex-wrap:wrap;margin-bottom:0}
.nav button{padding:12px 18px;font-size:12.5px;font-weight:600;letter-spacing:0.04em;text-transform:uppercase;border:none;background:none;color:var(--muted);border-bottom:2px solid transparent;cursor:pointer}
.nav button:hover{color:var(--ink);background:none}
.nav button.on{color:var(--ink);border-bottom-color:var(--brand)}
.page{background:var(--card);border:1px solid var(--rule);border-top:none;padding:18px}

button{font-family:var(--body);font-size:13px;font-weight:600;padding:8px 13px;border:1px solid var(--ink);background:var(--ink);color:#fff;cursor:pointer;border-radius:0}
button:hover{background:var(--brand);border-color:var(--brand)}
button.ghost{background:transparent;color:var(--ink)}
button.ghost:hover{background:var(--ink);color:#fff}
button.small{padding:4px 9px;font-size:12px}
button.danger{border-color:var(--brand);color:var(--brand);background:transparent}
button.danger:hover{background:var(--brand);color:#fff}
button:disabled{opacity:.25;cursor:not-allowed}
button:disabled:hover{background:transparent;color:var(--ink);border-color:var(--ink)}
button:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
.btnrow{display:flex;gap:8px;flex-wrap:wrap;align-items:center}

select,input[type=date],input[type=text],input[type=number],textarea{padding:7px 9px;border:1px solid var(--rule);background:#fff;font-family:var(--body);font-size:13px;color:var(--ink);border-radius:0;max-width:100%}
input[type=date]{font-family:var(--mono);font-size:12.5px}
select:focus,input:focus,textarea:focus{outline:2px solid var(--brand);outline-offset:-1px}
label.fld{display:block}
label.fld > span{display:block;font-size:11px;font-weight:600;letter-spacing:0.04em;text-transform:uppercase;color:var(--muted);margin-bottom:4px}
label.fld input,label.fld select{width:100%}

.toolbar{display:flex;gap:10px;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;margin-bottom:16px}
.filters{display:flex;gap:8px;flex-wrap:wrap;align-items:flex-end}
.eyebrow{font-family:var(--mono);font-size:10px;letter-spacing:0.14em;text-transform:uppercase;color:var(--muted);display:block;margin-bottom:9px}

.scroll{overflow-x:auto}
table{width:100%;border-collapse:collapse}
th{font-family:var(--mono);font-size:9.5px;letter-spacing:0.09em;text-transform:uppercase;color:var(--muted);text-align:left;padding:0 9px 7px;border-bottom:1px solid var(--ink);font-weight:500;white-space:nowrap}
td{padding:8px 9px;border-bottom:1px solid var(--rule-soft);vertical-align:middle}
tr:last-child td{border-bottom:none}
td.num,th.num{text-align:right;font-family:var(--mono)}
td.dt{font-family:var(--mono);font-size:12.5px;white-space:nowrap}
tbody tr.click{cursor:pointer}
tbody tr.click:hover{background:#FBF7F2}
tfoot td{border-top:1px solid var(--ink);font-weight:600}

.tag{font-family:var(--mono);font-size:9.5px;padding:2px 6px;letter-spacing:0.06em;text-transform:uppercase;border:1px solid var(--rule);color:var(--muted);white-space:nowrap;display:inline-block}
.tag.ok{border-color:var(--ok);color:var(--ok);background:#EDF6F5}
.tag.on{border-color:var(--soon);color:var(--soon);background:#EEF2F4}
.tag.up{border-color:var(--rule);color:var(--muted)}
.tag.late{border-color:var(--late);color:var(--late);background:#FBEEEE}
.tag.warn{border-color:var(--warn);color:var(--warn);background:#FDF6EC}
.tag.dis{border-color:#999;color:#777;background:#F2F0EE}

.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:1px;background:var(--rule);border:1px solid var(--rule);margin-bottom:22px}
.kpi{background:#fff;padding:14px 16px}
.kpi .k{font-family:var(--mono);font-size:9.5px;letter-spacing:0.1em;text-transform:uppercase;color:var(--muted)}
.kpi .v{font-family:var(--display);font-size:26px;font-weight:600;line-height:1.2;margin-top:3px}
.kpi .s{font-size:11.5px;color:var(--muted)}
.kpi.accent .v{color:var(--brand)}

.bar{height:7px;background:var(--rule-soft);position:relative;min-width:60px}
.bar i{position:absolute;left:0;top:0;bottom:0;background:var(--ink)}
.bar.g i{background:var(--ok)} .bar.r i{background:var(--late)} .bar.o i{background:var(--warn)}
.stack{display:flex;height:20px;min-width:120px;background:var(--rule-soft)}
.stack i{display:block;height:100%}
.spark{display:flex;align-items:flex-end;gap:3px;height:64px}
.spark div{flex:1;background:var(--soon);min-width:6px;position:relative}
.spark div span{position:absolute;top:-15px;left:50%;transform:translateX(-50%);font-family:var(--mono);font-size:9px;color:var(--muted)}
.sparkx{display:flex;gap:3px;margin-top:4px}
.sparkx span{flex:1;font-family:var(--mono);font-size:8.5px;color:var(--muted);text-align:center;min-width:6px}

.sec{margin-top:30px;padding-top:18px;border-top:1px solid var(--rule)}
.sec h3{font-size:15px;margin-bottom:3px}
.sec p.sub{margin:0 0 14px;font-size:12px;color:var(--muted)}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:26px}
@media(max-width:980px){.grid2{grid-template-columns:1fr}}
.note{font-size:12px;color:var(--muted);background:#FBFAF8;border-left:2px solid var(--brand);padding:10px 12px;margin-top:14px}
.empty{color:var(--muted);font-size:13px;padding:26px 0;text-align:center}

/* modal */
.veil{position:fixed;inset:0;background:rgba(18,16,15,.55);z-index:50;display:none;overflow-y:auto;padding:28px 16px}
.veil.on{display:block}
.modal{background:var(--paper);max-width:1180px;margin:0 auto;border:1px solid var(--ink)}
.modal.narrow{max-width:620px}
.mhead{background:var(--ink);color:#fff;padding:16px 20px;display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap;position:sticky;top:0;z-index:2}
.mhead h2{font-size:19px;font-weight:600}
.mhead .meta{font-family:var(--mono);font-size:10.5px;letter-spacing:0.07em;color:#E4A0A0;margin-top:4px;text-transform:uppercase}
.mhead button{border-color:#fff;background:transparent;color:#fff}
.mhead button:hover{background:#fff;color:var(--ink)}
.mbody{padding:20px;background:#fff}
.hdates{display:flex;gap:22px;flex-wrap:wrap;margin-bottom:6px}
.hdates .hd{border-top:2px solid var(--brand);padding-top:7px;min-width:130px}
.hdates .hd span{display:block;font-family:var(--mono);font-size:9px;letter-spacing:0.12em;text-transform:uppercase;color:rgba(255,255,255,.55)}
.hdates .hd b{font-family:var(--display);font-size:18px;font-weight:600}
.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px;margin-bottom:16px}
.lvl-tbl input[type=text]{width:100%;min-width:110px}
.lvl-tbl select{min-width:120px}
.ord{display:flex;flex-direction:column;gap:2px}
.ord button{padding:0 5px;font-size:10px;line-height:1.6;background:transparent;color:var(--ink);border:1px solid var(--rule)}
.ord button:hover:not(:disabled){background:var(--ink);color:#fff}
.toast{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);background:var(--ink);color:#fff;padding:10px 18px;font-size:13px;z-index:99;opacity:0;transition:opacity .25s;pointer-events:none}
.toast.on{opacity:1}
.pill{font-family:var(--mono);font-size:10px;background:var(--brand);color:#fff;padding:1px 5px;margin-left:5px}
@media print{.nav,.toolbar,.no-print{display:none!important}.page{border:none;padding:0}}

/* ================= server app additions ================= */
.who{display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:12.5px}
.whoname{font-weight:600}
.rolebadge{font-family:var(--mono);font-size:9.5px;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;
  padding:2px 7px;margin-left:7px;border:1px solid var(--rule);color:var(--muted)}
.rolebadge.role-admin{border-color:var(--brand);color:var(--brand);background:#FBEEEE}
.rolebadge.role-hr{border-color:var(--soon);color:var(--soon);background:#EEF2F4}
.rolebadge.role-faculty{border-color:var(--ok);color:var(--ok);background:#EDF6F5}
.live{font-family:var(--mono);font-size:10px;letter-spacing:0.1em;text-transform:uppercase;color:var(--muted);
  display:inline-flex;align-items:center;gap:6px}
.live i{width:7px;height:7px;border-radius:50%;background:var(--ok);display:inline-block;animation:pulse 2.4s infinite}
.live.stale i{background:var(--warn);animation:none}
.live.off i{background:#BDB7B0;animation:none}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.25}}
a.btnlink{font-family:var(--body);font-size:13px;font-weight:600;padding:8px 13px;border:1px solid var(--ink);
  background:var(--ink);color:#fff;text-decoration:none;display:inline-block}
a.btnlink:hover{background:var(--brand);border-color:var(--brand)}
a.btnlink.small{padding:5px 10px;font-size:12px}
.hint{font-size:12px;color:var(--muted);margin:0 0 12px}
input:disabled,select:disabled,textarea:disabled{background:#F6F4F2;color:#8A837C;cursor:not-allowed}
.readonly-note{background:#EEF2F4;border-left:2px solid var(--soon);padding:9px 12px;font-size:12.5px;margin-bottom:16px}
.faculty-note{background:#EDF6F5;border-left:2px solid var(--ok);padding:9px 12px;font-size:12.5px;margin-bottom:16px}
.mine{background:#F4FAF9}
.byline{font-family:var(--mono);font-size:9.5px;color:var(--muted)}
/* auth pages */
.auth-wrap{min-height:100vh;display:grid;place-items:center;padding:28px 18px;background:var(--paper)}
.auth-card{background:#fff;border:1px solid var(--rule);border-top:3px solid var(--brand);padding:30px;max-width:420px;width:100%}
.auth-card h1{font-size:22px;margin:20px 0 14px}
.auth-card .crest{display:flex;align-items:center;gap:11px}
.auth-card .lede{font-size:12.5px;color:var(--muted);margin:0 0 18px}
.auth-card .fld{margin-bottom:14px}
.auth-card .fld input{width:100%;padding:9px 10px}
.auth-card button{width:100%;padding:11px}
.auth-card .foot{font-size:11.5px;color:var(--muted);margin:18px 0 0;line-height:1.5}
.alert{padding:10px 12px;font-size:12.5px;margin-bottom:16px;border-left:2px solid}
.alert.err{background:#FBEEEE;border-color:var(--brand);color:#7A0304}
.alert.ok{background:#EDF6F5;border-color:var(--ok);color:#0C5450}
.check{display:flex;gap:9px;align-items:flex-start;font-size:13px;margin-bottom:16px}
.check input{margin-top:3px;accent-color:var(--brand)}
