:root{
  --forest:#2a3327; --forest-2:#3c4a38; --cream:#f2ede2; --paper:#fbf9f3;
  --ember:#b55a32; --sage:#6b7a5e; --sage-2:#8a9a7c; --ink:#33372e;
  --line:#d8d0bf; --line-2:#e7e0d0; --muted:#8a7f6b;
  --confirmed:#2a3327; --held:#6b7a5e; --quoted:#b55a32; --inquiry:#cdbfa3; --open:#efe9db;
  /* v2 ladder: qualified sits between inquiry and quoted; pending-contract
     reuses the held tone because it is the same moment, renamed. */
  --qualified:#c4a678; --pending-contract:#6b7a5e;
  --shadow:0 1px 2px rgba(42,51,39,.06),0 4px 16px rgba(42,51,39,.05);
  --wide:1560px;
}
*{box-sizing:border-box;margin:0;padding:0}
body{
  font-family:'Host Grotesk',system-ui,sans-serif;color:var(--ink);background:var(--cream);
  -webkit-font-smoothing:antialiased;overflow-x:hidden;
}
button{font-family:inherit;cursor:pointer;border:none;background:none;color:inherit;font-size:inherit}

/* ---------- top bar ---------- */
.topbar{background:var(--paper);border-bottom:1px solid var(--line)}
.tb-in{display:flex;align-items:center;gap:18px 28px;padding:16px 26px;flex-wrap:wrap;
  max-width:var(--wide);margin:0 auto}
.brand{display:flex;align-items:center;gap:11px}
a.brand{color:inherit;text-decoration:none}
.logo{width:36px;height:36px;border-radius:9px;background:var(--forest);color:var(--cream);
  display:flex;align-items:center;justify-content:center;font-size:15px;flex:none}
.brand-name{font-family:'Fraunces',serif;font-weight:600;font-size:20px;color:var(--forest);line-height:1}
.brand-sub{font-size:10px;letter-spacing:.22em;text-transform:uppercase;color:var(--sage);margin-top:3px}
.tb-link{font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--sage);
  text-decoration:none;font-weight:600;padding:6px 0}
.tb-link:hover{color:var(--ember)}
.views{display:flex;gap:4px;background:var(--cream);padding:4px;border-radius:11px}
.views button{padding:8px 18px;border-radius:8px;font-size:14px;color:var(--muted);font-weight:500;transition:.15s}
.views button:hover{color:var(--forest)}
.views button.active{background:var(--paper);color:var(--forest);box-shadow:var(--shadow)}
.context{margin-left:auto;text-align:right}
.context .ctx-title{font-family:'Fraunces',serif;font-size:18px;color:var(--forest);font-weight:600}
.context .ctx-sub{font-size:12px;color:var(--muted);margin-top:2px}

/* ---------- mobile bottom tabs ---------- */
.tabbar{display:none;position:fixed;left:0;right:0;bottom:0;z-index:50;background:var(--paper);
  border-top:1px solid var(--line);padding:6px 10px calc(6px + env(safe-area-inset-bottom));gap:6px}
.tabbar button{flex:1;padding:10px 0;border-radius:10px;font-size:13px;font-weight:600;color:var(--muted)}
.tabbar button.active{background:var(--forest);color:var(--cream)}

/* ---------- main ---------- */
#main{padding:24px 26px 70px}
.view{max-width:var(--wide);margin:0 auto}
.eyebrow{font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--sage);font-weight:600}
.panel{background:var(--paper);border:1px solid var(--line);border-radius:16px;box-shadow:var(--shadow)}
.note-foot{font-size:12px;color:var(--muted);margin-top:10px;line-height:1.5}

/* ---------- status chips + legend ---------- */
.chip{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:600;
  padding:3px 10px;border-radius:20px;border:1px solid var(--line);background:var(--paper);
  color:var(--forest);white-space:nowrap}
