/* Self-hosted, not Fontshare's CDN. A webfont served by a third party is a
   third-party request on every page load, which is a doctrine rule 2 question
   (EU hosting, and the client's practitioners' IPs) rather than a styling one.
   Both files are variable (one request each, 38KB and 16KB). Fontshare's ITF
   Free Font Licence permits self-hosting and commercial use; re-read it before
   launch, as the website build notes also say.

   The ?v= is load-bearing: these filenames are not content-hashed and the
   files are served with a year's cache, so replacing one in place would
   otherwise leave every browser that has it on the old file. Bump v when a
   font file changes. (It already mattered once: the first Switzer self-hosted
   here was Fontshare's THIN static weight, taken from the top of their
   variable stylesheet, and every weight on the page was being synthesised
   from it.) */
@font-face{font-family:"General Sans";src:url("/fonts/general-sans-wght.woff2?v=1") format("woff2");
  font-weight:200 700;font-style:normal;font-display:swap}
@font-face{font-family:"Switzer";src:url("/fonts/switzer-wght.woff2?v=1") format("woff2");
  font-weight:100 900;font-style:normal;font-display:swap}

/* R-Space palette, carried from the website build's Site Styles
   (compass projects/rspace-relational-space/mockup/BUILD-NOTES.md).
   Yellow is a FILL ONLY — 1.5:1 on white, so it never carries text.
   Black on yellow is 12.4:1, which is why every yellow control is black-labelled.
   Radii sit a little tighter than the website's (8/12px there, same here for
   controls, 10px for panels): a dense admin table reads worse at 14px. */
