/* ============================================================
   HOME SHOWS — Interactive floor-plan engine styles
   Pairs with js/floorplan.js. Self-contained: defines the booth
   tier/status palette + the .hsx-booth markup contract so it works
   on pages that DON'T load exhibitor.css (venue pages, explore page).
   Where exhibitor.css is also present the rules are identical.
   Built on css/styles.css tokens (--gold, --ink, --line, --cream…).
   ============================================================ */

/* ---- tier + board palette (shared contract with exhibitor.css) ---- */
:root{
  --t-standard:#7e98b0;
  --t-corner:#4f9e83;
  --t-island:#e8b84e;
  --t-vignette:#b1567f;
  --t-sold:#b9b3a7;
  --t-hold:#dca73c;
  --fp-board:#f3ede0;
  --fp-board-line:rgba(20,18,14,.10);
  --fp-hall:rgba(20,18,14,.035);
  --fp-hall-line:rgba(20,18,14,.16);
  --fp-feature:rgba(20,18,14,.06);
}
html[data-theme="dark"]{
  --t-sold:#5b564d;
  --fp-board:#16130f;
  --fp-board-line:rgba(255,255,255,.07);
  --fp-hall:rgba(255,255,255,.025);
  --fp-hall-line:rgba(255,255,255,.12);
  --fp-feature:rgba(255,255,255,.05);
}

/* ============================================================
   SHELL
   ============================================================ */