.cdot{width:9px;height:9px;border-radius:50%;flex:none;background:var(--open);border:1px solid var(--line)}
.cdot.confirmed{background:var(--confirmed);border-color:var(--confirmed)}
.cdot.held{background:var(--held);border-color:var(--held)}
.cdot.qualified{background:var(--qualified);border-color:var(--qualified)}
.cdot.pending-contract{background:var(--pending-contract);border-color:var(--pending-contract)}
.cdot.quoted{background:var(--quoted);border-color:var(--quoted)}
.cdot.inquiry{background:var(--inquiry);border-color:var(--inquiry)}
.legend{display:flex;gap:14px;flex-wrap:wrap;font-size:12px;color:var(--muted);align-items:center}
.legend span{display:inline-flex;align-items:center;gap:6px}

/* ---------- date navigation (Today + Campus) ---------- */
.datenav{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:14px}
.dbtn{border:1px solid var(--line);background:var(--paper);border-radius:10px;padding:8px 14px;
  font-weight:600;font-size:13.5px;color:var(--forest);box-shadow:var(--shadow)}
.dbtn:hover{border-color:var(--sage)}
.datenav .day-title{font-family:'Fraunces',serif;font-size:24px;color:var(--forest);font-weight:600;margin-left:8px}

.strip-panel{padding:10px 14px;margin-bottom:20px}
.strip-head{display:flex;align-items:center;gap:10px;margin-bottom:6px}
.strip-head .mn{font-family:'Fraunces',serif;font-size:15px;font-weight:600;color:var(--forest)}
.mbtn{border:1px solid var(--line-2);border-radius:8px;width:26px;height:26px;line-height:1;
  color:var(--muted);font-size:14px;display:flex;align-items:center;justify-content:center}
.mbtn:hover:not(:disabled){color:var(--forest);border-color:var(--sage)}
.mbtn:disabled{opacity:.35;cursor:default}
.strip{display:flex;gap:3px;overflow-x:auto;padding:2px 0 6px;scrollbar-width:thin}
.day-chip{flex:none;min-width:38px;padding:5px 2px 4px;border-radius:9px;text-align:center;color:var(--muted)}
.day-chip .dw{display:block;font-size:9px;letter-spacing:.08em;text-transform:uppercase}
.day-chip .dd{display:block;font-size:13.5px;font-weight:600;margin-top:1px;color:var(--ink)}
.day-chip.has{background:rgba(107,122,94,.10)}
.day-chip.quiet .dd{color:var(--muted);font-weight:500}
.day-chip:hover{background:var(--cream)}
.day-chip .dots{display:flex;align-items:center;justify-content:center;gap:2.5px;height:6px;margin-top:3px}
.day-chip .dots i{width:4px;height:4px;border-radius:50%;background:var(--sage-2)}
.day-chip .dots b{font-size:9px;font-weight:700;line-height:6px;color:var(--sage-2)}
.day-chip.today:not(.active){box-shadow:inset 0 0 0 1.5px var(--ember)}
.day-chip.active{background:var(--forest)}
.day-chip.active .dw{color:var(--sage-2)}
.day-chip.active .dd{color:var(--cream)}
.day-chip.active .dots i{background:var(--cream)}
.day-chip.active .dots b{color:var(--cream)}

/* ---------- Today layout ---------- */
.today-grid{display:grid;grid-template-columns:1.3fr .95fr;gap:22px;align-items:start}
.col{display:flex;flex-direction:column;gap:22px}
h3.sect{font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--sage);font-weight:600;
  padding:16px 18px 4px}

.bk-list{display:flex;flex-direction:column}
.bk-row{display:block;width:100%;text-align:left;padding:13px 18px;border-top:1px solid var(--line-2)}
.bk-row:hover{background:var(--cream)}
.bk-main{display:flex;align-items:center;gap:10px;justify-content:space-between;flex-wrap:wrap}
.bk-name{font-weight:600;color:var(--forest);font-size:14.5px}
.bk-sub{font-size:12.5px;color:var(--muted);margin-top:4px;line-height:1.5}
.empty{padding:16px 18px 18px;font-size:13px;color:var(--muted)}