:root{
  --paper:#f2f0e6; --card:#fff;
  --ink:#111; --ink-2:#4a4a45; --ink-3:#74726a;
  --line:#e3dfd2; --line-2:#cfc9b8;
  --yellow:#fccc00; --yellow-dk:#d9af00; --yellow-soft:#fcf0c0; --yellow-line:#e8d487;
  --yellow-ink:#6b5300;
  --sage:#bec4ad; --sage-soft:#e8ebe0; --sage-line:#bec4ad; --sage-ink:#3b4533;
  --terra:#cc9078;
  --stop:#9a4f33; --stop-soft:#f6e6df; --stop-line:#e2bca9;
  --wall:#111;
  --radius:8px; --radius-lg:10px; --radius-sm:5px;
  --head:"General Sans",ui-sans-serif,system-ui,"Segoe UI",Arial,sans-serif;
  --body:"Switzer",ui-sans-serif,system-ui,"Segoe UI",Arial,sans-serif;
  --shadow:0 1px 2px rgba(17,17,17,.04), 0 10px 26px -14px rgba(17,17,17,.16);
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{background:var(--paper);color:var(--ink);
  font:15px/1.5 var(--body);-webkit-font-smoothing:antialiased}
h1,h2,h3,.mark b,.btn,nav.main a,.eyebrow,.day .dn{font-family:var(--head)}
a{color:var(--ink);text-underline-offset:2px}
a:hover{color:var(--stop)}
.wrap{max-width:1180px;margin:0 auto;padding:0 16px}
.vis-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* ---------------- header ---------------- */
header{border-bottom:1px solid var(--line);background:var(--card)}
.bar{display:flex;align-items:center;gap:14px;min-height:60px;flex-wrap:wrap;padding:8px 0}
.mark{display:flex;align-items:baseline;gap:9px;font-weight:600;letter-spacing:-.015em;text-decoration:none;color:var(--ink)}
.mark .dot{width:10px;height:10px;background:var(--yellow);border:1.5px solid var(--ink);border-radius:50%;display:block;transform:translateY(-1px)}
.mark b{font-size:16px}
.org{color:var(--ink-3);font-size:13px;padding-left:14px;border-left:1px solid var(--line)}
.spacer{flex:1}
nav.main{display:flex;align-items:center;gap:4px;flex-wrap:wrap}
nav.main a{font-size:13.5px;text-decoration:none;color:var(--ink-2);padding:6px 10px;border-radius:var(--radius)}
nav.main a:hover{background:var(--yellow-soft);color:var(--ink)}
nav.main a[aria-current="page"]{background:var(--yellow-soft);color:var(--ink);font-weight:600;box-shadow:inset 0 -2px 0 var(--yellow)}
.whoami{font-size:13px;color:var(--ink-3);display:flex;align-items:center;gap:9px}
.whoami b{color:var(--ink);font-weight:550}
.badge{font-size:10px;letter-spacing:.06em;text-transform:uppercase;padding:2px 6px;border-radius:20px;font-weight:650;background:var(--yellow-soft);color:var(--yellow-ink)}
.count{display:inline-block;min-width:17px;padding:1px 5px;border-radius:20px;background:var(--stop);color:#fff;font-size:11px;font-weight:650;text-align:center;margin-left:4px}

/* ---------------- layout ---------------- */
.grid{display:grid;grid-template-columns:minmax(0,1fr) 330px;gap:26px;align-items:start;padding:26px 0 56px}
@media (max-width:900px){.grid{grid-template-columns:minmax(0,1fr);gap:20px;padding:18px 0 40px}}
.single{padding:26px 0 56px;max-width:760px}
.panel{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-lg);box-shadow:var(--shadow)}
.panel + .panel{margin-top:18px}
.panel-hd{padding:14px 16px;border-bottom:1px solid var(--line);display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.panel-hd h2{margin:0;font-size:14px;font-weight:600;letter-spacing:-.01em}
.panel-hd .sub{font-size:12.5px;color:var(--ink-3)}
.panel-bd{padding:16px}
h1{font-size:22px;letter-spacing:-.02em;margin:0 0 4px}
.lede{color:var(--ink-2);font-size:14px;margin:0 0 18px}

/* ---------------- date control ---------------- */
.datebar{display:flex;align-items:center;gap:14px;padding:12px 16px;border-bottom:1px solid var(--line);flex-wrap:wrap}
.datejump{position:relative;display:flex;align-items:center;gap:8px;flex:0 0 auto;flex-wrap:wrap}
.datejump label{font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--ink-3);white-space:nowrap}
.datejump input[type=date]{width:auto;padding:7px 9px;font-size:13px}
@media (max-width:620px){.datejump{width:100%}.datejump input[type=date]{flex:1}}

/* ---------------- floor plans ---------------- */
.floors{display:grid;grid-template-columns:auto minmax(0,1fr);gap:22px;align-items:start}
.stack{display:flex;flex-direction:column;gap:18px}
.floor-lb{display:flex;align-items:baseline;gap:8px;margin:0 0 7px;font-size:11px;
  text-transform:uppercase;letter-spacing:.09em;color:var(--ink-3)}
.floor-lb i{font-style:normal;color:var(--line-2)}
svg.plan{display:block;width:100%;height:auto;overflow:visible}
.plan-sm{max-width:116px}
.plan-md{max-width:270px}
@media (max-width:760px){
  .floors{grid-template-columns:minmax(0,1fr)}
  .floors > .floor{order:-1}
  .floors .stack{flex-direction:row;gap:16px;align-items:flex-start}
  .floors .stack > .floor{flex:1;min-width:0}
  .plan-sm,.plan-md{max-width:100%}
}
.plan .shell{fill:none;stroke:var(--wall);stroke-width:11}
.plan .win{stroke:#fff;stroke-width:7}
.plan .div{stroke:var(--wall);stroke-width:9;stroke-linecap:square}
.plan .fitting{fill:var(--wall)}
.plan .svc{fill:var(--sage-soft);stroke:var(--wall);stroke-width:4}
.plan .svc-t{fill:var(--ink-2);font-size:13px;letter-spacing:.08em}
.plan .circ{fill:#efecdf}
.plan .circ-t{fill:var(--ink-3);font-size:13px;letter-spacing:.08em}
.plan .stair{fill:none;stroke:var(--line-2);stroke-width:3}

.room{cursor:pointer}
.room .hit{fill:#fff;stroke:var(--line-2);stroke-width:2;transition:fill .12s,stroke .12s}
.room .num{font-size:30px;font-weight:650;fill:var(--ink);text-anchor:middle;pointer-events:none}
.room .cap{font-size:12px;fill:var(--ink-3);text-anchor:middle;letter-spacing:.07em;pointer-events:none}
.room .free{font-size:12.5px;fill:var(--ink-3);text-anchor:middle;pointer-events:none}
.room:hover .hit{fill:var(--yellow-soft);stroke:var(--yellow-line)}
.room[data-state="busy"] .hit{fill:var(--yellow-soft);stroke:var(--yellow-line)}
.room[data-state="busy"] .num{fill:var(--yellow-ink)}
.room[data-state="full"] .hit{fill:var(--stop-soft);stroke:var(--stop-line)}
.room[data-state="full"] .num{fill:var(--stop)}
/* Selection is carried by the STROKE alone, because the fills now carry state:
   white free, pale yellow partly booked, terracotta tint full. A selected
   free room and a partly booked room were the same colour otherwise. */
.room[data-sel="1"] .hit{stroke:var(--ink);stroke-width:4}
.room:focus{outline:none}
.room:focus-visible .hit{stroke:var(--ink);stroke-width:4}
.room.out{cursor:not-allowed}
.room.out .hit,.room.out:hover .hit{fill:url(#hatch);stroke:var(--line-2)}
.room.out .num,.room.out .cap,.room.out .free{fill:var(--ink-3)}

.legend{display:flex;flex-wrap:wrap;gap:14px;padding:12px 16px;border-top:1px solid var(--line);font-size:12.5px;color:var(--ink-2)}
.legend span{display:flex;align-items:center;gap:7px}
.sw{width:13px;height:13px;border-radius:3px;border:1.5px solid var(--line-2);display:block}
.sw.free{background:#fff}
.sw.busy{background:var(--yellow-soft);border-color:var(--yellow-line)}
.sw.full{background:var(--stop-soft);border-color:var(--stop-line)}
.sw.out{background:repeating-linear-gradient(45deg,#edeadf 0 3px,#e3dfd2 3px 6px)}

/* ---------------- forms & buttons ---------------- */
label.field{display:block;margin-bottom:13px}
label.field span{display:block;font-size:12.5px;color:var(--ink-2);margin-bottom:5px}
input[type=email],input[type=password],input[type=text],input[type=date],select,textarea{
  width:100%;font:inherit;font-size:14px;color:var(--ink);background:var(--card);
  border:1px solid var(--line-2);border-radius:var(--radius);padding:9px 10px}
input:focus,select:focus,textarea:focus{outline:2px solid var(--yellow-dk);outline-offset:-1px;border-color:var(--ink)}
.btn{font:inherit;font-size:14px;font-weight:600;padding:10px 15px;cursor:pointer;
  background:var(--yellow);color:var(--ink);border:1px solid var(--yellow-dk);border-radius:var(--radius);text-decoration:none;display:inline-block;text-align:center}
.btn:hover:not(:disabled){background:var(--yellow-dk)}
.btn:disabled{background:#efede4;color:var(--ink-3);border-color:var(--line);cursor:not-allowed}
.btn.block{width:100%}
.btn.ghost{background:var(--card);color:var(--ink-2);border-color:var(--line-2);font-weight:550}
.btn.ghost:hover{background:var(--paper);color:var(--ink)}
.btn.danger{background:var(--card);color:var(--stop);border-color:var(--stop-line);font-weight:550}
.btn.danger:hover{background:var(--stop-soft)}
.btn.sm{font-size:13px;padding:6px 11px}

/* ---------------- the application and practitioner forms ----------------
   `label.field span` above is a block, so a hint and an error are each their
   own line under the control without any extra structure. */
label.field .field-hint,label.field .field-err{margin:5px 0 0;font-size:12px;line-height:1.4}
label.field .field-hint{color:var(--ink-3)}
label.field .field-err{color:var(--stop);font-weight:600}
label.field.bad input,label.field.bad select,label.field.bad textarea{border-color:var(--stop-line);background:var(--stop-soft)}
.field .opt{font-style:normal;color:var(--ink-3);font-weight:400}
label.check{display:flex;gap:9px;align-items:flex-start;margin:0 0 13px;
  padding:10px 12px;border:1px solid var(--line-2);border-radius:var(--radius);background:var(--paper)}
label.check input{width:auto;margin:2px 0 0;accent-color:var(--ink)}
label.check span{display:block;font-size:13.5px;color:var(--ink-2)}
label.check.bad{border-color:var(--stop-line);background:var(--stop-soft)}
/* A form that spans several panels: the panel carries the margin, not the form */
form > .panel{margin-bottom:16px}

/* auto-fit rather than a fixed 3: a thirteen-hour day in three columns is five
   rows with one slot stranded on the last. At ~88px the panel takes five
   columns on desktop and still falls back to three at 375px. */
.slots{display:grid;grid-template-columns:repeat(auto-fit,minmax(88px,1fr));gap:6px}
/* A slot is now a LINK to the confirm step, or a span when it is not takeable.
   Both carry two lines: the hour, and who holds it or that it is free — the
   holder's name used to live in a `title`, which a phone has no way to show. */
.slot{display:block;font:inherit;font-size:13px;padding:8px 5px;text-align:center;cursor:pointer;
  border:1px solid var(--line);border-radius:var(--radius);background:var(--card);color:var(--ink);
  text-decoration:none}
.slot b{display:block;font-weight:600;font-size:13.5px}
.slot .who{display:block;font-size:11px;color:var(--ink-3);margin-top:2px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.slot:hover{border-color:var(--yellow-dk);background:var(--yellow-soft);color:var(--ink)}
.slot:hover .who{color:var(--ink-2)}
.slot.off{background:#f5f3ea;color:#6b6960;cursor:not-allowed}
.slot.off b{text-decoration:line-through}
.slot.off:hover{background:#f5f3ea;border-color:var(--line);color:#6b6960}
.slot.off .who{color:#6b6960}

/* ---------------- any room, one day ---------------- */
.single.wide{max-width:980px}
.gridscroll{overflow-x:auto}
.freegrid{width:100%;border-collapse:collapse;font-size:13px}
.freegrid th{font-family:var(--head);font-weight:600;text-align:left;color:var(--ink-2)}
.freegrid thead th{padding:0 4px 8px;border-bottom:1px solid var(--line);font-size:12px}
.freegrid thead th b{display:block;font-size:14px;color:var(--ink)}
.freegrid thead th span{display:block;font-weight:400;font-size:11px;color:var(--ink-3)}
.freegrid tbody th{white-space:nowrap;padding:3px 10px 3px 0;font-size:12.5px;font-weight:550}
.freegrid td{padding:3px 2px}
.cell{display:block;text-align:center;font-size:12px;padding:8px 4px;border-radius:var(--radius-sm);
  border:1px solid var(--line);text-decoration:none}
a.cell.free{background:var(--card);color:var(--ink-2)}
a.cell.free:hover{background:var(--yellow-soft);border-color:var(--yellow-dk);color:var(--ink)}
.cell.taken{background:var(--stop-soft);border-color:var(--stop-line);color:var(--stop)}
.cell.off{background:#f5f3ea;border-color:var(--line);color:#6b6960}
@media (max-width:620px){
  .freegrid{font-size:12px}
  .freegrid tbody th{padding-right:6px;font-size:11.5px}
  .cell{font-size:11px;padding:7px 2px}
}

/* ---------------- the confirm step ---------------- */
.amount{display:block;padding:13px 15px;border:1px solid var(--yellow-line);
  background:var(--yellow-soft);border-radius:var(--radius);margin:0 0 13px}
.amount-k{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.07em;color:var(--yellow-ink)}
.amount-v{display:block;font-family:var(--head);font-size:30px;font-weight:650;color:var(--ink);line-height:1.2}
.amount-n{display:block;font-size:12.5px;color:var(--yellow-ink);margin-top:4px;line-height:1.55}
.muted{color:var(--ink-3);font-weight:400}

/* ---------------- the availability panel (public/daypicker.js) ----------------
   Every rule here styles an element that file creates. Nothing the server
   renders depends on them, so with scripting off this block matches nothing. */
.datebar-link{margin-left:auto;font-size:12.5px;color:var(--ink-2);white-space:nowrap}
.daypick-toggle{flex:0 0 auto}
.daypick{position:absolute;z-index:20;margin-top:6px;padding:12px;width:min(320px,calc(100vw - 32px));
  background:var(--card);border:1px solid var(--line-2);border-radius:var(--radius-lg);box-shadow:var(--shadow)}
.daypick-hd{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:10px}
.daypick-hd b{font-family:var(--head);font-size:14px}
.daypick-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:3px}
.daypick-dow{font-size:10px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-3);text-align:center;padding-bottom:3px}
.daypick-day{font:inherit;font-size:12px;padding:7px 0;text-align:center;border-radius:var(--radius-sm);
  border:1px solid var(--line);background:var(--card);color:var(--ink);cursor:pointer}
.daypick-day.busy{background:var(--yellow-soft);border-color:var(--yellow-line);color:var(--yellow-ink)}
.daypick-day.full{background:var(--stop-soft);border-color:var(--stop-line);color:var(--stop);
  cursor:not-allowed;text-decoration:line-through}
.daypick-day.sel{outline:2px solid var(--ink);outline-offset:-2px;font-weight:650}
.daypick-day.out{color:var(--line-2);border-color:transparent;background:transparent}
.daypick-day:hover:not(:disabled){border-color:var(--yellow-dk)}
.daypick-legend{display:flex;flex-wrap:wrap;gap:10px;margin-top:10px;font-size:11.5px;color:var(--ink-2)}
.daypick-legend span{display:flex;align-items:center;gap:5px}
.daypick-note{margin:8px 0 0;font-size:11.5px;color:var(--ink-3);line-height:1.5}

/* ---------------- notes ---------------- */
.note{font-size:13px;line-height:1.55;padding:11px 13px;border-radius:var(--radius);margin:0 0 13px}
.note.ok{background:var(--sage-soft);color:var(--sage-ink);border:1px solid var(--sage-line)}
.note.warn{background:var(--yellow-soft);color:var(--yellow-ink);border:1px solid var(--yellow-line)}
.note.stop{background:var(--stop-soft);color:var(--stop);border:1px solid var(--stop-line)}
.note.plain{background:var(--paper);color:var(--ink-2);border:1px solid var(--line)}
.note b{font-weight:650}
.note:last-child{margin-bottom:0}

/* ---------------- lists & tables ---------------- */
.rows{margin:0;padding:0;list-style:none}
.rows li{display:flex;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid var(--line)}
.rows li:last-child{border-bottom:0}
.rows .grow{flex:1;min-width:0}
.rows .grow b{display:block;font-weight:550}
.rows .grow span{font-size:12.5px;color:var(--ink-3)}
.rows .acts{display:flex;gap:6px;flex-shrink:0}
.pill{font-size:10.5px;letter-spacing:.05em;text-transform:uppercase;padding:3px 7px;border-radius:20px;font-weight:650;white-space:nowrap}
.pill.ok,.pill.approved{background:var(--sage-soft);color:var(--sage-ink)}
.pill.soon,.pill.pending{background:var(--yellow-soft);color:var(--yellow-ink)}
.pill.no,.pill.rejected{background:var(--stop-soft);color:var(--stop)}
.pill.cancelled{background:#edeadf;color:var(--ink-3)}
.empty{padding:26px 16px;text-align:center;color:var(--ink-3);font-size:13.5px}

/* A request row carries four facts and three controls, so it gets room to
   breathe and an explicit reading order rather than one dense line. */
.panel-lede{margin:0;padding:12px 16px;border-bottom:1px solid var(--line);font-size:13px;color:var(--ink-2);line-height:1.55}
.rows li.req{align-items:flex-start;padding:15px 16px;gap:14px}
.rows li.req .grow b{font-size:14.5px}
.rows li.req .what{display:block;font-size:13.5px;color:var(--ink);margin-top:4px}
.rows li.req .meta{display:block;font-size:12.5px;color:var(--ink-3);margin-top:4px}
.rows li.req .why{display:block;font-size:12.5px;margin-top:6px}
.rows li.req .why.block{color:var(--stop)}
.rows li.req .why.warn{color:var(--yellow-ink)}
.rows li.req .acts{flex-wrap:wrap;justify-content:flex-end;max-width:260px}
@media (max-width:620px){
  .rows li.req{flex-wrap:wrap}
  .rows li.req .acts{max-width:none;width:100%;justify-content:flex-start}
}

/* selecting several requests. The checkbox is the whole of the selection UI:
   no script runs on this page, so "tick the ones that pass" is a link that
   re-renders the queue pre-ticked (?select=passing), not a toggle. */
.rows li.req .pick{flex:0 0 auto;display:flex;align-items:center;padding-top:2px;cursor:pointer}
.rows li.req .pick input{width:17px;height:17px;accent-color:var(--ink);cursor:pointer}
.batch-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:13px 16px;border-top:1px solid var(--line);background:var(--paper)}
.batch-bar .batch-pick{display:flex;gap:6px;flex-wrap:wrap;flex:1}
.batch-bar .batch-go{display:flex;gap:6px;flex-wrap:wrap}
.batch-reason{display:block;padding:0 16px 14px;font-size:12.5px;color:var(--ink-3);background:var(--paper)}
.batch-reason span{display:block;margin-bottom:5px}
.batch-reason input{width:100%;box-sizing:border-box}
@media (max-width:620px){.batch-bar .batch-go{width:100%}}

/* key/value list on one request */
.rows.kv li{align-items:flex-start;gap:16px}
.rows.kv .k{flex:0 0 140px;font-size:11px;text-transform:uppercase;letter-spacing:.07em;color:var(--ink-3);padding-top:2px}
.rows.kv .v{flex:1;min-width:0;font-size:14px}
@media (max-width:620px){.rows.kv li{flex-direction:column;gap:3px}.rows.kv .k{flex:none}}
.acts-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.acts-row form{display:inline}

/* "or make it every Tuesday" — the way into a weekly booking, on the confirm
   screen. A plain GET form, so it works with scripting off; separated from the
   single-hour button by a rule rather than a second panel, because it is the
   same request with one more question asked of it. */
.repeat{margin-top:18px;padding-top:16px;border-top:1px solid var(--line)}
.repeat h3{font-family:var(--head);font-size:15px;font-weight:650;margin:0 0 5px}
.repeat p{font-size:13px;color:var(--ink-2);line-height:1.6;margin:0 0 12px}
.repeat label{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.07em;color:var(--ink-3);margin-bottom:5px}
.repeat input[type=date]{font:inherit;font-size:14px;padding:8px 10px;border:1px solid var(--line);border-radius:7px;background:#fff;color:var(--ink);margin-right:8px}
.repeat .muted{display:block;font-size:12px;margin-top:9px;line-height:1.55}

/* ---------------- footer ---------------- */
/* --ink-3 is 4.83:1 on white but only 4.22:1 on the cream ground, so the
   footer carries its own slightly darker grey (4.8:1 on cream). */
footer{border-top:1px solid var(--line);margin-top:8px;padding:28px 0 40px;font-size:12px;color:#6b6960;line-height:1.7}
footer .powered{display:block;margin-top:10px;color:var(--ink-2)}
footer .powered b{font-weight:600;color:var(--ink)}
.cred{font-size:12.5px;color:var(--ink-2);background:var(--paper);border:1px solid var(--line);
  border-radius:var(--radius);padding:11px 13px;margin-top:16px;line-height:1.7}
.cred code{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-sm);padding:1px 5px;font-size:12px}