.hsfp{
  display:flex;flex-direction:column;
  border:1px solid var(--line);border-radius:16px;overflow:hidden;
  background:var(--surface);box-shadow:var(--shadow-card);min-width:0;
}
.hsfp-bar{
  display:flex;align-items:center;gap:.55rem;flex-wrap:wrap;
  padding:.6rem .8rem;border-bottom:1px solid var(--line);background:var(--cream);min-width:0;
}
.hsfp-title{
  font-family:var(--font-display);font-weight:700;font-size:.86rem;letter-spacing:.03em;
  color:var(--ink);flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.hsfp-sp{margin-left:auto;flex:1 0 0;}

/* hall chips */
.hsfp-halls{display:inline-flex;gap:.3rem;flex-wrap:wrap;}
.hsfp-halls button{
  font-family:var(--font-display);font-weight:600;font-size:.68rem;letter-spacing:.04em;
  padding:.34em .7em;border-radius:999px;border:1.5px solid var(--line);
  background:var(--surface);color:var(--ink-soft);cursor:pointer;transition:.16s;white-space:nowrap;
}
.hsfp-halls button:hover{border-color:var(--gold);color:var(--gold-dark);}
.hsfp-halls button.active{background:var(--ink);border-color:var(--ink);color:#fff;}
html[data-theme="dark"] .hsfp-halls button.active{background:var(--gold);border-color:var(--gold);color:#1a160d;}

/* search */
.hsfp-searchwrap{flex:1 1 180px;min-width:120px;max-width:340px;}
.hsfp-search{
  width:100%;border:1.5px solid var(--line);border-radius:10px;background:var(--surface);
  color:var(--ink);font:inherit;font-size:.84rem;padding:.5em .8em;transition:.16s;
}
.hsfp-search:focus{outline:none;border-color:var(--gold);}

/* view toggle */
.hsfp-view{display:inline-flex;border:1.5px solid var(--line);border-radius:10px;overflow:hidden;}
.hsfp-view button{
  font-family:var(--font-display);font-weight:600;font-size:.72rem;padding:.45em .85em;
  border:none;background:var(--surface);color:var(--ink-soft);cursor:pointer;transition:.16s;
}
.hsfp-view button.active{background:var(--gold);color:#1a160d;}

/* zoom */
.hsfp-zoom{display:inline-flex;gap:.3rem;flex:none;}
.hsfp-zoom button{
  width:36px;height:36px;border-radius:10px;border:1.5px solid var(--line);
  background:var(--surface);color:var(--ink);font-size:1.05rem;line-height:1;font-weight:600;
  cursor:pointer;display:grid;place-items:center;transition:.16s;
}
.hsfp-zoom button:hover{border-color:var(--gold);color:var(--gold-dark);}
.hsfp-zoom button[data-z="fit"]{font-size:.62rem;letter-spacing:.06em;}

/* E5/E2 — Blueprint, Labels AND the "Source plan" alignment overlay are DEV/ADMIN
   toolbar controls. The engine already omits them from the markup for public/exhibitor/
   default audiences (gated on devTools = admin|editor mode/audience); this CSS is the
   runtime safety net so if the audience is switched at runtime (admin Maps preview,
   where _paint() rebuilds the SVG but NOT the toolbar) none of these dev controls can
   leak onto a non-admin surface — incl. the kiosk (data-audience=public) AND the default
   public explore page, which loads without ?view so data-audience is EMPTY ("").
   The empty-audience net is scoped to NON admin/editor modes so the legacy admin editor
   (admin/floor-plan.html: mode='admin', no explicit audience -> data-audience="") keeps
   its dev tools. ONLY admin/editor surfaces show the dev overlays. */
.hsfp[data-audience="public"] .hsfp-blueprint,
.hsfp[data-audience="public"] .hsfp-labels,
.hsfp[data-audience="public"] .hsfp-overlayctl,
.hsfp[data-audience="public"] .hsfp-overlaybtn,
.hsfp[data-audience="exhibitor"] .hsfp-blueprint,
.hsfp[data-audience="exhibitor"] .hsfp-labels,
.hsfp[data-audience="exhibitor"] .hsfp-overlayctl,
.hsfp[data-audience="exhibitor"] .hsfp-overlaybtn,
.hsfp[data-audience=""]:not([data-mode="admin"]):not([data-mode="editor"]) .hsfp-blueprint,
.hsfp[data-audience=""]:not([data-mode="admin"]):not([data-mode="editor"]) .hsfp-labels,
.hsfp[data-audience=""]:not([data-mode="admin"]):not([data-mode="editor"]) .hsfp-overlayctl,
.hsfp[data-audience=""]:not([data-mode="admin"]):not([data-mode="editor"]) .hsfp-overlaybtn{display:none!important;}

/* fullscreen toggle (toolbar) */
.hsfp-fs{display:inline-flex;flex:none;}
.hsfp-fsbtn{
  width:36px;height:36px;border-radius:10px;border:1.5px solid var(--line);
  background:var(--surface);color:var(--ink);cursor:pointer;display:grid;place-items:center;transition:.16s;
}
.hsfp-fsbtn:hover{border-color:var(--gold);color:var(--gold-dark);}
.hsfp-fsbtn.active{background:var(--gold);border-color:var(--gold);color:#1a160d;}
.hsfp-fsbtn svg{width:18px;height:18px;display:block;}

/* fullscreen layer (CSS overlay; sits above the site header z-index:200) */
.hsfp.is-fullscreen{
  position:fixed;inset:0;z-index:9000;width:100vw;height:100vh;height:100dvh;
  max-width:none;margin:0;border:0;border-radius:0;box-shadow:none;background:var(--surface);
}
.hsfp.is-fullscreen .hsfp-stage{height:auto;flex:1 1 auto;min-height:0;}
.hsfp.is-fullscreen .hsfp-hint{display:none;}
html.hsfp-fs-lock,html.hsfp-fs-lock body{overflow:hidden;}
/* keep the body-appended sheet/tooltip above the fullscreen map */
html.hsfp-fs-lock .hsfp-sheet{z-index:9200;}
html.hsfp-fs-lock .hsfp-tip{z-index:9300;}

/* exit-fullscreen close button (shown only in fullscreen) */
.hsfp-fsclose{
  position:absolute;top:.8rem;right:.8rem;z-index:9100;display:none;place-items:center;
  width:44px;height:44px;border-radius:50%;border:1.5px solid var(--line);
  background:var(--surface);color:var(--ink);cursor:pointer;box-shadow:var(--shadow-card);transition:.16s;
}
.hsfp.is-fullscreen .hsfp-fsclose{display:grid;}
.hsfp-fsclose:hover{border-color:var(--gold);color:var(--gold-dark);transform:scale(1.06);}
.hsfp-fsclose svg{width:20px;height:20px;display:block;}

/* stage */
.hsfp-stage{
  position:relative;background:var(--fp-board);overflow:hidden;
  height:min(68vh,640px);min-height:300px;touch-action:none;cursor:grab;
}
.hsfp[data-mode="mini"] .hsfp-stage{height:auto;cursor:default;aspect-ratio:16/10;}
.hsfp.hsfp-grabbing .hsfp-stage{cursor:grabbing;}
.hsfp-svg{display:block;width:100%;height:100%;user-select:none;-webkit-user-select:none;}
.hsfp[data-mode="mini"] .hsfp-svg{pointer-events:none;}

.hsfp-hint{
  text-align:center;font-size:.72rem;color:var(--muted);padding:.5rem .8rem;
  background:var(--cream);border-top:1px solid var(--line);
}
@media (pointer:fine){.hsfp-hint{display:none;}}
.hsfp[data-mode="mini"] .hsfp-hint{display:none;}
.hsfp-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);}
.hsfp-error{padding:2rem;text-align:center;color:var(--muted);}

/* ============================================================
   SVG PRIMITIVES
   ============================================================ */
.hsfp-floor{fill:var(--fp-board);}
.hsfp-hall{fill:var(--fp-hall);stroke:var(--fp-hall-line);stroke-width:1.5;}
/* clean architectural walls (redrawn, not traced): solid building structure */
.hsfp-wall{fill:none;stroke:#3b352b;stroke-width:3;stroke-linejoin:round;stroke-linecap:round;}
.hsfp-wall--thin{stroke-width:1.6;stroke:#6b6354;}
html[data-theme="dark"] .hsfp-wall{stroke:#cdc4ae;}
html[data-theme="dark"] .hsfp-wall--thin{stroke:#8a8170;}
.hsfp-door{fill:none;stroke:#6b6354;stroke-width:1.4;stroke-linecap:round;opacity:.85;}
html[data-theme="dark"] .hsfp-door{stroke:#9a9180;}
.hsfp-fold{fill:none;stroke:#3b352b;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;opacity:.9;}
html[data-theme="dark"] .hsfp-fold{stroke:#cdc4ae;}
.hsfp-halllabel{
  font-family:var(--font-display);font-weight:700;font-size:15px;letter-spacing:.14em;
  text-transform:uppercase;fill:var(--muted);
}
.hsfp-aislelabel{font-family:var(--font-display);font-weight:600;font-size:10px;letter-spacing:.12em;text-transform:uppercase;fill:var(--muted);opacity:.7;text-anchor:middle;}

.hsfp-lm{fill:var(--fp-feature);stroke:var(--fp-board-line);stroke-width:1.2;}
.hsfp-lm--pillar{fill:rgba(20,18,14,.22);stroke:none;}
html[data-theme="dark"] .hsfp-lm--pillar{fill:rgba(255,255,255,.28);}
.hsfp-lm--door{fill:none;stroke:var(--gold);stroke-width:2.5;stroke-linecap:round;}
.hsfp-lm--room,.hsfp-lm--stairs,.hsfp-lm--restroom,.hsfp-lm--office,.hsfp-lm--util,.hsfp-lm--elevator{
  fill:rgba(20,18,14,.02);stroke:#6b6354;stroke-width:1.3;
}
html[data-theme="dark"] .hsfp-lm--room,html[data-theme="dark"] .hsfp-lm--stairs,
html[data-theme="dark"] .hsfp-lm--restroom,html[data-theme="dark"] .hsfp-lm--office,
html[data-theme="dark"] .hsfp-lm--util,html[data-theme="dark"] .hsfp-lm--elevator{stroke:#8a8170;}
html[data-theme="dark"] .hsfp-lm--room,html[data-theme="dark"] .hsfp-lm--stairs,
html[data-theme="dark"] .hsfp-lm--restroom,html[data-theme="dark"] .hsfp-lm--office,
html[data-theme="dark"] .hsfp-lm--util,html[data-theme="dark"] .hsfp-lm--elevator{fill:rgba(255,255,255,.03);}
.hsfp-lm--restroom{fill:rgba(79,158,131,.06);}
.hsfp-stairsx{fill:none;stroke:var(--fp-board-line);stroke-width:1;opacity:.65;}
/* traced-mode clean room-label chip: board-coloured backing that masks the
   scanned room text under a re-typeset brand label (only renders when
   meta.tracedLabels is on AND landmark coords are authored in trace space). */
.hsfp-lm-chip{fill:var(--fp-board,#f4efe4);opacity:1;stroke:none;}
.hsfp-lm--room+.hsfp-lmlabel,.hsfp-lmlabel{}
/* reference image (official plan) — hidden until Compare toggled */
.hsfp-refimg{display:none;}
.hsfp-svg.show-ref .hsfp-refimg{display:block;}
.hsfp-svg.show-ref .hsfp-booths{opacity:.45;}
.hsfp-compare,.hsfp-blueprint{font-family:var(--font-display);font-weight:600;font-size:.72rem;padding:.45em .85em;border-radius:10px;border:1.5px solid var(--line);background:var(--surface);color:var(--ink-soft);cursor:pointer;transition:.16s;white-space:nowrap;}
.hsfp-compare:hover,.hsfp-blueprint:hover{border-color:var(--gold);color:var(--gold-dark);}
.hsfp-compare.active,.hsfp-blueprint.active{background:var(--ink);border-color:var(--ink);color:#fff;}
.hsfp-svg.hide-plan .hsfp-plan{display:none;}
.hsfp-lm--stage,.hsfp-lm--grandPrize,.hsfp-lm--showHouse{fill:rgba(232,184,78,.14);stroke:var(--gold);stroke-width:1.5;stroke-dasharray:5 3;}
.hsfp-lm--culinary,.hsfp-lm--food,.hsfp-lm--bar,.hsfp-lm--restaurant,.hsfp-lm--dining,.hsfp-lm--concession{fill:rgba(79,158,131,.12);stroke:#4f9e83;stroke-width:1.4;stroke-dasharray:5 3;}
.hsfp-lmlabel{
  font-family:var(--font-display);font-weight:700;font-size:12px;letter-spacing:.08em;
  text-transform:uppercase;fill:var(--ink-soft);text-anchor:middle;dominant-baseline:central;
}
.hsfp-lm-ic{fill:none;stroke:var(--ink-soft);stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;opacity:.8;}
.hsfp-entrance{}
.hsfp-arrowic{fill:none;stroke:var(--gold-dark);stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;}
.hsfp-entlabel{font-family:var(--font-display);font-weight:700;font-size:11px;letter-spacing:.1em;text-transform:uppercase;fill:var(--gold-dark);text-anchor:middle;}

/* booths — the shared .hsx-booth contract */
.hsx-booth{cursor:pointer;}
.hsx-booth:focus{outline:none;}
.hsx-booth:focus-visible .bx{stroke:var(--gold);stroke-width:3;}
.hsx-booth .bx{stroke:rgba(0,0,0,.18);stroke-width:1;transition:filter .12s ease;}
.hsx-booth .blab{
  font-family:var(--font-display);font-size:9px;font-weight:600;fill:rgba(20,16,10,.7);
  pointer-events:none;text-anchor:middle;dominant-baseline:central;
}
.hsx-booth[data-tier="standard"] .bx{fill:var(--t-standard);}
.hsx-booth[data-tier="corner"]   .bx{fill:var(--t-corner);}
.hsx-booth[data-tier="island"]   .bx{fill:var(--t-island);}
.hsx-booth[data-tier="vignette"] .bx{fill:var(--t-vignette);}
.hsx-booth[data-tier="vignette"] .blab,
.hsx-booth[data-tier="island"] .blab{fill:rgba(20,16,10,.82);}

.hsx-booth:hover .bx{filter:brightness(1.08) drop-shadow(0 2px 5px rgba(0,0,0,.3));}
.hsx-booth.is-selected .bx{fill:var(--gold)!important;stroke:#7a5a12;stroke-width:2.5;filter:drop-shadow(0 0 0 3px rgba(232,184,78,.45));animation:hsfp-pop .28s ease;}
.hsx-booth.is-selected .blab{fill:#1a160d;font-weight:700;}
@keyframes hsfp-pop{0%{transform:scale(.7);}60%{transform:scale(1.12);}100%{transform:scale(1);}}
@media (prefers-reduced-motion:reduce){.hsx-booth.is-selected .bx{animation:none;}}

.hsx-booth[data-status="sold"]{cursor:default;}
.hsx-booth[data-status="sold"] .bx{fill:var(--t-sold);opacity:.55;}
.hsx-booth[data-status="sold"] .blab{fill:rgba(20,16,10,.45);}
/* E4 — 'held' is the live API's name for a hold; alias it to the hold look
   (dashed amber stroke = the non-colour cue). 'hold' kept for the picker layer. */
.hsx-booth[data-status="hold"] .bx,
.hsx-booth[data-status="held"] .bx{fill:none;stroke:var(--t-hold);stroke-width:2;stroke-dasharray:5 3;}
.hsx-booth[data-status="hold"] .blab,
.hsx-booth[data-status="held"] .blab{fill:var(--t-hold);}
/* E4 — 'blocked' (unavailable / fire-marshal / structural): a clearly DIFFERENT,
   non-colour cue from hold — a dense dotted border + dimmed grey fill + a
   not-allowed cursor — so it's distinguishable without relying on colour alone. */
.hsx-booth[data-status="blocked"]{cursor:not-allowed;}
.hsx-booth[data-status="blocked"] .bx{
  fill:var(--muted,#8b8170);opacity:.32;
  stroke:var(--ink-soft,#6b6256);stroke-width:1.6;stroke-dasharray:1.5 3;
}
.hsx-booth[data-status="blocked"] .blab{fill:rgba(20,16,10,.4);}
/* explore: an assigned booth reads as occupied (subtle), still tappable */
.hsfp[data-mode="explore"] .hsx-booth[data-assigned="1"] .bx{stroke:rgba(0,0,0,.32);stroke-width:1.4;}

.hsx-booth.dim{opacity:.16;pointer-events:none;}
.hsx-booth.hsfp-flash .bx{animation:hsfp-flash 1.2s ease;}
@keyframes hsfp-flash{0%,100%{filter:none;}30%,70%{filter:drop-shadow(0 0 0 4px rgba(232,184,78,.7)) brightness(1.12);}}

/* hide booth-id labels when fully zoomed out (de-clutter). In traced mode the
   crisp numbers REPLACE the baked plan numbers (which are always visible anyway),
   so keep them shown — otherwise masked cells would look blank when zoomed out. */
.hsfp-svg:not(.is-traced).hsfp-zoomed-out .blab{opacity:0;}
.hsfp-svg .blab{transition:opacity .15s;}

/* ============================================================
   TRACED VENUES — the real plan, vectorised, is the base layer.
   Booths become invisible interactive hotspots over the printed
   grid; they only light up on hover / selection / status.
   ============================================================ */
/* clean branded line layer (NOT the black photocopy): the traced geometry
   rendered as soft warm ink on the cream board, slightly knocked back so the
   booth layer reads on top. */
.hsfp-plan{pointer-events:none;opacity:.72;}
.hsfp-plan path{fill:#5b5446;}
html[data-theme="dark"] .hsfp-plan{opacity:.9;}
html[data-theme="dark"] .hsfp-plan path{fill:#b8ad97;}
.hsfp-svg.is-traced .hsfp-floor{fill:var(--fp-board,#f4efe4);}
/* booths: clean redrawn cells (subtle tint) with re-typeset numbers, masking
   the scanned cell/number underneath so it reads as a designed map. */
.hsfp-svg.is-traced .hsx-booth .bx{fill:rgba(108,142,176,.16);stroke:none;transition:fill .1s,stroke .1s;}
.hsfp-svg.is-traced .hsx-booth[data-tier="corner"] .bx{fill:rgba(120,166,138,.18);stroke:none;}
.hsfp-svg.is-traced .blab{fill:#23201a;font-weight:600;}
.hsfp-svg.is-traced .hsx-booth:hover .bx{fill:rgba(232,184,78,.55);stroke:var(--gold);stroke-width:2;filter:none;}
.hsfp-svg.is-traced .hsx-booth.is-selected .bx{fill:var(--gold)!important;stroke:#7a5a12;stroke-width:2.5;}
.hsfp-svg.is-traced .hsx-booth[data-status="sold"] .bx{fill:var(--t-sold);opacity:.75;stroke:none;}
.hsfp-svg.is-traced .hsx-booth[data-status="hold"] .bx,
.hsfp-svg.is-traced .hsx-booth[data-status="held"] .bx{fill:none;stroke:var(--t-hold);stroke-width:2;stroke-dasharray:5 3;}
.hsfp-svg.is-traced .hsx-booth[data-status="blocked"] .bx{fill:var(--muted,#8b8170);opacity:.34;stroke:var(--ink-soft,#6b6256);stroke-width:1.6;stroke-dasharray:1.5 3;}
.hsfp-svg.is-traced .hsx-booth[data-assigned="1"] .bx{fill:rgba(79,158,131,.5);stroke:rgba(60,110,80,.55);stroke-width:1.2;}
/* exhibitor audience — guide the eye to open booths (greener/present), fade taken ones */
.hsfp[data-audience="exhibitor"] .hsfp-svg.is-traced .hsx-booth[data-status="available"] .bx{fill:rgba(120,166,138,.32);}
.hsfp[data-audience="exhibitor"] .hsfp-svg.is-traced .hsx-booth[data-status="sold"] .bx{opacity:.4;}
/* OCR-verified (or selected) cells get an opaque board-coloured backing that masks
   the wavy baked plan number, then a slightly stronger tint + the crisp re-typeset
   number on top — so the number reads clean and sharp from our own layer. */
.hsfp-svg.is-traced .bxmask{fill:var(--fp-board);stroke:none;pointer-events:none;}
.hsfp-svg.is-traced .hsx-booth.is-numbered .bx{fill:rgba(108,142,176,.24);}
.hsfp-svg.is-traced .hsx-booth.is-numbered[data-tier="corner"] .bx{fill:rgba(120,166,138,.26);}
.hsfp-svg.is-traced .hsx-booth.is-numbered[data-status="sold"] .bx{fill:var(--t-sold);opacity:.8;}
.hsfp-svg.is-traced .hsx-booth.is-numbered[data-status="blocked"] .bx{fill:var(--muted,#8b8170);opacity:.4;stroke:var(--ink-soft,#6b6256);stroke-width:1.6;stroke-dasharray:1.5 3;}
.hsfp-svg.is-traced .hsx-booth.is-numbered[data-status="held"] .bx{fill:none;stroke:var(--t-hold);stroke-width:2;stroke-dasharray:5 3;}
.hsfp-svg.is-traced .hsx-booth.is-numbered[data-assigned="1"] .bx{fill:rgba(79,158,131,.55);}
/* unverified booths keep the baked plan number while the blueprint shows — hide our
   (fallback) label so it doesn't double; reveal it when the blueprint is toggled off
   so every booth still shows a number in the booths-only view. */
.hsfp-svg.is-traced:not(.hide-plan) .hsx-booth:not(.is-numbered) .blab{opacity:0;}

/* E1 — KEYBOARD FOCUS RING ON TRACED VENUES (a11y).
   The shared focus ring `.hsx-booth:focus-visible .bx` (specificity 0,2,1) is BEATEN
   on traced venues (FTL / Palm Beach / Miami / explore / kiosk) by the traced base
   rules `.hsfp-svg.is-traced .hsx-booth .bx` (0,3,1) and `…is-numbered .bx`, which set
   stroke:none — so a keyboard-focused booth showed NO ring. Re-raise the ring's
   specificity inside the traced scope so it WINS over every traced booth `.bx` rule
   (incl. .is-numbered, tier and status variants). Gold 3px ring == the non-traced look. */
.hsfp-svg.is-traced .hsx-booth:focus-visible .bx,
.hsfp-svg.is-traced .hsx-booth.is-numbered:focus-visible .bx{
  stroke:var(--gold);stroke-width:3;
}

/* ============================================================
   ROOMS — selectable, clean-labelled edge rooms / amenities.
   Each room's re-typeset label sits on a board-coloured chip that
   MASKS the scanned plan text underneath (the vtrace text is mangled).
   ============================================================ */
.hsx-room .rbx{fill:rgba(20,18,14,.028);stroke:#6b6354;stroke-width:1.3;stroke-linejoin:round;transition:fill .12s,stroke .12s;}
html[data-theme="dark"] .hsx-room .rbx{fill:rgba(255,255,255,.035);stroke:#8a8170;}
.hsx-room.is-selectable{cursor:pointer;}
.hsx-room.is-selectable:hover .rbx{fill:rgba(232,184,78,.2);stroke:var(--gold);stroke-width:1.8;}
.hsx-room.is-selected .rbx{fill:rgba(232,184,78,.32)!important;stroke:#7a5a12;stroke-width:2.2;}
.hsx-room:focus{outline:none;}
.hsx-room:focus-visible .rbx{stroke:var(--gold);stroke-width:2.4;}
/* restroom: tinted + stall partitions so it reads as a restroom when zoomed */
.hsfp-room--restroom .rbx{fill:rgba(79,158,131,.1);stroke:#4f9e83;}
.hsfp-rr-stall{fill:none;stroke:#4f9e83;stroke-width:1;opacity:.5;pointer-events:none;}
html[data-theme="dark"] .hsfp-rr-stall{stroke:#7fbfa5;opacity:.45;}
/* amenity types keep the branded dashed feature-box look */
.hsfp-room--stage .rbx,.hsfp-room--grandPrize .rbx,.hsfp-room--showHouse .rbx{fill:rgba(232,184,78,.14);stroke:var(--gold);stroke-width:1.5;stroke-dasharray:5 3;}
.hsfp-room--culinary .rbx,.hsfp-room--food .rbx,.hsfp-room--bar .rbx,.hsfp-room--restaurant .rbx,.hsfp-room--dining .rbx,.hsfp-room--concession .rbx{fill:rgba(79,158,131,.12);stroke:#4f9e83;stroke-width:1.4;stroke-dasharray:5 3;}
/* E1 — KEYBOARD FOCUS RING ON ROOMS (a11y), incl. traced venues + amenity rooms.
   The room-type stroke rules above (restroom/stage/culinary…) and the traced base
   `.hsfp-svg.is-traced .hsx-room .rbx` could mask the focus ring (a dashed coloured
   stroke instead of the solid gold ring). Re-assert a SOLID gold ring on focus, scoped
   so it wins over every room-type + traced rule and clears their dasharray. */
.hsx-room:focus-visible .rbx,
.hsfp-svg.is-traced .hsx-room:focus-visible .rbx{
  stroke:var(--gold);stroke-width:2.4;stroke-dasharray:none;
}
/* board-coloured chip masks the scanned label; the re-typeset brand label on top */
.rchip{fill:var(--fp-board,#f4efe4);opacity:1;stroke:none;pointer-events:none;}
.rlab{
  font-family:var(--font-display);font-weight:700;font-size:11px;letter-spacing:.05em;
  text-transform:uppercase;fill:var(--ink-soft);text-anchor:middle;dominant-baseline:central;pointer-events:none;
}

/* ============================================================
   SOURCE-PLAN OVERLAY — the original scanned plan on top for alignment QA.
   Opacity driven by the toolbar slider via the --fp-overlay-op CSS var.
   ============================================================ */
.hsfp-overlay{display:none;opacity:var(--fp-overlay-op,.55);pointer-events:none;}
.hsfp-svg.show-overlay .hsfp-overlay{display:block;}

/* LABELS toggle — hide every re-typeset label (booth #s, room names, amenities). */
.hsfp-svg.hide-labels .blab,
.hsfp-svg.hide-labels .rlab,
.hsfp-svg.hide-labels .hsfp-lmlabel,
.hsfp-svg.hide-labels .hsfp-aislelabel,
.hsfp-svg.hide-labels .hsfp-halllabel{display:none;}

/* toolbar: labels + source-plan controls reuse the blueprint button styling */
.hsfp-labels,.hsfp-overlaybtn{font-family:var(--font-display);font-weight:600;font-size:.72rem;padding:.45em .85em;border-radius:10px;border:1.5px solid var(--line);background:var(--surface);color:var(--ink-soft);cursor:pointer;transition:.16s;white-space:nowrap;}
.hsfp-labels:hover,.hsfp-overlaybtn:hover{border-color:var(--gold);color:var(--gold-dark);}
.hsfp-labels.active,.hsfp-overlaybtn.active{background:var(--ink);border-color:var(--ink);color:#fff;}
html[data-theme="dark"] .hsfp-labels.active,html[data-theme="dark"] .hsfp-overlaybtn.active{background:var(--gold);border-color:var(--gold);color:#1a160d;}
.hsfp-overlayctl{display:inline-flex;align-items:center;gap:.4rem;}
.hsfp-opacity{width:84px;accent-color:var(--gold);cursor:pointer;}

/* ============================================================
   TOOLTIP (desktop) — mirrors .hsx-tip
   ============================================================ */
.hsfp-tip{
  position:fixed;z-index:1200;pointer-events:none;opacity:0;transform:translateY(4px);transition:opacity .12s;
  background:#15130f;color:#f4efe4;border:1px solid rgba(232,184,78,.4);border-radius:10px;
  padding:.55rem .7rem;font-size:.78rem;line-height:1.45;max-width:230px;box-shadow:0 12px 30px rgba(0,0,0,.4);
}
.hsfp-tip.show{opacity:1;transform:none;}
.hsfp-tip b{font-family:var(--font-display);display:block;font-size:.85rem;margin-bottom:.1rem;}
.hsfp-tip .ttag{display:inline-block;margin-top:.2rem;font-size:.66rem;letter-spacing:.06em;text-transform:uppercase;opacity:.85;}

/* ============================================================
   LIST / SEARCH-RESULTS FALLBACK
   ============================================================ */
.hsfp-list{padding:1rem 1rem 1.4rem;max-height:min(68vh,640px);overflow:auto;}
.hsfp-list-group{margin-bottom:1.2rem;}
.hsfp-list-group h4{
  font-family:var(--font-display);font-weight:700;font-size:.82rem;letter-spacing:.04em;
  color:var(--ink);margin:0 0 .6rem;display:flex;align-items:center;gap:.5rem;
}
.hsfp-list-group h4 small{color:var(--muted);font-weight:600;}
.hsfp-list-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(108px,1fr));gap:.5rem;}
.hsfp-lbooth{
  display:flex;flex-direction:column;gap:.15rem;text-align:left;
  border:1.5px solid var(--line);border-radius:10px;background:var(--surface);
  padding:.5em .65em;cursor:pointer;transition:.16s;min-width:0;
}
.hsfp-lbooth:hover{border-color:var(--gold);}
.hsfp-lbooth.is-selected{border-color:var(--gold);background:rgba(232,184,78,.12);}
.hsfp-lbooth .bid{font-family:var(--font-display);font-weight:700;font-size:.92rem;color:var(--ink);}
.hsfp-lbooth .bex{font-size:.72rem;color:var(--ink-soft);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.hsfp-lbooth .bex.muted{color:var(--muted);}
.hsfp-lbooth[data-status="sold"]{opacity:.6;}
.hsfp-empty{color:var(--muted);text-align:center;padding:2rem 1rem;}

/* ============================================================
   BOTTOM SHEET / SIDE DRAWER (explore + admin)
   ============================================================ */
.hsfp-sheet{
  position:fixed;z-index:1100;left:0;right:0;bottom:0;
  background:var(--surface);color:var(--ink);
  border-top:3px solid var(--gold);border-radius:18px 18px 0 0;
  box-shadow:0 -18px 50px -16px rgba(0,0,0,.5);
  transform:translateY(100%);transition:transform .28s cubic-bezier(.4,0,.2,1);
  max-height:74vh;overflow:auto;padding:1.2rem 1.3rem 1.6rem;
}
.hsfp-sheet.open{transform:none;}
@media (prefers-reduced-motion:reduce){.hsfp-sheet{transition:none;}}
.hsfp-sheet-x{
  position:absolute;top:.7rem;right:.8rem;width:34px;height:34px;border-radius:50%;
  border:1px solid var(--line);background:var(--cream);color:var(--ink);font-size:1.3rem;line-height:1;cursor:pointer;
}
.hsfp-sheet-eyebrow{font-family:var(--font-display);font-weight:600;font-size:.68rem;letter-spacing:.1em;text-transform:uppercase;color:var(--gold-dark);}
.hsfp-sheet h3{font-family:var(--font-display);font-weight:700;font-size:1.3rem;margin:.3rem 0 .2rem;color:var(--ink);}
.hsfp-sheet-cat{color:var(--ink-soft);font-size:.9rem;margin:.1rem 0 .6rem;}
.hsfp-sheet-logo{max-height:46px;margin:.4rem 0;}
.hsfp-sheet p{font-size:.92rem;line-height:1.55;color:var(--ink-soft);}
.hsfp-sheet p.muted{color:var(--muted);}
.hsfp-sheet-hint{font-size:.78rem;color:var(--muted);margin-top:.8rem;}
.hsfp-sheet-actions{display:flex;gap:.6rem;flex-wrap:wrap;margin-top:1rem;}
.btn.btn-sm{padding:.5em 1.1em;font-size:.78rem;}

/* >= 860px: anchored side drawer instead of bottom sheet */
@media (min-width:860px){
  .hsfp-sheet{
    left:auto;right:1.4rem;bottom:1.4rem;width:340px;border-radius:16px;
    border-top:none;border-left:3px solid var(--gold);
    transform:translateX(120%);max-height:70vh;
  }
  .hsfp-sheet.open{transform:none;}
}

/* ============================================================
   RESPONSIVE
   ============================================================ */
@media (max-width:640px){
  .hsfp-bar{gap:.4rem;padding:.55rem .6rem;}
  .hsfp-title{flex-basis:100%;}
  .hsfp-stage{height:62vh;}
}

/* E3 — >=44px hit-area on every public map control for COARSE pointers (touch),
   regardless of width. The previous rule gated this on max-width:640px, but a
   LANDSCAPE phone is ~844px wide (×390 tall) so its controls fell back to the
   36px desktop size — too small to tap. Switching the gate to (pointer:coarse)
   gives every finger-driven device a >=44px target no matter the orientation/width.
   (Desktop pointer:fine keeps the compact 36px chrome.) */
@media (pointer:coarse){
  .hsfp-zoom button{width:44px;height:44px;}                          /* zoom +/- / FIT */
  .hsfp-fsbtn{width:44px;height:44px;}                                /* toolbar fullscreen */
  .hsfp-view button{min-height:44px;min-width:54px;padding:.45em 1em;}/* Map / List toggle */
  .hsfp-search{min-height:44px;padding:.6em .8em;}                    /* search input */
  .hsfp-sheet-x{width:44px;height:44px;font-size:1.4rem;}            /* info-sheet close */
  .hsfp-fsclose{width:44px;height:44px;}                              /* fullscreen exit */
}

/* ============================================================
   EDITOR LAYER (Phase 1 — client-owned LAYOUT editor).
   Additive: every rule below is scoped to a class the editor emits
   (.hsfp[data-mode="editor"], .hsfp-handle, .is-editing, .hsfp-valstrip…)
   or to elements that exist ONLY in editor mode. Nothing here touches an
   explore/picker/admin/mini render — those stay byte-identical.
   Group / bubble seams (P2/P3) kept below, still inert.
   ============================================================ */

/* selection handles (rect/circle.hsfp-handle[data-handle=nw|ne|sw|se|rot]) */
.hsfp-handles{pointer-events:none;}            /* group is inert; handles re-enable */
.hsfp-handle{
  fill:var(--surface);stroke:var(--gold);stroke-width:1.6;
  rx:1.5;pointer-events:all;cursor:pointer;
  filter:drop-shadow(0 1px 2px rgba(20,18,14,.35));
}
.hsfp-handle:hover{fill:var(--gold);}
.hsfp-handle[data-handle="nw"],.hsfp-handle[data-handle="se"]{cursor:nwse-resize;}
.hsfp-handle[data-handle="ne"],.hsfp-handle[data-handle="sw"]{cursor:nesw-resize;}
.hsfp-handle[data-handle="rot"]{fill:var(--gold);stroke:var(--ink);cursor:grab;}
.hsfp-handle[data-handle="rot"]:active{cursor:grabbing;}
.hsfp-handle-stem{stroke:var(--gold);stroke-width:1.4;stroke-dasharray:3 2;pointer-events:none;}
/* P4.1 touch: a transparent, finger-sized grab pad behind each handle on coarse
   pointers. Invisible (no fill/stroke) but pointer-events:all so the hit-test treats
   it as the handle; only emitted by _renderHandles() when (pointer:coarse). */
.hsfp-handle-slop{fill:transparent;stroke:none;pointer-events:all;cursor:pointer;}
.hsfp-handle-slop[data-handle="nw"],.hsfp-handle-slop[data-handle="se"]{cursor:nwse-resize;}
.hsfp-handle-slop[data-handle="ne"],.hsfp-handle-slop[data-handle="sw"]{cursor:nesw-resize;}
.hsfp-handle-slop[data-handle="rot"]{cursor:grab;}

/* the element currently being edited — gold dashed emphasis on top of selection */
.hsx-booth.is-editing .bx,.hsx-room.is-editing .rbx,
.hsx-booth.is-editing .bxmask{
  stroke:var(--gold)!important;stroke-width:2.2!important;stroke-dasharray:5 3;
}
.hsfp-svg.is-traced .hsx-booth.is-editing .bx{fill:rgba(232,184,78,.4);}

/* editor stage: cell-grid backdrop so the snap grid reads; per-tool cursor */
.hsfp[data-mode="editor"] .hsfp-stage{cursor:default;}
.hsfp[data-mode="editor"].hsfp-grabbing .hsfp-stage{cursor:grabbing;}
.hsfp[data-mode="editor"].hsfp-snap-on .hsfp-stage{
  background-image:
    linear-gradient(to right,var(--fp-board-line) 1px,transparent 1px),
    linear-gradient(to bottom,var(--fp-board-line) 1px,transparent 1px);
  background-size:20px 20px;background-position:0 0;
}
.hsfp[data-mode="editor"][data-tool="move"] .hsx-booth{cursor:move;}
.hsfp[data-mode="editor"][data-tool="insert"] .hsfp-stage{cursor:copy;}
.hsfp[data-mode="editor"][data-tool="delete"] .hsx-booth{cursor:not-allowed;}
.hsfp[data-mode="editor"][data-tool="draw-rect"] .hsfp-stage,
.hsfp[data-mode="editor"][data-tool="draw-poly"] .hsfp-stage{cursor:crosshair;}
.hsfp[data-mode="editor"][data-tool="lock"] .hsx-booth{cursor:pointer;}

/* editor: a locked element reads with a subtle hatch + the lock-out cursor */
.hsfp[data-mode="editor"] .hsx-booth.is-locked .bx,
.hsfp[data-mode="editor"] .hsx-room.is-locked .rbx{
  stroke:#6b6354;stroke-dasharray:2 2;opacity:.7;
}

/* draw preview rectangle (rubber-band while drawing a room) */
.hsfp-draw-preview{
  fill:rgba(232,184,78,.12);stroke:var(--gold);stroke-width:1.6;stroke-dasharray:5 4;
  pointer-events:none;
}

/* booths the editor has TOUCHED (override present) get a faint dirty marker so the
   client can see what they've changed (data-edited stamped by the editor UI). */
.hsfp[data-mode="editor"] .hsx-booth[data-edited="1"] .bx{stroke:var(--gold);stroke-width:1.6;}

/* ---- live validation strip (.hsfp-valstrip[aria-live] > .hsfp-valerr[data-jump]) ---- */
.hsfp-valstrip{
  display:flex;flex-wrap:wrap;gap:.4rem;align-items:center;
  padding:.5rem .7rem;border-top:1px solid var(--line);background:var(--cream);
}
.hsfp-valstrip:empty{display:none;}
.hsfp-valstrip .hsfp-valhead{
  font-family:var(--font-display);font-weight:700;font-size:.72rem;letter-spacing:.05em;
  text-transform:uppercase;color:var(--muted);margin-right:.2rem;
}
.hsfp-valerr,.hsfp-valwarn{
  cursor:pointer;border-radius:6px;padding:.22rem .55rem;font-size:.78rem;font-weight:600;
  border:1.4px solid var(--t-vignette);color:var(--t-vignette);background:rgba(177,86,127,.08);
  transition:.14s;
}
.hsfp-valerr:hover{background:var(--t-vignette);color:#fff;}
.hsfp-valwarn{
  border-color:var(--t-hold);color:var(--gold-dark);background:rgba(220,167,60,.1);
}
.hsfp-valwarn:hover{background:var(--t-hold);color:#1a160d;}
.hsfp-valok{font-size:.78rem;color:var(--t-corner);font-weight:600;}

/* ---- editor toolbar buttons ([data-tool], [data-act]) ---- */
.hsfp-toolbar{display:flex;flex-wrap:wrap;gap:.35rem;align-items:center;}
.hsfp-toolbar [data-tool],.hsfp-toolbar [data-act]{
  font-family:var(--font-display);font-weight:600;font-size:.72rem;
  padding:.42em .7em;border-radius:9px;border:1.5px solid var(--line);
  background:var(--surface);color:var(--ink-soft);cursor:pointer;transition:.14s;white-space:nowrap;
}
.hsfp-toolbar [data-tool]:hover,.hsfp-toolbar [data-act]:hover{border-color:var(--gold);color:var(--gold-dark);}
.hsfp-toolbar [data-tool].active,.hsfp-toolbar [data-tool][aria-pressed="true"]{
  background:var(--ink);border-color:var(--ink);color:#fff;
}
html[data-theme="dark"] .hsfp-toolbar [data-tool].active{background:var(--gold);border-color:var(--gold);color:#1a160d;}
.hsfp-toolbar [data-act][disabled]{opacity:.4;cursor:not-allowed;}
.hsfp-toolbar [data-act="commit"]{background:var(--gold);border-color:var(--gold);color:#1a160d;}
.hsfp-toolbar [data-act="commit"]:hover{filter:brightness(1.05);}

/* save indicator (Saving… / Saved / Local only) */
.hsfp-saveind{font-size:.74rem;font-weight:600;color:var(--muted);display:inline-flex;align-items:center;gap:.3rem;}
.hsfp-saveind[data-state="saved"]{color:var(--t-corner);}
.hsfp-saveind[data-state="saving"]{color:var(--gold-dark);}
.hsfp-saveind[data-state="local"]{color:var(--t-hold);}

/* ---- groups (P2.1) — merged outline + combined "Booths X–Y · WxL" label.
   The group layer (g.hsfp-groups) sits just above the booths; it is inert
   (pointer-events none) so booth taps still hit the cells underneath. Only
   rendered when a group set is present, so an ungrouped map stays unchanged. */
.hsfp-groups{pointer-events:none;}
.hsx-group .hsfp-group-outline{
  fill:none;stroke:var(--gold);stroke-width:2;stroke-linejoin:round;
  stroke-dasharray:6 3;opacity:.9;
}
.hsfp-svg.is-traced .hsx-group .hsfp-group-outline{stroke:var(--gold-dark,#b58a2e);}
.hsfp-grouplabel{
  font-family:var(--font-display);font-weight:700;font-size:11px;letter-spacing:.04em;
  fill:var(--gold-dark,#8a6a1e);text-anchor:middle;dominant-baseline:auto;
  pointer-events:none;paint-order:stroke;stroke:var(--fp-board,#f4efe4);stroke-width:3px;stroke-linejoin:round;
}
html[data-theme="dark"] .hsfp-grouplabel{fill:var(--gold,#e8b84e);stroke:var(--fp-board,#16130f);}
/* group labels follow the global Labels toggle */
.hsfp-svg.hide-labels .hsfp-grouplabel{display:none;}

/* multi-select combined sheet (P2.1): selected booth-number chips */
.hsfp-multi-chips{display:flex;flex-wrap:wrap;gap:.35rem;margin:.6rem 0 .2rem;}
.hsfp-multi-chip{
  font-family:var(--font-display);font-weight:700;font-size:.74rem;letter-spacing:.02em;
  padding:.24em .6em;border-radius:999px;border:1.5px solid var(--gold);
  background:rgba(232,184,78,.12);color:var(--gold-dark,#8a6a1e);white-space:nowrap;
}
html[data-theme="dark"] .hsfp-multi-chip{color:var(--gold,#e8b84e);}
/* ============================================================
   INFO BUBBLES (P3.3) — per-show overlay annotations rendered on the map
   (g.hsfp-bubble in a .hsfp-bubbles layer above the booths). Inert overlay:
   the booth/room underneath stays the interactive element. Only present when
   the overlay supplies bubbles for the current audience, so an un-bubbled map
   renders byte-identical. Title/body are SVG <text> (textContent, never markup).
   ============================================================ */
.hsfp-bubbles{pointer-events:none;}
.hsfp-bubble{pointer-events:none;}
.hsfp-bubble .hsfp-bubble-box{
  fill:var(--surface);stroke:var(--line);stroke-width:1;
  filter:drop-shadow(0 2px 6px rgba(20,18,14,.18));
}
html[data-theme="dark"] .hsfp-bubble .hsfp-bubble-box{stroke:rgba(255,255,255,.16);}
/* connector dot on the anchor + optional accent rail down the card's left edge */
.hsfp-bubble .hsfp-bubble-dot{fill:var(--gold);stroke:var(--surface);stroke-width:1;}
.hsfp-bubble .hsfp-bubble-rail{opacity:.9;}
.hsfp-bubble .hsfp-bubble-title{
  fill:var(--ink);font-family:var(--font-display,var(--font-sans,system-ui,sans-serif));
  font-weight:700;font-size:11px;
}
.hsfp-bubble .hsfp-bubble-body{
  fill:var(--ink-soft,#6b6256);font-family:var(--font-sans,system-ui,sans-serif);
  font-weight:400;font-size:11px;
}
/* E3 — bubble CTA: the one interactive part of an (otherwise inert) bubble. The
   layer/group are pointer-events:none; the <a> re-enables them for itself so it's
   clickable + keyboard-focusable without making the whole bubble swallow taps. */
.hsfp-bubble .hsfp-bubble-cta{pointer-events:all;cursor:pointer;}
.hsfp-bubble .hsfp-bubble-cta-bg{
  fill:var(--gold);stroke:none;transition:filter .14s;
}
.hsfp-bubble .hsfp-bubble-cta-label{
  fill:#1a160d;font-family:var(--font-display,var(--font-sans,system-ui,sans-serif));
  font-weight:700;font-size:10px;letter-spacing:.02em;
}
.hsfp-bubble .hsfp-bubble-cta:hover .hsfp-bubble-cta-bg{filter:brightness(1.06);}
.hsfp-bubble .hsfp-bubble-cta:focus{outline:none;}
.hsfp-bubble .hsfp-bubble-cta:focus-visible .hsfp-bubble-cta-bg,
.hsfp-bubble .hsfp-bubble-cta:focus .hsfp-bubble-cta-bg{
  stroke:var(--ink);stroke-width:2;
}
/* bubbles follow the global Labels toggle so a "hide labels" view hides them too */
.hsfp-svg.hide-labels .hsfp-bubbles{display:none;}

/* ============================================================
   EXHIBITOR "YOU ARE HERE" (P3.3) — the viewer's OWN booth(s) pulse so a
   logged-in exhibitor instantly spots their space. Class .is-own toggled by
   setOwn()/overlay own:[codes]; no-op when no own codes are present.
   ============================================================ */
.hsx-booth.is-own .bx{
  stroke:var(--gold);stroke-width:2.5;
  animation:hsfp-ownpulse 1.8s ease-in-out infinite;
}
.hsfp-svg.is-traced .hsx-booth.is-own .bx{fill:rgba(232,184,78,.5);stroke:var(--gold);}
@keyframes hsfp-ownpulse{
  0%,100%{filter:drop-shadow(0 0 0 0 rgba(232,184,78,.0));}
  50%{filter:drop-shadow(0 0 0 5px rgba(232,184,78,.5));}
}
@media (prefers-reduced-motion:reduce){.hsx-booth.is-own .bx{animation:none;}}

/* names on/off (P3.3): a revealed-company booth gets data-company + .is-named so
   embeds/CSS can surface the name; the map itself keeps the booth NUMBER as the
   cell label (so the traced-number masking still reads), with the company carried
   on the tooltip / info sheet / aria-label. Hook left for surfaces that want a
   visible name chip. */
.hsx-booth.is-named{}

/* ============================================================
   SCARCITY COUNTER (P3.3) — "42 of 180 claimed · 138 left". The engine exposes
   claimedCounts(); the public/embed surfaces render a .hsfp-scarcity chip from it.
   E7 — give it a bg distinct from --cream (uses --ink/--surface) so it stays
   legible when a show page drops it onto a cream section.
   ============================================================ */
.hsfp-scarcity{
  display:inline-flex;align-items:center;gap:.45rem;
  font-family:var(--font-display,system-ui,sans-serif);font-weight:700;
  font-size:.78rem;letter-spacing:.02em;line-height:1;
  padding:.5em .9em;border-radius:999px;
  background:var(--ink,#1f1b14);color:var(--surface,#fff);
  border:1.5px solid var(--ink,#1f1b14);
}
html[data-theme="dark"] .hsfp-scarcity{
  background:var(--surface,#1c1813);color:var(--ink,#f4efe4);
  border-color:var(--line,#3a342b);
}
/* the "X left" emphasis reads in the brand gold against the dark chip */
.hsfp-scarcity .hsfp-scarcity-left{color:var(--gold,#e8b84e);}

/* ============================================================
   P4.1 — REDUCED MOTION (final, consolidated). The targeted blocks above already
   kill the select-pop, the own-pulse and the sheet slide. This sweep also stops the
   "find my booth" FLASH loop, the booth fill/filter cross-fades, the bubble CTA +
   tooltip fades, and the label opacity transition — so a user with
   prefers-reduced-motion gets an instant, motion-free map. Status is conveyed by
   shape/label/aria (see below), never by an animation, so nothing is lost.
   ============================================================ */
@media (prefers-reduced-motion:reduce){
  .hsx-booth.hsfp-flash .bx{animation:none;}
  .hsx-booth .bx,
  .hsfp-svg.is-traced .hsx-booth .bx,
  .hsx-room .rbx,
  .blab,
  .hsfp-tip,
  .hsfp-bubble .hsfp-bubble-cta-bg{transition:none;}
}

/* ============================================================
   P4.1 — STATUS NOT BY COLOUR ALONE (final verification — no visual regression).
   Every booth status already carries a non-colour cue IN ADDITION to its tint, so the
   map stays legible without colour perception:
     available — solid filled cell + its number label shown (the default).
     sold      — dimmed/greyed fill (opacity) + (non-traced) the number label removed
                 + cursor:default; aria-label announces "Reserved".
     held      — dashed AMBER outline (.hsx-booth[data-status=held] .bx, above).
     blocked   — dense DOTTED outline + dimmed fill + cursor:not-allowed (above).
   boothAria() also puts the status word in EVERY cell's aria-label for screen readers,
   so all four states are distinguishable by shape/label/aria, not colour alone.
   (Documented here; no new colour-only rule is introduced and the deployed look of the
   three live venues is unchanged.) */