.meter{padding:20px}
.meter .lbl{font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--sage);font-weight:600}
.meter .big{font-family:'Fraunces',serif;font-size:42px;color:var(--forest);font-weight:600;line-height:1.1;margin-top:6px}
.meter .big small{font-size:20px;color:var(--muted);font-weight:400}
.bar{height:9px;border-radius:6px;background:var(--open);overflow:hidden;margin:12px 0 8px}
.bar > i{display:block;height:100%;background:var(--forest);border-radius:6px}
.meter .sub{font-size:13px;color:var(--muted);line-height:1.5}

/* ---------- unit rail (bed dots) ---------- */
.rail{padding-bottom:10px}
.rail-row{display:flex;align-items:center;gap:10px;padding:9px 18px;border-top:1px solid var(--line-2);
  width:100%;text-align:left}
.rail-row .nm{font-weight:500;color:var(--forest);font-size:13.5px;min-width:132px}
.rail-row .st{font-size:11.5px;color:var(--muted);margin-left:auto;white-space:nowrap;text-align:right;
  flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;max-width:48%}
button.rail-row:hover{background:var(--cream)}
.pips{display:flex;gap:6px;flex-wrap:wrap;align-items:center;flex:1 1 0;min-width:0}
.pip-cluster{display:flex;gap:2.5px}
.pip{width:9px;height:9px;border-radius:50%;background:transparent;border:1.5px solid var(--sage-2)}
.pip.confirmed{background:var(--confirmed);border-color:var(--confirmed)}
.pip.held{background:var(--held);border-color:var(--held)}
.pip.qualified{background:var(--qualified);border-color:var(--qualified)}
.pip.pending-contract{background:var(--pending-contract);border-color:var(--pending-contract)}
.pip.quoted{background:var(--quoted);border-color:var(--quoted)}
.pip.inquiry{background:var(--inquiry);border-color:var(--inquiry)}

/* ---------- view: Campus map ---------- */
.campus-grid{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:22px;align-items:start}
.campus-rail{padding-bottom:10px}
.map-panel{overflow:hidden}
.map-head{display:flex;align-items:flex-end;justify-content:space-between;gap:10px 20px;
  padding:16px 18px 13px;flex-wrap:wrap}
.map-title{font-family:'Fraunces',serif;font-size:20px;font-weight:600;color:var(--forest);margin-top:3px}
.map-head-right{display:flex;flex-direction:column;align-items:flex-end;gap:7px}
.beds-chip{font-size:12px;font-weight:600;color:var(--forest);background:var(--paper);
  border:1px solid var(--line);border-radius:20px;padding:4px 12px;box-shadow:var(--shadow)}

.map-viewport{position:relative;overflow:hidden;background:#222b1d;border-top:1px solid var(--line);
  aspect-ratio:3034/1306;max-height:74vh;width:100%;touch-action:none;cursor:grab;user-select:none}
.map-viewport:active{cursor:grabbing}
.map-canvas{position:absolute;left:0;top:0;width:100%;transform-origin:0 0;will-change:transform;
  backface-visibility:hidden}
.map-canvas.map-anim{transition:transform .28s ease}
.map-canvas.map-anim .pin{transition:transform .28s ease}
.map-canvas.map-anim .zone-tag{transition:transform .28s ease,opacity .25s}
.map-photo{display:block;width:100%;height:auto;user-select:none;-webkit-user-drag:none;pointer-events:none}

.map-flags{position:absolute;left:12px;bottom:12px;display:flex;flex-direction:column;
  gap:6px;z-index:6;align-items:flex-start}
.map-flag{display:inline-flex;align-items:center;gap:7px;background:rgba(251,249,243,.94);
  border:1px solid var(--line);border-radius:20px;padding:5px 12px;font-size:12px;
  font-weight:600;color:var(--forest);box-shadow:var(--shadow)}
.map-flag:hover{border-color:var(--sage)}

.map-ctl{position:absolute;right:12px;top:12px;display:flex;flex-direction:column;gap:6px;z-index:6}
.map-ctl button{width:36px;height:36px;border-radius:10px;background:rgba(251,249,243,.94);
  border:1px solid var(--line);color:var(--forest);font-size:17px;font-weight:600;
  box-shadow:var(--shadow);display:flex;align-items:center;justify-content:center}
.map-ctl button:hover{border-color:var(--sage)}
.map-ctl button[data-mz="fit"]{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase}

.zone-tag{position:absolute;transform:translate(-50%,-50%) scale(calc(1/var(--z,1)));
  font-size:11px;letter-spacing:.14em;text-transform:uppercase;font-weight:600;
  color:rgba(251,249,243,.96);background:rgba(42,51,39,.46);padding:4px 11px;border-radius:20px;
  pointer-events:none;transition:opacity .25s;white-space:nowrap;z-index:1}
.map-canvas.zoomed .zone-tag{opacity:0}

/* pins: a 0-size anchor exactly on the point; dot + label card hang off it,
   counter-scaled so they hold their size at any zoom */
.pin{position:absolute;width:0;height:0;overflow:visible;z-index:2;padding:0;
  transform:scale(calc(1/var(--z,1)))}
button.pin{cursor:pointer}
.pin:hover,.pin:focus-visible{z-index:7}
.pin-dot{position:absolute;left:-8px;top:-8px;width:16px;height:16px;border-radius:50%;
  background:rgba(251,249,243,.28);border:2.5px solid rgba(255,255,255,.95);
  box-shadow:0 1px 5px rgba(20,26,18,.5);transition:transform .12s}
button.pin:hover .pin-dot{transform:scale(1.25)}
.pin.confirmed .pin-dot{background:var(--confirmed)}
.pin.held .pin-dot{background:var(--held)}
.pin.qualified .pin-dot{background:var(--qualified)}
.pin.pending-contract .pin-dot{background:var(--pending-contract)}
.pin.quoted .pin-dot{background:var(--quoted)}
.pin.inquiry .pin-dot{background:var(--inquiry)}
.pin.muted .pin-dot{background:rgba(51,55,46,.42);border-color:rgba(255,255,255,.6)}
.pin.ghost .pin-dot{background:transparent;border:2px dashed rgba(255,255,255,.9)}

/* At the whole-campus fit, only pins with a booking (and the unconfirmed
   ghost) carry their name card; hover any dot for its name, zoom in and
   every card appears. Keeps the fit view readable on dense days. */
.pin-card{position:absolute;display:none;flex-direction:column;gap:1px;
  background:rgba(251,249,243,.95);border-radius:10px;padding:4px 9px;
  box-shadow:0 1px 5px rgba(42,51,39,.3);white-space:nowrap;pointer-events:none}
.pin.booked .pin-card,.pin.ghost .pin-card,.pin:hover .pin-card,
.pin:focus-visible .pin-card,.map-canvas.zoomed .pin-card{display:flex}
.pin-name{font-size:11px;font-weight:600;color:var(--forest);line-height:1.25}
.pin-meta{display:none;font-size:10px;color:var(--muted);line-height:1.25}
.pin:hover .pin-meta,.pin:focus-visible .pin-meta,.map-canvas.zoomed .pin-meta{display:block}
.pin.muted .pin-card{background:rgba(251,249,243,.78)}
.pin.muted .pin-name{color:var(--muted)}
.pin.ghost .pin-card{background:rgba(251,249,243,.82);border:1px dashed var(--muted)}
.pin.ghost .pin-name{color:var(--muted)}
.side-bottom .pin-card{left:0;top:12px;transform:translateX(-50%);align-items:center}
.side-top .pin-card{left:0;bottom:12px;transform:translateX(-50%);align-items:center}
.side-left .pin-card{right:12px;top:0;transform:translateY(-50%);align-items:flex-end}
.side-right .pin-card{left:12px;top:0;transform:translateY(-50%)}

.map-note{padding:0 18px 14px;margin-top:10px}

/* map lightbox (Expand) */
.maplight{position:fixed;inset:0;z-index:70;background:var(--cream);display:flex;flex-direction:column}
.maplight-bar{display:flex;align-items:center;gap:12px 20px;padding:12px 20px;background:var(--paper);
  border-bottom:1px solid var(--line);flex-wrap:wrap}
.maplight-bar .map-title{margin-top:0}
.maplight-bar .legend{margin-left:auto}
.maplight .map-viewport{flex:1;aspect-ratio:auto;max-height:none;border-top:none}
.ml-close{flex:none;width:36px;height:36px;border-radius:10px;border:1px solid var(--line);
  color:var(--muted);font-size:17px;display:flex;align-items:center;justify-content:center}
.ml-close:hover{color:var(--forest);border-color:var(--sage)}

/* pin edit mode bar */
.map-meta{display:flex;gap:10px;margin-bottom:10px;flex-wrap:wrap}

/* ---------- attention (v1: derived checkpoints) ---------- */
.attn-panel{border-color:#dfc0a9}
.attn-panel h3.sect{color:var(--ember)}
.attn-panel .attn-note{padding:10px 18px 14px;margin-top:0;border-top:1px solid var(--line-2)}
.bk-sub.attn-line{color:var(--ember);font-weight:500}
.pin-attn{position:absolute;left:5px;top:-15px;width:15px;height:15px;border-radius:50%;
  background:var(--ember);color:var(--cream);font-size:10px;font-weight:700;font-style:normal;
  line-height:1;display:flex;align-items:center;justify-content:center;
  box-shadow:0 1px 4px rgba(20,26,18,.4);z-index:3}
.attn-mark{display:inline-flex;width:14px;height:14px;border-radius:50%;background:var(--ember);
  color:var(--cream);font-size:9.5px;font-weight:700;font-style:normal;line-height:1;
  align-items:center;justify-content:center;margin-right:7px;flex:none;
  position:relative;top:-1px}
.sheet .attn-v{color:var(--ember);font-weight:500}
.sheet .attn-v div{margin:2px 0}

/* ---------- Campus: season timeline ---------- */
.tl-panel{margin-top:22px}
.tl-scroll{overflow-x:auto;padding:8px 14px 6px;scrollbar-width:thin}
.tl-canvas{position:relative;cursor:pointer}
.tl-month{position:absolute;top:0;height:20px;line-height:20px;font-size:10px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--sage);font-weight:600;padding-left:7px;
  border-left:1px solid var(--line-2);white-space:nowrap;overflow:hidden}
.tl-month.tl-m0{border-left:none;padding-left:2px}
.tl-mline{position:absolute;top:20px;bottom:0;width:1px;background:var(--line-2)}
.tl-we{position:absolute;top:20px;bottom:0;background:rgba(42,51,39,.04)}
.tl-bar{position:absolute;height:22px;border-radius:6px;display:flex;align-items:center;
  padding:0 7px;font-size:11px;font-weight:600;color:var(--cream);overflow:hidden;
  white-space:nowrap;text-align:left;z-index:2}
.tl-bar .tl-lbl{overflow:hidden;text-overflow:ellipsis}
.tl-bar.tl-thin{padding:0}
.tl-bar.confirmed{background:var(--confirmed)}
.tl-bar.held{background:var(--held)}
.tl-bar.qualified{background:var(--qualified);color:var(--forest)}
.tl-bar.pending-contract{background:var(--pending-contract)}
.tl-bar.quoted{background:var(--quoted)}
.tl-bar.inquiry{background:var(--inquiry);color:var(--forest)}
.tl-bar.open{background:var(--open);color:var(--forest)}
.tl-bar:hover{filter:brightness(1.12)}
.tl-bar.tl-share{box-shadow:inset 3px 0 0 var(--ember)}
.tl-day{position:absolute;width:22px;height:22px;display:flex;align-items:center;
  justify-content:center;z-index:2}
.tl-day i{width:11px;height:11px;border-radius:2.5px;transform:rotate(45deg);
  background:var(--open);border:1px solid var(--line);transition:transform .12s}
.tl-day.confirmed i{background:var(--confirmed);border-color:var(--confirmed)}
.tl-day.held i{background:var(--held);border-color:var(--held)}
.tl-day.qualified i{background:var(--qualified);border-color:var(--qualified)}
.tl-day.pending-contract i{background:var(--pending-contract);border-color:var(--pending-contract)}
.tl-day.quoted i{background:var(--quoted);border-color:var(--quoted)}
.tl-day.inquiry i{background:var(--inquiry);border-color:var(--inquiry)}
.tl-day:hover i{transform:rotate(45deg) scale(1.25)}
.tl-day.tl-share i{box-shadow:0 0 0 2px var(--ember)}
.tl-daymark{position:absolute;top:20px;bottom:0;width:2px;background:var(--ember);
  border-radius:1px;z-index:3;pointer-events:none}
.tl-note{padding:0 18px 14px;margin-top:2px}

/* ---------- Availability: month matrix ---------- */
.mx-top{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:14px}
.mx-top .mn{font-family:'Fraunces',serif;font-size:24px;color:var(--forest);font-weight:600}
.mx-top .legend{margin-left:auto}

/* day insight panel: what the marker's day means */
.mx-insight{display:grid;grid-template-columns:1fr 1.25fr;margin-bottom:16px;align-items:start}
.mxi-day{border-right:1px solid var(--line-2);padding-bottom:14px}
.mxi-big{font-family:'Fraunces',serif;font-size:34px;color:var(--forest);font-weight:600;
  line-height:1.1;padding:2px 18px 0}
.mxi-big small{font-size:16px;color:var(--muted);font-weight:400}
.mxi-sub{font-size:12.5px;color:var(--muted);line-height:1.55;padding:5px 18px 0}
.mxi-open{display:inline-block;margin:12px 18px 0;border:1px solid var(--line);border-radius:10px;
  padding:7px 14px;font-size:12.5px;font-weight:600;color:var(--forest);box-shadow:var(--shadow);
  background:var(--paper)}
.mxi-open:hover{border-color:var(--sage)}
.mxi-runs{padding-bottom:8px;min-width:0}
.mxi-runs .free-row .nm{display:flex;align-items:baseline;gap:8px}
.mxi-beds{font-size:10.5px;color:var(--muted);font-weight:400}
.mxi-spaces{padding:8px 18px 4px;margin-top:2px}

/* selection marker column */
table.matrix thead th.mx-day.sel{color:var(--forest);background:var(--cream);
  box-shadow:inset 0 -2px 0 var(--forest)}
td.mx-cell.sel:not(.booked){background:rgba(42,51,39,.09)}
td.mx-cell.sel.we:not(.booked){background:rgba(42,51,39,.12)}
.matrix-wrap{overflow-x:auto;border:1px solid var(--line);border-radius:14px;background:var(--paper);box-shadow:var(--shadow)}
table.matrix{border-collapse:collapse;font-size:12px;min-width:100%}
table.matrix th,table.matrix td{border-bottom:1px solid var(--line-2)}
table.matrix thead th{position:sticky;top:0;background:var(--paper);z-index:3;padding:7px 4px 6px;
  color:var(--muted);font-weight:600;text-align:center;min-width:32px;line-height:1.35}
table.matrix thead th .dw{display:block;font-size:9px;letter-spacing:.06em}
table.matrix thead th.mx-day{cursor:pointer}
table.matrix thead th.mx-day:hover{color:var(--forest);background:var(--cream)}
table.matrix thead th.we{color:var(--ember)}
table.matrix thead th.today-col{color:var(--forest);box-shadow:inset 0 -2px 0 var(--ember)}
table.matrix tbody tr:hover .mx-cell:not(.booked){background:rgba(107,122,94,.08)}
table.matrix tbody tr:hover .mx-unit{color:var(--ember)}
.mx-unit{position:sticky;left:0;background:var(--paper);z-index:2;text-align:left;padding:8px 14px;
  font-weight:500;color:var(--forest);white-space:nowrap;border-right:1px solid var(--line);min-width:186px}
.mx-unit .beds{font-size:10.5px;color:var(--muted);font-weight:400;margin-left:7px}
.mx-grouphdr td{background:var(--cream);font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;
  color:var(--sage);font-weight:600;padding:7px 14px;text-align:left}
.mx-grouphdr td:first-child{position:sticky;left:0;background:var(--cream)}
.mx-cell{height:30px;background:transparent;border-left:1px solid rgba(216,208,191,.35)}
/* Availability rows, tinted by group. A colour accent on the unit column
   chunks cabins / dorms / event spaces so the eye finds a row without
   reading it. Kept faint on purpose: the status colours in the grid are
   the loud thing, these are just a spine. */
table.matrix tbody tr:nth-of-type(even) .mx-unit{background:#f7f4ec}
.mx-unit{border-left:3px solid transparent}
tr.grp-cabins-suites .mx-unit{border-left-color:var(--sage)}
tr.grp-dorm-village .mx-unit{border-left-color:var(--inquiry)}
tr.grp-event-training .mx-unit{border-left-color:var(--ember)}
tr.grp-lower-campus .mx-unit{border-left-color:var(--sage-2)}
tr.grp-outdoor .mx-unit{border-left-color:#9db089}
table.matrix tbody tr:hover td{background:rgba(107,122,94,.07)}
table.matrix tbody tr:hover .mx-unit{background:#f2ede2}
.mx-cell.we{background:rgba(42,51,39,.035)}
.mx-cell.bk-start{box-shadow:inset 2px 0 0 var(--paper)}
.mx-cell.booked{cursor:pointer}
.mx-cell.confirmed{background:var(--confirmed)}
.mx-cell.held{background:var(--held)}
.mx-cell.qualified{background:var(--qualified)}
.mx-cell.pending-contract{background:var(--pending-contract)}
.mx-cell.quoted{background:var(--quoted)}
.mx-cell.inquiry{background:var(--inquiry)}
.mx-cell.today{box-shadow:inset 0 0 0 2px var(--ember)}
.mx-cell.booked:hover{filter:brightness(1.12)}

/* ---------- Availability: mobile agenda ---------- */
.agenda{display:none}
.agenda h3.sect{padding:16px 18px 8px}
.ag-date{font-family:'Fraunces',serif;font-size:15px;font-weight:600;color:var(--forest);
  padding:14px 18px 2px;border-top:1px solid var(--line-2)}
.ag-date:first-of-type{border-top:none}
.ag-note{padding:0 18px 14px}
.free-list{padding-bottom:8px}
.free-row{display:flex;justify-content:space-between;gap:12px;padding:9px 18px;border-top:1px solid var(--line-2);font-size:13px}
.free-row .nm{font-weight:500;color:var(--forest)}
.free-row .fr{color:var(--muted);text-align:right}

/* ---------- booking detail (slide-over) ---------- */
.scrim{position:fixed;inset:0;background:rgba(42,51,39,.34);opacity:0;pointer-events:none;
  transition:opacity .2s;z-index:80}
.scrim.show{opacity:1;pointer-events:auto}
.sheet{position:fixed;top:0;right:0;bottom:0;width:min(440px,100%);background:var(--paper);
  border-left:1px solid var(--line);box-shadow:-8px 0 30px rgba(42,51,39,.12);
  transform:translateX(105%);transition:transform .25s ease;z-index:81;overflow-y:auto}
.sheet.show{transform:none}
.sheet-head{display:flex;align-items:flex-start;gap:12px;padding:22px 22px 14px;
  border-bottom:1px solid var(--line-2);position:sticky;top:0;background:var(--paper);z-index:2}
.sheet-head h2{font-family:'Fraunces',serif;font-size:21px;font-weight:600;color:var(--forest);
  line-height:1.25;flex:1}
.sheet-close{flex:none;width:32px;height:32px;border-radius:9px;border:1px solid var(--line);
  color:var(--muted);font-size:16px;display:flex;align-items:center;justify-content:center}
.sheet-close:hover{color:var(--forest);border-color:var(--sage)}
.sheet-body{padding:6px 22px 40px}
.sheet .row{padding:14px 0;border-bottom:1px solid var(--line-2)}
.sheet .row:last-child{border-bottom:none}
.sheet .k{font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--sage);
  font-weight:600;margin-bottom:6px}
.sheet .v{font-size:14px;color:var(--ink);line-height:1.55}
.sheet .v b{color:var(--forest)}
.sheet .v a{color:var(--ember);text-decoration:none}
.sheet .v a:hover{text-decoration:underline}
.sheet .v .soft{color:var(--muted)}
.sheet .v.pre{white-space:pre-line}
.space-chips{display:flex;gap:6px;flex-wrap:wrap}
.space-chip{font-size:12px;padding:4px 11px;border-radius:20px;background:var(--cream);
  border:1px solid var(--line);color:var(--forest);font-weight:500}
.money-line{display:flex;justify-content:space-between;gap:10px;padding:3px 0;font-size:14px}
.money-line .ml{color:var(--muted)}
.money-line .mv{font-weight:600;color:var(--forest)}
.paid-tag{font-size:11px;font-weight:600;padding:2px 9px;border-radius:20px;margin-left:8px}
.paid-tag.yes{background:#e4e9df;color:var(--forest)}
.paid-tag.no{background:#f6e7dd;color:var(--ember)}

/* ---------- assumed markers ---------- */
.assumed-tag{display:inline-block;font-size:10.5px;font-weight:500;color:var(--muted);
  border:1px dashed var(--line);border-radius:20px;padding:2px 9px;margin-left:8px;
  vertical-align:middle;white-space:nowrap}
.k-assumed{font-size:10px;font-weight:500;color:var(--muted);letter-spacing:.02em;text-transform:none}
.space-chip.assumed{border-style:dashed;background:transparent;color:var(--muted)}
.assumed-inline{color:var(--muted);font-style:italic}

.loading{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;
  background:var(--cream);color:var(--muted);font-size:15px;z-index:90}
.loading.hidden{display:none}

/* ---------- responsive ---------- */
@media(max-width:1180px){
  .campus-grid{grid-template-columns:minmax(0,1fr) 300px}
}
@media(max-width:960px){
  .today-grid{grid-template-columns:1fr}
  .campus-grid{grid-template-columns:1fr}
}
@media(max-width:767px){
  #main{padding:18px 14px 96px}
  .tb-in{padding:14px 16px;gap:12px}
  .context{display:none}
  .views{display:none}
  .tabbar{display:flex}
  .datenav .day-title{width:100%;margin-left:0;margin-top:2px;font-size:21px}
  .matrix-wrap{display:none}
  .mx-top{display:none}
  .mx-insight{display:none}
  .matrix-note{display:none}
  .agenda{display:block}
  .sheet{width:100%;border-left:none}
  .rail-row .nm{min-width:110px}
  .map-head-right{align-items:flex-start}
  .map-viewport{aspect-ratio:auto;height:400px}
  .maplight .map-viewport{height:auto}
  .pin-dot{left:-10px;top:-10px;width:20px;height:20px}
  .side-bottom .pin-card{top:14px}
  .side-top .pin-card{bottom:14px}
  .side-left .pin-card{right:14px}
  .side-right .pin-card{left:14px}
}
