/* =========================================================
   The Frugal Cosmopolitan — Luxury Hotels Atlas
   Navy & gold luxury palette (Ralph Lauren Purple Label)
   ========================================================= */

/* ---------- Design tokens ---------- */
:root {
  /* Typography */
  --font-display: 'Cabinet Grotesk', system-ui, sans-serif;
  --font-body: 'Satoshi', system-ui, sans-serif;
  --font-serif: 'Cormorant Garamond', 'Cormorant', Georgia, serif;

  /* Spacing */
  --space-1: 0.25rem;
  --space-2: 0.5rem;
  --space-3: 0.75rem;
  --space-4: 1rem;
  --space-5: 1.5rem;
  --space-6: 2rem;
  --space-8: 3rem;
  --space-10: 4.5rem;
  --space-12: 6rem;

  /* Radii */
  --radius-sm: 3px;
  --radius-md: 6px;
  --radius-lg: 10px;

  /* Transitions */
  --ease: cubic-bezier(.2, .8, .2, 1);
  --dur-fast: 180ms;
  --dur-med: 320ms;

  /* Content max */
  --max-w: 1220px;

  /* HEADER-ALIGN-2026 — shared chrome size so region / Filters / Mode / orbs
     share one horizontal band (same height + type size). */
  --header-control-h: 46px;
  --header-control-fs: 0.9375rem;
  --header-control-pad-x: 16px;
}

/* ---------- Dark theme (default) — Midnight Navy ---------- */
:root[data-theme="dark"] {
  /* DARK-LIGHTEN-2026 — base/editorial dark palette. The old values were a very
     deep midnight NAVY (#0a1628) that read as pitch-black + cold. Per direction
     ("dark not black", and dark mode shouldn't be navy) this is now a lifted,
     warm-neutral charcoal that stays clearly dark but feels lit. The cream/gold
     accents now sit on a slightly warm grey rather than a cold navy.
     Old: bg #0a1628 / elevated #0f1d33 / sunken #070f1d / surface #132443 /
          hover #1a2d52. */
  --bg: #1f2024;                /* warm-neutral charcoal (was #0a1628 navy) */
  --bg-elevated: #26282d;       /* Elevated surfaces */
  --bg-sunken: #191a1e;         /* Header / deep surfaces */
  --surface: #2a2c31;           /* Card surface */
  --surface-hover: #34363d;     /* Card hover */
  --border: rgba(198, 167, 102, 0.18);   /* Gold-tinted border */
  --border-strong: rgba(198, 167, 102, 0.32);
  --text: #f2ead9;              /* Warm cream */
  --text-muted: #b0ac9a;        /* Muted cream */
  --text-faint: #7a7869;        /* Faint */
  /* DARK-CONTRAST-GREEN-2026 — default/editorial dark contrast band. A quiet
     deep eucalyptus that lifts a clear step above the charcoal bg so the
     header + sort toolbar read as distinct navigation bands (mirrors the
     muted grey-sage of editorial light). Light ink for AA contrast. */
  --contrast-green: #2f4039;
  --contrast-green-strong: #3a4f47;
  --contrast-green-ink: #e2eae4;
  --contrast-green-rule: #6fa089;
  --gold: #c6a766;              /* Warm gold — primary accent */
  --gold-bright: #d9bf82;       /* Brighter gold */
  --gold-deep: #9b7f45;         /* Deep gold */
  /* HERO-PANEL-SOFT-2026: slightly lighter panels for stats + cheapest lists. */
  --panel-soft-bg: color-mix(in srgb, var(--bg-elevated) 78%, var(--surface));
  --panel-soft-edge: color-mix(in srgb, var(--gold) 40%, transparent);
  --panel-soft-edge-outer: color-mix(in srgb, var(--gold) 20%, transparent);
  --panel-soft-inset: color-mix(in srgb, #fff 6%, transparent);
  --indie: #4cc9b0;             /* Jade/teal — the "Independents" accent (opposite of a brand) */
  --indie-bright: #6fe0c8;
  --indie-text: #7fe3cd;
  --indie-bg: rgba(76, 201, 176, 0.10);
  --more: #5aa9ff;              /* Bright sky-blue — the "view more" action */
  --more-bright: #82c1ff;
  --more-text: #8cc4ff;
  --more-bg: rgba(90, 169, 255, 0.12);
  --more-border: rgba(90, 169, 255, 0.55);
  --brand-badge-bg: rgba(198, 167, 102, 0.1);
  --brand-badge-text: #d9bf82;
  --shadow-lg: 0 24px 60px rgba(0, 0, 0, 0.55);
  --placeholder-bg: #0b1628;
  --placeholder-border: #f2ead9;
  /* CARD-NAVY-DARK-2026 — shared dark navy for cards, modals, directory, bazaar */
  --card-navy: #192740;
  --card-navy-hover: #1f3050;
  --card-line: rgba(141, 167, 209, 0.50);
  --card-line-soft: rgba(141, 167, 209, 0.34);
  --card-ink: #eef2f8;
  /* Near-black inset panels inside the navy modal shell. Era --surface tokens
     (warm olive/brown in Belle Époque etc.) read muddy against --card-navy. */
  --modal-section-bg: #0f1419;
  --modal-section-bg-hover: #151b23;
}

/* ---------- Light theme — Ivory & Ink ---------- */
/* THEME-DEFAULT-HARDENING-2026: the bare ':root' is intentionally grouped with
   the light selector so the LIGHT palette is the global DEFAULT whenever
   data-theme is missing, unreadable, or some invalid value. Previously '--bg'
   (and the rest of the palette) existed ONLY inside the explicit
   [data-theme="light"] / [data-theme="dark"] blocks, so if a browser failed to
   apply data-theme (observed only in Firefox-on-iPad, which wraps WebKit and
   mishandles our localStorage-driven theme bootstrap) the page could fall
   through to no palette / the wrong palette and render dark-on-light.
   ':root' has specificity (0,0,1); ':root[data-theme="dark"]' is (0,1,1) and
   the era×theme blocks are (0,2,1), so explicit dark mode and every era token
   set still win normally — this only changes the FALLBACK from undefined/dark
   to light. Safe for all browsers; neutralizes the Firefox-iPad quirk. */
:root,
:root[data-theme="light"] {
  --bg: #f5f1e6;                /* Ivory */
  --bg-elevated: #ffffff;
  --bg-sunken: #ede7d7;         /* Header */
  --surface: #ffffff;
  --surface-hover: #faf6ea;
  --border: rgba(30, 42, 70, 0.14);
  --border-strong: rgba(30, 42, 70, 0.28);
  --text: #14213d;              /* Deep navy ink */
  --text-muted: #4a5676;
  --text-faint: #8a92a6;
  --gold: #9b7f45;              /* Deep gold for contrast on ivory */
  --gold-bright: #b8964e;
  --gold-deep: #7a6334;
  /* HERO-PANEL-SOFT-2026: near-white panels lift text off ivory page ground. */
  --panel-soft-bg: color-mix(in srgb, #ffffff 82%, var(--bg));
  --panel-soft-edge: color-mix(in srgb, var(--gold) 48%, transparent);
  --panel-soft-edge-outer: color-mix(in srgb, var(--gold) 26%, transparent);
  --panel-soft-inset: color-mix(in srgb, #fff 70%, transparent);
  --indie: #1f8f78;             /* Deeper jade for contrast on ivory */
  --indie-bright: #16a085;
  --indie-text: #157a66;
  --indie-bg: rgba(31, 143, 120, 0.10);
  --more: #2f6fd0;              /* Deeper blue for contrast on ivory */
  --more-bright: #2563c0;
  --more-text: #1e57b0;
  --more-bg: rgba(47, 111, 208, 0.10);
  --more-border: rgba(47, 111, 208, 0.50);
  --brand-badge-bg: rgba(155, 127, 69, 0.1);
  --brand-badge-text: #7a6334;
  --shadow-lg: 0 18px 40px rgba(20, 33, 61, 0.12);
  --placeholder-bg: #ffffff;
  --placeholder-border: #14213d;
}

/* ---------- Reset ---------- */
*, *::before, *::after { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.55;
  font-weight: 400;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  min-height: 100vh;
  /* FILIGREE-THEME-SNAP-2026: transition text color only — NOT background.
     Per-era filigree PNGs carry flat fills matched to --bg; they swap instantly
     on data-theme change while a body background tween left a visible muddy
     rectangle (and could stick mid-transition if the tab backgrounded). */
  transition: color var(--dur-med) var(--ease);
}
/* FILIGREE-THEME-SNAP-2026: one-frame kill switch while toggleTheme() flips
   data-theme so no surface tweens its background mid-swap. */
html.theme-snap *,
html.theme-snap *::before,
html.theme-snap *::after {
  transition-duration: 0s !important;
}
button { font-family: inherit; color: inherit; cursor: pointer; border: none; background: none; }
a { color: inherit; text-decoration: none; }
ul { list-style: none; padding: 0; margin: 0; }

/* ===========================================================
   HEADER
   =========================================================== */
.site-header {
  position: sticky;
  top: 0;
  z-index: 50;
  background: var(--bg-sunken);
  border-bottom: 1px solid var(--border);
  backdrop-filter: blur(12px);
}
.header-grid {
  max-width: var(--max-w);
  margin: 0 auto;
  /* Phase 14.1: tighter horizontal padding so the region selector hugs
     the left edge and the theme toggle hugs the right edge. */
  padding: var(--space-4) var(--space-3);
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: var(--space-4);
}

/* Region selector — Phase 14 + HEADER-ALIGN-2026 */
.region-select-wrap {
  position: relative;
  justify-self: start;
  display: inline-flex;
  align-items: center;
  gap: var(--space-3);
}
.region-select-prefix {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--header-control-fs);
  letter-spacing: 0.04em;
  color: var(--text-muted);
  text-transform: uppercase;
  white-space: nowrap;
  cursor: pointer;
  user-select: none;
  line-height: 1;
}
.region-select {
  display: inline-flex; align-items: center; gap: var(--space-2);
  box-sizing: border-box;
  padding: 0 var(--header-control-pad-x);
  border: 1.5px solid var(--gold);
  border-radius: var(--radius-md);
  background: var(--surface);
  color: var(--text);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--header-control-fs);
  letter-spacing: 0.02em;
  line-height: 1;
  min-height: var(--header-control-h);
  height: var(--header-control-h);
  box-shadow: 0 1px 0 rgba(198, 167, 102, 0.18) inset;
  transition: border-color var(--dur-fast) var(--ease),
              background var(--dur-fast) var(--ease),
              box-shadow var(--dur-fast) var(--ease);
}
.region-select:hover {
  border-color: var(--gold-bright);
  background: var(--surface-hover);
  box-shadow: 0 2px 6px rgba(198, 167, 102, 0.15);
}
.region-select:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 2px;
}
.region-select .pin-icon { color: var(--gold); flex-shrink: 0; }
.region-select .chev { opacity: 0.7; transition: transform var(--dur-fast) var(--ease); }
.region-select[aria-expanded="true"] .chev { transform: rotate(180deg); }

/* Wordmark — three tokens so mid-width can stack before a 2-row header */
.wordmark {
  justify-self: center;
  display: inline-flex; align-items: center; gap: var(--space-3);
  text-align: left;
}
.wordmark-crest {
  color: var(--gold); flex-shrink: 0;
  width: 40px; height: 40px;
}
.wordmark-text {
  display: inline-flex;
  flex-direction: row;
  flex-wrap: nowrap;
  align-items: baseline;
  gap: 0.4em;
  line-height: 1;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--header-control-fs);
  letter-spacing: 0.16em;
  color: var(--text-muted);
  text-transform: uppercase;
}
.wordmark-text .wm-part {
  white-space: nowrap;
}

/* Right cluster */
.header-right {
  justify-self: end;
  display: inline-flex;
  align-items: center;
  gap: var(--space-3);
  flex-wrap: nowrap;
  justify-content: flex-end;
}

/* Theme toggle — matches --header-control-h */
.theme-toggle {
  box-sizing: border-box;
  width: var(--header-control-h);
  height: var(--header-control-h);
  flex: 0 0 var(--header-control-h);
  padding: 0;
  border: 1.5px solid var(--gold);
  border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--gold);
  background: var(--surface);
  box-shadow: 0 1px 0 rgba(198, 167, 102, 0.18) inset;
  transition: border-color var(--dur-fast) var(--ease),
              background var(--dur-fast) var(--ease),
              transform var(--dur-med) var(--ease),
              box-shadow var(--dur-fast) var(--ease);
}
.theme-toggle:hover {
  border-color: var(--gold-bright);
  background: var(--surface-hover);
  transform: rotate(25deg) scale(1.05);
  box-shadow: 0 2px 6px rgba(198, 167, 102, 0.18);
}
.theme-toggle:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 2px;
}
.theme-toggle .icon-moon { display: none; }
:root[data-theme="light"] .theme-toggle .icon-sun { display: none; }
:root[data-theme="light"] .theme-toggle .icon-moon { display: block; }

/* ============================================================
   Map Mode (Step 1) — Card/Map view toggle button
   Sits at the far right of the nav, to the RIGHT of the theme
   toggle. Styled to echo the region-select pill so the two
   primary nav controls feel like a family. Gold border keeps
   it legible in BOTH light and dark themes.
   ============================================================ */
.view-toggle {
  display: inline-flex; align-items: center; gap: var(--space-2);
  padding: 0 16px;
  min-height: 46px;
  border: 1.5px solid var(--gold);
  border-radius: var(--radius-md);
  background: var(--surface);
  color: var(--text);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 0.9375rem;
  letter-spacing: 0.02em;
  box-shadow: 0 1px 0 rgba(198, 167, 102, 0.18) inset;
  transition: border-color var(--dur-fast) var(--ease),
              background var(--dur-fast) var(--ease),
              transform var(--dur-fast) var(--ease),
              box-shadow var(--dur-fast) var(--ease);
}
.view-toggle:hover {
  border-color: var(--gold-bright);
  background: var(--surface-hover);
  transform: translateY(-1px);
  box-shadow: 0 2px 6px rgba(198, 167, 102, 0.15);
}
.view-toggle:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 2px;
}
.view-toggle .view-toggle-icon { color: var(--gold); flex-shrink: 0; }
/* In Card Mode the button invites switching TO the map (map glyph + "Map View").
   In Map Mode it invites switching back (grid glyph + "Card View"). The active
   mode is reflected on <body> via .is-map-mode. */
.view-toggle .view-toggle-icon--grid { display: none; }
body.is-map-mode .view-toggle .view-toggle-icon--map { display: none; }
body.is-map-mode .view-toggle .view-toggle-icon--grid { display: inline-flex; }
/* Active-mode emphasis: filled gold pill while in Map Mode. */
body.is-map-mode .view-toggle {
  background: var(--gold);
  color: var(--bg-sunken);
  border-color: var(--gold);
}
body.is-map-mode .view-toggle .view-toggle-icon { color: var(--bg-sunken); }
body.is-map-mode .view-toggle:hover { background: var(--gold-bright); border-color: var(--gold-bright); }

/* ============================================================
   Map Mode (Step 1) — the map surface itself
   Fills the results content area. Hidden in Card Mode; when Map
   Mode is active we hide the card grid / toolbar / empty state
   and reveal this. Height is viewport-relative so the map is
   pannable/zoomable across the full content area.
   ============================================================ */
.map-container {
  position: relative; /* anchor for the floating context-layer panel */
  width: 100%;
  height: calc(100vh - var(--header-h, 81px) - 40px);
  min-height: 420px;
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-md);
  overflow: hidden;
  background: #f2f2f2;
}
/* When Map Mode is on, swap what the results section shows. */
body.is-map-mode .toolbar,
body.is-map-mode #cardGrid,
body.is-map-mode #emptyState,
body.is-map-mode .grid-lazy-sentinel,
body.is-map-mode .hero-stats,
body.is-map-mode .hero-stats--band,
body.is-map-mode #heroStatsBand,
/* Also hide the landing hero + the results header so the map fills the view
   immediately on toggle (Google-Maps-like), instead of sitting below the fold. */
body.is-map-mode .hero,
body.is-map-mode .results-header {
  display: none !important;
}
/* Map fills the viewport below the sticky header in Map Mode; trim default
   page padding so there's no dead band above the map.

   Responsive sizing (like Card Mode): on phones/tablets the map fills the
   screen edge-to-edge for an immersive, Google-Maps-like feel. On large
   desktop monitors we DON'T let the map span an enormous maximized window —
   instead it's capped to a comfortable max-width, centered, with a little
   vertical breathing room and rounded corners. */
/* MAP-FIT-2026 — viewport-locked map: equal top/bottom breathing room, full
   frame always visible, no footer dead band, no scroll drift from Card Mode. */
body.is-map-mode {
  overflow: hidden;
  height: 100vh;
  height: 100dvh;
  display: flex;
  flex-direction: column;
}
body.is-map-mode .site-header { flex-shrink: 0; }
body.is-map-mode main#top {
  padding-top: 0;
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
body.is-map-mode .results {
  max-width: none;
  width: 100%;
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
  padding-top: var(--map-edge-pad, 24px);
  padding-bottom: var(--map-edge-pad, 24px);
  margin-top: 0;
  overflow: hidden;
  box-sizing: border-box;
  /* Inset from viewport edges so side filigree rails stay fully visible in the
     gutters (MAP-FIT-2026 had capped at 72px — that let the frame clip them). */
  padding-left: max(var(--map-edge-pad, 24px), calc((100vw - var(--max-w)) / 2 + var(--map-edge-pad, 24px)));
  padding-right: max(var(--map-edge-pad, 24px), calc((100vw - var(--max-w)) / 2 + var(--map-edge-pad, 24px)));
}
body.is-map-mode .site-footer { display: none !important; }

/* DIRECTORY-MODE-2026 — swap card grid for explorer tree (primary view). */
body.is-directory-mode .toolbar,
body.is-directory-mode .hero,
body.is-directory-mode .hero-stats,
body.is-directory-mode .hero-stats--band,
body.is-directory-mode #heroStatsBand,
body.is-directory-mode .results-header,
body.is-directory-mode #cardGrid,
body.is-directory-mode #emptyState,
body.is-directory-mode .grid-lazy-sentinel {
  display: none !important;
}
body.is-directory-mode .directory-view:not([hidden]) {
  display: block;
}
body.is-directory-mode .mode-select,
body.is-directory-mode #modeButton {
  background: var(--gold);
  color: var(--bg-sunken);
  border-color: var(--gold);
}
body.is-directory-mode #mapView {
  display: none !important;
}
body.is-map-mode #directoryPanel {
  display: none !important;
}
body.is-directory-mode .results {
  max-width: none;
  width: 100%;
  padding-left: clamp(12px, calc((100vw - var(--max-w)) / 2 + 8px), 72px);
  padding-right: clamp(12px, calc((100vw - var(--max-w)) / 2 + 8px), 72px);
  box-sizing: border-box;
}

/* DIRECTORY-VIEWPORT-LOCK-2026 — tablet/desktop: eliminate the double
   scrollbar. Mirrors the proven MAP-FIT-2026 recipe above: lock the page to
   exactly one viewport height and let flexbox hand all remaining space to
   .directory-scroll, so the OUTER page never needs its own scrollbar — only
   the inner tree (.directory-scroll) scrolls. Phones keep their own existing
   equivalent fix inside the MOBILE-IPHONE-2026 block (max-width: 699.98px),
   so this is scoped to min-width: 700px to avoid overlapping/fighting it. */
@media (min-width: 700px) {
  body.is-directory-mode {
    overflow: hidden;
    height: 100vh;
    height: 100dvh;
    display: flex;
    flex-direction: column;
  }
  body.is-directory-mode .site-header { flex-shrink: 0; }
  body.is-directory-mode main#top {
    padding-top: 0;
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
    overflow: hidden;
  }
  body.is-directory-mode .results {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
    padding-top: clamp(10px, 1.4vw, 18px);
    padding-bottom: clamp(10px, 1.4vw, 18px);
    overflow: hidden;
  }
  /* `display` needs the same :not([hidden]) specificity as the base rule
     (line ~470) it overrides; the rest is a plain 2-class selector so the
     700–1380px iPad override further down (which adds a safe-area bottom
     pad) can still win that one property via normal source order. */
  body.is-directory-mode .directory-view:not([hidden]) {
    display: flex;
  }
  body.is-directory-mode .directory-view {
    flex: 1 1 auto;
    min-height: 0;
    flex-direction: column;
    overflow: hidden;
    padding-top: 0;
    padding-bottom: 0;
  }
  body.is-directory-mode .directory-frame {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
  }
  body.is-directory-mode .directory-filigree-top,
  body.is-directory-mode .directory-header,
  body.is-directory-mode .directory-toolbar,
  body.is-directory-mode .directory-filigree-bottom {
    flex-shrink: 0;
  }
  body.is-directory-mode .directory-scroll {
    flex: 1 1 auto;
    min-height: 0;
    max-height: none;
  }
}
body.is-directory-mode .site-footer { display: none !important; }

/* Legacy map-container rules — neutralized; MAP-FIT-2026 uses flex + --map-frame-h. */
body.is-map-mode .map-container:not(.map-view .map-container) {
  height: auto;
}

/* --- Medium-and-up --- */
@media (min-width: 700px) {
  /* padding handled on .results in MAP-FIT-2026 block above */
}
/* Leaflet sets its own stacking context; keep it below the sticky header and
   any open modal/dropdown overlays. */
.map-container .leaflet-pane,
.map-container .leaflet-top,
.map-container .leaflet-bottom { z-index: 1; }

/* Leaflet popup theming so hotel pin popups read in both themes. */
.leaflet-popup-content-wrapper,
.leaflet-popup-tip {
  background: var(--surface);
  color: var(--text);
  box-shadow: 0 6px 24px rgba(0, 0, 0, 0.28);
}
.leaflet-popup-content { margin: 12px 14px; font-family: var(--font-body, var(--font-display)); }
.atlas-map-popup-name {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.95rem;
  color: var(--text);
  margin-bottom: 2px;
}
.atlas-map-popup-meta { color: var(--text-muted); font-size: 0.8125rem; }
.atlas-map-popup-tier {
  margin-top: 6px;
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  color: var(--gold);
}
.atlas-map-popup-lab {
  margin-top: 4px;
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--contrast-green-strong, #8fbf7f) 85%, var(--text));
}
.atlas-map-popup-pitch {
  margin-top: 8px;
  font-size: 0.78rem;
  line-height: 1.45;
  color: var(--text-muted);
  max-width: 28ch;
}
.atlas-map-popup-flag {
  display: inline-block;
  margin-top: 6px;
  font-family: var(--font-body);
  font-size: 0.68rem;
  font-weight: 500;
  font-style: normal;
  letter-spacing: 0.02em;
  text-transform: none;
  padding: 2px 7px;
  border-radius: 999px;
}
.atlas-map-popup-flag--green {
  color: #2d6a4f;
  background: color-mix(in srgb, #2d6a4f 12%, transparent);
  border: 1px solid color-mix(in srgb, #2d6a4f 28%, transparent);
}
.atlas-map-popup-flag--red {
  color: #9b3d2e;
  background: color-mix(in srgb, #9b3d2e 10%, transparent);
  border: 1px solid color-mix(in srgb, #9b3d2e 24%, transparent);
}
.atlas-map-popup-link {
  display: inline-block;
  margin-top: 8px;
  color: var(--gold);
  font-weight: 600;
  font-size: 0.8125rem;
  cursor: pointer;
  text-decoration: underline;
}
.atlas-map-popup-link:hover { color: var(--gold-bright); }

/* PIPELINE-STATUS-2026-07 — Map Mode: under-construction / coming-soon clarity */
.atlas-map-popup--pipeline .atlas-map-popup-name {
  margin-bottom: 4px;
}
.atlas-map-popup-pipeline {
  display: inline-block;
  margin: 2px 0 4px;
  padding: 3px 8px;
  font-size: 0.68rem;
  font-weight: 800;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: #6b4a12;
  background: color-mix(in srgb, #d4a017 22%, var(--surface));
  border: 1px solid color-mix(in srgb, #d4a017 55%, transparent);
  border-radius: 4px;
}
.atlas-map-popup-pipeline-detail {
  margin: 0 0 6px;
  font-size: 0.72rem;
  line-height: 1.35;
  color: var(--text-muted);
  max-width: 32ch;
}
.atlas-price-peg--pipeline .atlas-price-peg-pill--pipeline,
.atlas-price-peg-pill--pipeline {
  background: color-mix(in srgb, #d4a017 88%, #3a2a08);
  color: #1a1408;
  font-weight: 800;
  letter-spacing: 0.04em;
  font-size: 0.62rem;
}
.atlas-pin-label-pipeline {
  display: block;
  margin: 3px auto 2px;
  padding: 2px 6px;
  width: fit-content;
  max-width: 100%;
  font-size: 0.62rem;
  font-weight: 800;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: #6b4a12;
  background: color-mix(in srgb, #d4a017 20%, transparent);
  border: 1px solid color-mix(in srgb, #d4a017 50%, transparent);
  border-radius: 3px;
}
:root[data-theme="dark"] .atlas-pin-label-pipeline {
  color: #f1cc82;
}
.atlas-pin-label-plate--pipeline {
  box-shadow: inset 0 0 0 1.5px color-mix(in srgb, #d4a017 70%, transparent);
}

/* ============================================================
   DIRECTORY-MODE-2026 — luxury file-explorer tree (era × theme)
   Primary view peer of Card / Map. Collapsible folders + stat rows.
   ============================================================ */
.directory-view {
  width: 100%;
  max-width: min(1080px, 100%);
  margin: 0 auto;
  padding: clamp(8px, 1.5vw, 16px) 0 clamp(28px, 4vw, 56px);
}
.directory-view[hidden] { display: none !important; }

.directory-frame {
  --dir-frame-bg: color-mix(in srgb, var(--surface) 94%, var(--gold) 6%);
  --dir-row-bg: color-mix(in srgb, var(--surface) 98%, var(--gold) 2%);
  --dir-row-bg-hover: color-mix(in srgb, var(--gold) 11%, var(--dir-row-bg));
  --dir-row-border: color-mix(in srgb, var(--gold) 12%, var(--border-strong));
  --dir-row-border-hover: color-mix(in srgb, var(--gold) 28%, var(--dir-row-border));
  /* DIRECTORY-SECTION-CONTRAST-2026: scroll trough reads as a subtly recessed
     panel (same --bg-sunken token used for header / inset surfaces elsewhere)
     so the page ⇄ scrolling-tree boundary is visible without a heavy block. */
  --dir-scroll-bg: color-mix(in srgb, var(--dir-frame-bg) 90%, var(--bg-sunken) 10%);
  --dir-group-border: color-mix(in srgb, var(--gold) 15%, var(--border-strong));
  --dir-row-radius: clamp(8px, 1vw, 10px);
  /* DIRECTORY-CHROME-2026: a whisper-quiet warm sheen (top-left highlight
     fading into the flat surface) plus a fine gold bezel ring — a touch of
     "chrome" without a heavy gradient block. overflow:hidden clips both the
     sheen and the frame's own children cleanly to the rounded corners. */
  background-color: var(--dir-frame-bg);
  background-image: linear-gradient(165deg, color-mix(in srgb, var(--gold) 8%, transparent) 0%, transparent 42%);
  border: 1px solid color-mix(in srgb, var(--gold) 32%, var(--border-strong));
  border-radius: clamp(10px, 1.2vw, 14px);
  box-shadow:
    0 1px 0 color-mix(in srgb, var(--gold) 18%, transparent) inset,
    0 0 0 1px color-mix(in srgb, var(--gold) 9%, transparent) inset,
    0 12px 40px color-mix(in srgb, var(--shadow, #000) 14%, transparent);
  padding: clamp(14px, 2.2vw, 24px) clamp(16px, 2.8vw, 32px) clamp(18px, 2.5vw, 28px);
  position: relative;
  overflow: hidden;
}
[data-theme="dark"] .directory-frame {
  --dir-frame-bg: var(--card-navy);
  --dir-row-bg: color-mix(in srgb, var(--card-navy) 86%, var(--gold) 8%);
  --dir-row-bg-hover: color-mix(in srgb, var(--gold) 14%, var(--dir-row-bg));
  --dir-row-border: color-mix(in srgb, var(--card-line) 75%, var(--gold) 10%);
  --dir-row-border-hover: color-mix(in srgb, var(--gold) 22%, var(--dir-row-border));
  --dir-scroll-bg: color-mix(in srgb, var(--dir-frame-bg) 88%, var(--bg-sunken) 12%);
  --dir-group-border: color-mix(in srgb, var(--card-line) 55%, var(--gold) 12%);
  background-color: var(--dir-frame-bg);
  background-image: linear-gradient(165deg, color-mix(in srgb, var(--gold) 11%, transparent) 0%, transparent 48%);
  border-color: var(--card-line);
  box-shadow:
    0 1px 0 color-mix(in srgb, var(--gold) 12%, transparent) inset,
    0 0 0 1px color-mix(in srgb, var(--gold) 7%, transparent) inset,
    0 16px 48px rgba(0, 0, 0, 0.35);
}

/* DIRECTORY-FILIGREE-TRIM-2026: ~12% linear reduction (~23% surface-area
   reduction, within the requested 20–25% band) via the SAME mechanism the
   base .hero-filigree rule already uses to size these bands — `height`
   (background-size:contain is height-driven here since the band is far wider
   than it is tall), so no second sizing system is introduced. Scoped to the
   Directory-only classes; the shared .hero-filigree base + homepage hero
   instances are untouched. */
.directory-filigree-top {
  margin: 0 auto clamp(10px, 1.5vw, 18px);
  height: clamp(35px, 4.4vw, 55px);
  opacity: 0.92;
}
.directory-filigree-bottom {
  margin: clamp(14px, 2vw, 22px) auto 0;
  height: clamp(32px, 4vw, 49px);
  opacity: 0.88;
}
/* DIRECTORY-FILIGREE-BG-2026: .hero-filigree defaults to background-color: var(--bg)
   so PNG letterbox margins match the page in Card mode. Inside .directory-frame the
   panel uses --card-navy (dark) / gold-tinted surface (light), not --bg — transparent
   lets the frame fill show through so top/bottom bands don't read as a separate block. */
.directory-frame .hero-filigree {
  background-color: transparent;
}

.directory-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px 16px;
  margin-bottom: clamp(10px, 1.5vw, 16px);
  flex-wrap: nowrap;
}
.directory-filter-wrap {
  flex: 1 1 200px;
  max-width: min(420px, 100%);
  min-width: 0;
  margin-left: auto;
}
.directory-filter-inner {
  position: relative;
  display: flex;
  align-items: center;
}
.directory-filter-clear {
  position: absolute;
  right: 8px;
  top: 50%;
  transform: translateY(-50%);
  width: 36px;
  height: 36px;
  border: none;
  border-radius: 50%;
  background: color-mix(in srgb, var(--gold) 18%, transparent);
  color: var(--text-muted);
  font-size: 1.25rem;
  line-height: 1;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  -webkit-tap-highlight-color: transparent;
}
.directory-filter-clear:hover,
.directory-filter-clear:focus-visible {
  background: color-mix(in srgb, var(--gold) 32%, transparent);
  color: var(--text);
  outline: none;
}
.directory-filter:has(+ .directory-filter-clear:not([hidden])) {
  padding-right: 44px;
}
.directory-filter-icon {
  position: absolute;
  left: 14px;
  color: #1a1a1a;
  opacity: 1;
  pointer-events: none;
}
[data-theme="dark"] .directory-filter-icon {
  color: #f5f0e6;
  filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.45));
}
.directory-filter {
  width: 100%;
  box-sizing: border-box;
  appearance: none;
  border: 1px solid color-mix(in srgb, var(--gold) 28%, var(--border-strong));
  border-radius: 999px;
  background: color-mix(in srgb, var(--surface) 92%, var(--gold) 8%);
  color: var(--text);
  font-family: var(--font-body, var(--font-display));
  font-size: 1.0625rem;
  min-height: 44px;
  padding: 0 16px 0 50px;
  /* DIRECTORY-CHROME-2026: faint inset so the pill reads as cut into the
     surface rather than flat-pasted on top. */
  box-shadow: inset 0 1px 3px color-mix(in srgb, var(--shadow, #000) 7%, transparent);
  transition: border-color 0.15s, box-shadow 0.15s;
}
.directory-filter::placeholder {
  color: color-mix(in srgb, var(--text-muted) 85%, transparent);
}
.directory-filter:hover {
  border-color: color-mix(in srgb, var(--gold) 45%, var(--border-strong));
}
.directory-filter:focus {
  outline: none;
  border-color: var(--gold);
  box-shadow:
    inset 0 1px 3px color-mix(in srgb, var(--shadow, #000) 7%, transparent),
    0 0 0 3px color-mix(in srgb, var(--gold) 22%, transparent);
}

.directory-header {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 14px 24px;
  margin-bottom: clamp(6px, 1vw, 10px);
  padding-bottom: 0;
  border-bottom: none;
}
.directory-header-intro {
  flex: 1 1 100%;
  min-width: 0;
  text-align: center;
}
/* DIRECTORY-TITLE-REMOVE-2026: the big centered "Directory" <h2> is retired
   from display at the owner's request. Kept in the DOM (not deleted) as an
   accessible section heading for assistive tech — no JS targets .directory-title
   (confirmed), so a pure CSS visually-hidden treatment is the safest route.
   The eyebrow above is promoted to carry the header on its own (bigger,
   bolder, with a small gold rule) so removing the title leaves no visual gap. */
.directory-eyebrow {
  position: relative;
  margin: 0 0 8px;
  padding-bottom: 10px;
  font-size: 1.0625rem;
  font-weight: 700;
  letter-spacing: 0.17em;
  text-transform: uppercase;
  color: var(--gold);
}
.directory-eyebrow::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: 0;
  transform: translateX(-50%);
  width: 46px;
  height: 2px;
  border-radius: 2px;
  background: linear-gradient(90deg, transparent, var(--gold), transparent);
  opacity: 0.85;
}
.directory-title {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
.directory-context {
  margin: 10px auto 0;
  max-width: min(42rem, 100%);
  font-family: var(--font-display);
  font-size: clamp(1.25rem, 2.8vw, 1.5rem);
  font-weight: 600;
  line-height: 1.35;
  letter-spacing: 0.045em;
  text-align: center;
  color: color-mix(in srgb, var(--text) 76%, var(--text-muted));
}
[data-theme="dark"] .directory-context {
  color: color-mix(in srgb, var(--text) 90%, var(--gold) 10%);
}
.directory-header-actions {
  flex: 1 1 100%;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 10px 16px;
  width: 100%;
}

.directory-layout-toggle {
  display: inline-flex;
  flex-shrink: 0;
  align-items: stretch;
  min-height: 44px;
  border: 1px solid color-mix(in srgb, var(--gold) 35%, var(--border-strong));
  border-radius: 999px;
  overflow: hidden;
  background: color-mix(in srgb, var(--surface) 88%, transparent);
  /* DIRECTORY-CHROME-2026: thin top highlight for a polished pill-button feel. */
  box-shadow:
    0 1px 0 color-mix(in srgb, #fff 30%, transparent) inset,
    0 1px 3px color-mix(in srgb, var(--shadow, #000) 8%, transparent);
}
[data-theme="dark"] .directory-layout-toggle {
  box-shadow:
    0 1px 0 color-mix(in srgb, #fff 10%, transparent) inset,
    0 1px 3px color-mix(in srgb, var(--shadow, #000) 8%, transparent);
}
.directory-layout-btn {
  appearance: none;
  border: none;
  background: transparent;
  color: var(--text-muted);
  font-family: var(--font-body, var(--font-display));
  font-size: 0.9375rem;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 0 18px;
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  cursor: pointer;
  transition: background 0.18s ease, color 0.18s ease;
}
.directory-layout-btn:hover {
  color: var(--text);
  background: color-mix(in srgb, var(--gold) 14%, transparent);
}
.directory-layout-btn[aria-pressed="true"] {
  background: linear-gradient(
    180deg,
    color-mix(in srgb, var(--gold) 92%, white 8%) 0%,
    var(--gold) 100%
  );
  color: var(--bg-sunken);
  box-shadow: 0 1px 0 color-mix(in srgb, white 25%, transparent) inset;
}

.directory-tree-actions {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
  justify-content: flex-end;
}
.directory-tree-action {
  appearance: none;
  border: none;
  background: none;
  padding: 2px 4px;
  font-family: var(--font-body, var(--font-display));
  font-size: 0.9375rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  color: var(--gold);
  cursor: pointer;
  text-decoration: underline;
  text-decoration-color: color-mix(in srgb, var(--gold) 40%, transparent);
  text-underline-offset: 3px;
  transition: color 0.15s;
}
.directory-tree-action:hover,
.directory-tree-action:focus-visible {
  color: var(--gold-bright);
  outline: none;
}
.directory-tree-action-sep {
  color: var(--text-muted);
  opacity: 0.45;
  user-select: none;
}

.directory-count {
  margin: 0;
  font-size: 1rem;
  color: var(--text-muted);
  letter-spacing: 0.03em;
  font-variant-numeric: tabular-nums;
}

.directory-scroll {
  max-height: min(72vh, 920px);
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior-y: contain;
  padding: 8px 10px 10px;
  margin: 0;
  border-radius: clamp(8px, 1vw, 10px);
  /* DIRECTORY-SECTION-CONTRAST-2026: subtle recessed panel + hairline border
     so the scrollable tree reads as distinct from the surrounding frame. */
  background: var(--dir-scroll-bg, transparent);
  border: 1px solid var(--dir-row-border, transparent);
  scrollbar-gutter: stable;
  scrollbar-width: auto;
  scrollbar-color: color-mix(in srgb, var(--gold) 50%, transparent) transparent;
}
.directory-scroll::-webkit-scrollbar { width: 16px; }
.directory-scroll::-webkit-scrollbar-track { background: transparent; }
/* DIRECTORY-CHROME-2026: brushed two-tone gradient thumb instead of a flat
   fill — a small polished "chrome" touch on the one element the owner
   explicitly wants kept as the sole scrollbar. */
.directory-scroll::-webkit-scrollbar-thumb {
  background: linear-gradient(180deg, color-mix(in srgb, var(--gold) 55%, white 8%), color-mix(in srgb, var(--gold) 30%, var(--border-strong)));
  border-radius: 999px;
  min-height: 48px;
  transition: background-color 0.22s ease;
}
.directory-scroll:hover::-webkit-scrollbar-thumb {
  background: linear-gradient(180deg, color-mix(in srgb, var(--gold) 68%, white 10%), color-mix(in srgb, var(--gold) 42%, var(--border-strong)));
}
.directory-scroll::-webkit-scrollbar-thumb:hover {
  background: linear-gradient(180deg, color-mix(in srgb, var(--gold) 78%, white 10%), color-mix(in srgb, var(--gold) 52%, var(--border-strong)));
}
.directory-scroll::-webkit-scrollbar-thumb:active {
  background: color-mix(in srgb, var(--gold) 72%, var(--border-strong));
}
[data-theme="dark"] .directory-scroll {
  scrollbar-color: color-mix(in srgb, var(--gold) 42%, var(--card-navy)) transparent;
}
[data-theme="dark"] .directory-scroll::-webkit-scrollbar-thumb {
  background: linear-gradient(180deg, color-mix(in srgb, var(--gold) 48%, white 6%), color-mix(in srgb, var(--gold) 28%, var(--card-navy)));
}
[data-theme="dark"] .directory-scroll:hover::-webkit-scrollbar-thumb {
  background: linear-gradient(180deg, color-mix(in srgb, var(--gold) 62%, white 8%), color-mix(in srgb, var(--gold) 40%, var(--card-navy)));
}
[data-theme="dark"] .directory-scroll::-webkit-scrollbar-thumb:hover {
  background: linear-gradient(180deg, color-mix(in srgb, var(--gold) 72%, white 8%), color-mix(in srgb, var(--gold) 50%, var(--card-navy)));
}
[data-theme="dark"] .directory-scroll::-webkit-scrollbar-thumb:active {
  background: color-mix(in srgb, var(--gold) 74%, var(--card-navy));
}

.directory-tree {
  font-family: var(--font-body, var(--font-display));
  font-size: 1.125rem;
  line-height: 1.45;
}

.directory-folder {
  margin: 0;
  border-left: 1px solid color-mix(in srgb, var(--gold) 20%, var(--border-strong));
}
.directory-folder--depth-0 {
  border-left: none;
  margin-bottom: 8px;
  padding-bottom: 8px;
  /* DIRECTORY-SECTION-CONTRAST-2026: hairline divider between top-level
     parent-company / continent groups so sections read as distinct. */
  border-bottom: 1px solid var(--dir-group-border, transparent);
}
.directory-folder--depth-0:last-child {
  margin-bottom: 0;
  padding-bottom: 0;
  border-bottom: none;
}
.directory-folder--depth-0 > .directory-folder-summary {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 1.2rem;
  color: var(--text);
  padding-top: 8px;
  padding-bottom: 8px;
}
.directory-folder--depth-1 > .directory-folder-summary {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 1.125rem;
}
/* DIRECTORY-SECTION-CONTRAST-2026: faint dashed rule between sibling brand
   folders inside an expanded owner group — lighter than the depth-0 divider
   so nested rows stay readable without turning into a dense gridline. */
.directory-folder--depth-1:not(:last-child) {
  border-bottom: 1px dashed color-mix(in srgb, var(--gold) 14%, transparent);
  padding-bottom: 2px;
  margin-bottom: 2px;
}
.directory-folder-summary {
  list-style: none;
  display: flex;
  align-items: baseline;
  gap: 8px;
  padding: 5px 10px 5px 6px;
  cursor: pointer;
  color: var(--text);
  border-radius: var(--radius-sm, 6px);
  user-select: none;
  transition: background 0.12s ease;
}
.directory-folder-summary::-webkit-details-marker { display: none; }
.directory-folder-summary::marker { content: ""; }
.directory-folder-summary:hover {
  background: color-mix(in srgb, var(--gold) 11%, transparent);
}
.directory-folder-chevron {
  flex: 0 0 16px;
  width: 16px;
  height: 16px;
  position: relative;
  top: 1px;
  opacity: 0.65;
  color: var(--gold);
}
.directory-folder-chevron::before {
  content: "";
  display: block;
  width: 6px;
  height: 6px;
  border-right: 1.5px solid currentColor;
  border-bottom: 1.5px solid currentColor;
  transform: rotate(-45deg);
  margin: 4px 0 0 5px;
  transition: transform 0.18s ease;
}
.directory-folder:not([open]) > .directory-folder-summary .directory-folder-chevron::before {
  transform: rotate(45deg);
  margin-top: 2px;
}
.directory-folder-icon {
  flex: 0 0 auto;
  font-size: 0.875rem;
  opacity: 0.55;
  line-height: 1;
}
.directory-folder-glyph {
  flex: 0 0 8px;
  width: 8px;
  height: 8px;
  margin-top: 2px;
  border-radius: 1px;
  background: color-mix(in srgb, var(--gold) 70%, transparent);
  transform: rotate(45deg);
  opacity: 0.55;
}
.directory-folder-glyph--depth-0 {
  width: 10px;
  height: 10px;
  opacity: 0.75;
  border: 1px solid color-mix(in srgb, var(--gold) 80%, transparent);
  background: transparent;
}
.directory-folder-glyph--depth-1 {
  border-radius: 999px;
  transform: none;
  background: color-mix(in srgb, var(--gold) 55%, transparent);
}
.directory-folder-glyph--depth-2 {
  border-radius: 2px;
  transform: rotate(0deg);
  width: 7px;
  height: 7px;
}
.directory-folder-glyph--depth-3,
.directory-folder-glyph--depth-4 {
  width: 6px;
  height: 6px;
  border-radius: 999px;
  opacity: 0.4;
}
.directory-folder-namegroup {
  display: inline-flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 6px;
  flex: 1 1 auto;
  min-width: 0;
}
.directory-folder-label { flex: 0 1 auto; min-width: 0; }
.directory-folder-count {
  flex: 0 0 auto;
  font-size: 0.9375rem;
  color: var(--text-muted);
  font-variant-numeric: tabular-nums;
  padding: 1px 8px;
  border-radius: 999px;
  background: color-mix(in srgb, var(--gold) 8%, transparent);
  border: 1px solid color-mix(in srgb, var(--gold) 18%, transparent);
}
.directory-folder-children {
  padding-left: clamp(10px, 1.8vw, 20px);
  margin-left: 8px;
  border-left: 1px dashed color-mix(in srgb, var(--gold) 15%, transparent);
}

.directory-hotel-row {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  grid-template-rows: auto auto;
  align-items: center;
  gap: 2px 16px;
  padding: 8px 12px 8px clamp(16px, 2.5vw, 24px);
  margin: 5px 0;
  border-radius: var(--dir-row-radius, clamp(8px, 1vw, 10px));
  background: var(--dir-row-bg, color-mix(in srgb, var(--surface) 98%, var(--gold) 2%));
  border: 1px solid var(--dir-row-border, color-mix(in srgb, var(--gold) 12%, var(--border-strong)));
  overflow: hidden;
  transition: background 0.12s ease, border-color 0.12s ease;
}
.directory-hotel-row:hover,
.directory-hotel-row:focus-within {
  background: var(--dir-row-bg-hover, color-mix(in srgb, var(--gold) 11%, var(--dir-row-bg)));
  border-color: var(--dir-row-border-hover, color-mix(in srgb, var(--gold) 28%, var(--dir-row-border)));
}
/* DIRECTORY-CHROME-2026: a slim gold accent bar warms up on hover/focus —
   a small, tasteful nod to a "selected tile" feel without extra color noise
   when the row is at rest. */
.directory-hotel-row::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 3px;
  background: linear-gradient(180deg, var(--gold), color-mix(in srgb, var(--gold) 25%, transparent));
  opacity: 0;
  transition: opacity 0.15s ease;
  pointer-events: none;
}
.directory-hotel-row:hover::before,
.directory-hotel-row:focus-within::before {
  opacity: 0.9;
}
.directory-hotel-headline {
  grid-column: 1;
  grid-row: 1;
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 8px;
  min-width: 0;
}
.directory-hotel-name {
  appearance: none;
  border: none;
  background: none;
  padding: 0;
  margin: 0;
  text-align: left;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 1.0625rem;
  color: var(--text);
  cursor: pointer;
  text-decoration: none;
  line-height: 1.3;
}
.directory-hotel-name:hover,
.directory-hotel-name:focus-visible {
  color: var(--gold-bright);
  outline: none;
}
.directory-hotel-badge--coming-soon {
  display: inline-flex;
  align-items: center;
  padding: 2px 9px;
  font-family: var(--font-body);
  font-size: 0.64rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--gold);
  background: color-mix(in srgb, var(--gold) 12%, transparent);
  border: 1px solid color-mix(in srgb, var(--gold) 40%, transparent);
  border-radius: 999px;
  white-space: nowrap;
  line-height: 1.5;
}
.directory-hotel-row--coming-soon {
  border-color: color-mix(in srgb, var(--gold) 32%, var(--border-strong));
  background: var(--dir-row-bg-coming-soon, color-mix(in srgb, var(--surface) 96%, var(--gold) 4%));
}
.directory-hotel-row--coming-soon:hover,
.directory-hotel-row--coming-soon:focus-within {
  border-color: color-mix(in srgb, var(--gold) 50%, var(--dir-row-border));
}
.directory-hotel-row--coming-soon .directory-hotel-name {
  color: var(--text-muted);
}
.directory-stat--coming-soon {
  font-weight: 600;
  color: var(--gold);
  letter-spacing: 0.01em;
}
.directory-hotel-meta {
  grid-column: 1;
  grid-row: 2;
  font-size: 0.875rem;
  color: var(--text-muted);
  letter-spacing: 0.02em;
  line-height: 1.25;
}
.directory-hotel-stats {
  grid-column: 2;
  grid-row: 1 / span 2;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: flex-end;
  gap: 6px 10px;
  font-size: 0.875rem;
  color: var(--text-muted);
}
.directory-stat { white-space: nowrap; }
.directory-stat--price {
  font-weight: 600;
  color: var(--text);
  font-variant-numeric: tabular-nums;
}
.directory-stat-suffix {
  font-weight: 400;
  font-size: 0.65rem;
  opacity: 0.75;
  margin-left: 1px;
}
.directory-stat--empty { opacity: 0.35; }
.directory-stat--tier {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  padding: 2px 8px;
  border-radius: 999px;
  border: 1px solid color-mix(in srgb, var(--gold) 45%, transparent);
  background: color-mix(in srgb, var(--gold) 6%, transparent);
  color: var(--gold);
  font-weight: 600;
  font-size: 0.6875rem;
  letter-spacing: 0.03em;
  transition: background 0.16s ease, box-shadow 0.16s ease;
}
.directory-tier-label {
  opacity: 0.75;
  font-weight: 500;
  text-transform: uppercase;
  font-size: 0.6rem;
}
.directory-tier-roman {
  font-family: var(--font-display);
  font-size: 0.75rem;
}
/* DIRECTORY-TIER-COLOR-2026: port Map Mode's per-tier "peacock" prestige
   ramp (see .atlas-pin-label-tiercorner--t1..t6) onto the Directory tree's
   small tier chip so tier reads at a glance across the whole list, not just
   as a uniform gold pill. Tier 1 stays quiet; Tier 3 is bright gold (the
   former T4 chrome); Tier 4 emerald / Tier 5 sapphire / Tier 6 royal-purple
   apex, mirroring Map Mode. Children inherit `color`/`text-shadow` from the
   modifier so only one rule per tier is needed here. */
.directory-stat--tier--t1 {
  border-color: color-mix(in srgb, #6a4f17 40%, transparent);
  background: color-mix(in srgb, #6a4f17 7%, transparent);
  color: #6a4f17;
}
.directory-stat--tier--t2 {
  border-color: color-mix(in srgb, #c6a766 50%, transparent);
  background: color-mix(in srgb, #c6a766 16%, transparent);
  color: #6a4f17;
}
.directory-stat--tier--t3 {
  border-color: #9b7f45;
  background: linear-gradient(135deg, #e7cf8f, #c9a94f);
  color: #3a2a08;
  box-shadow: 0 1px 4px rgba(155, 127, 69, 0.35);
}
.directory-stat--tier--t4 {
  border-color: #0b5049;
  background: linear-gradient(135deg, #0f6e63 0%, #12897a 55%, #1aa891 100%);
  color: #f4efe0;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35);
  box-shadow: 0 1px 5px rgba(15, 110, 99, 0.4);
}
.directory-stat--tier--t5 {
  border-color: #d6bd82;
  background: linear-gradient(135deg, #1b2c6b 0%, #2a3f9e 50%, #3f5fd6 100%);
  color: #f6f1e4;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
  box-shadow: 0 1px 6px rgba(27, 44, 107, 0.45);
}
.directory-stat--tier--t6 {
  border-color: #d6bd82;
  background: linear-gradient(135deg, #3c1a5c 0%, #5a2d8a 45%, #8a4ec8 100%);
  color: #f6f1e4;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
  box-shadow: 0 1px 7px rgba(60, 26, 92, 0.5);
}
/* Dark theme: Tier 1–2 chips sit on the dark tree row, so they need the
   map's brighter night-mode ink. Tier 3–6 already carry their own bright
   self-contained fills and read correctly unchanged. */
:root[data-theme="dark"] .directory-stat--tier--t1 {
  border-color: color-mix(in srgb, #d9bf82 34%, transparent);
  background: color-mix(in srgb, #d9bf82 8%, transparent);
  color: #d4c4a0;
}
:root[data-theme="dark"] .directory-stat--tier--t2 {
  border-color: color-mix(in srgb, #d9bf82 46%, transparent);
  background: color-mix(in srgb, #d9bf82 14%, transparent);
  color: #d9bf82;
}
.directory-stat--founded {
  font-size: 0.6875rem;
  opacity: 0.85;
}
.directory-stat--award {
  font-size: 0.625rem;
  font-weight: 600;
  max-width: 9rem;
  overflow: hidden;
  text-overflow: ellipsis;
  color: var(--gold);
}
.directory-stat--flag .atlas-pin-label-flags {
  margin-left: 0;
  gap: 2px;
}
.directory-stat--flag .atlas-pin-label-flag {
  padding: 0;
  border: none;
  background: none;
}
.directory-empty,
.directory-loading {
  margin: 32px 16px;
  text-align: center;
  color: var(--text-muted);
  font-size: 0.9375rem;
  font-family: var(--font-display);
}

@media (max-width: 640px) {
  .directory-header-actions {
    flex-direction: column;
    align-items: stretch;
    gap: 8px;
  }
  .directory-tree-actions {
    justify-content: flex-start;
  }
  .directory-count {
    text-align: center;
    font-size: 0.8125rem;
  }
  .directory-hotel-row {
    grid-template-columns: 1fr;
    grid-template-rows: auto auto auto;
    gap: 4px;
    padding: 10px 12px;
    margin: 6px 0;
  }
  .directory-hotel-stats {
    grid-column: 1;
    grid-row: 3;
    justify-content: flex-start;
  }
}

/* Era × theme: directory accents track gold tokens. */
[data-theme="dark"] .directory-layout-btn[aria-pressed="true"] {
  color: var(--bg-sunken);
}
[data-era="art-deco"] .directory-folder--depth-0 > .directory-folder-summary {
  letter-spacing: 0.04em;
}
[data-era="belleepoque"] .directory-title {
  letter-spacing: 0.04em;
}
[data-era="editorial"] .directory-eyebrow {
  letter-spacing: 0.22em;
}

/* Brands Mode 2 / Bazaar — dark mode navy parity with hotel cards
   BAZAAR-NIGHT-READ-2026: on-navy copy uses --text / --text-muted.
   Cream sheets (drawer, Versus, tray) keep their paper ink.
   Chrome + How-to (.bz-top, .bz-orient) use dusty-rose sandstone in every
   light era; dark mode uses a duskier companion of the same clay. */
:root[data-theme="dark"] .bz {
  color: var(--text);
  background: radial-gradient(1200px 600px at 18% -8%, color-mix(in srgb, var(--card-navy-hover) 88%, var(--gold) 12%) 0%, var(--card-navy) 42%, color-mix(in srgb, var(--card-navy) 92%, #000 8%) 100%);
}
:root[data-theme="dark"] .bz-top {
  background: linear-gradient(180deg, rgba(74, 51, 54, 0.97), rgba(58, 39, 41, 0.92));
  border-bottom-color: rgba(232, 196, 188, 0.16);
}
:root[data-theme="dark"] .bz-orient {
  background: linear-gradient(180deg, #4a3336, #3f2c2e);
  border-color: rgba(232, 196, 188, 0.22);
}
:root[data-theme="dark"] .bz-orient h4 {
  color: #f3e8e4;
}
:root[data-theme="dark"] .bz-orient p,
:root[data-theme="dark"] .bz-orient-keys,
:root[data-theme="dark"] .bz-orient-bar-note {
  color: #d4c4be;
}
:root[data-theme="dark"] .bz-orient-x {
  background: #2c1d1f;
  border-color: rgba(232, 196, 188, 0.38);
  color: #f3e8e4;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.35);
}
:root[data-theme="dark"] .bz-orient-x:hover {
  background: #3a2729;
}
:root[data-theme="dark"] .bz-brandmark,
:root[data-theme="dark"] .bz-card-name,
:root[data-theme="dark"] .bz-fleet-big,
:root[data-theme="dark"] .bz-hook,
:root[data-theme="dark"] .bz-heritage,
:root[data-theme="dark"] .bz-lname,
:root[data-theme="dark"] .bz-versus-hint b,
:root[data-theme="dark"] .bz-spark-labels .from,
:root[data-theme="dark"] .bz-spark-labels .med,
:root[data-theme="dark"] .bz-spark-labels .to {
  color: var(--text);
}
:root[data-theme="dark"] .bz-count,
:root[data-theme="dark"] .bz-tool label,
:root[data-theme="dark"] .bz-lenses-label,
:root[data-theme="dark"] .bz-versus-hint,
:root[data-theme="dark"] .bz-spark-legend,
:root[data-theme="dark"] .bz-empty-note,
:root[data-theme="dark"] .bz-ladder-lead,
:root[data-theme="dark"] .bz-llegend,
:root[data-theme="dark"] .bz-laxis-tick,
:root[data-theme="dark"] .bz-lval,
:root[data-theme="dark"] .bz-card-parent,
:root[data-theme="dark"] .bz-fleet-sub,
:root[data-theme="dark"] .bz-views button,
:root[data-theme="dark"] .bz-spark-labels {
  color: var(--text-muted);
}
:root[data-theme="dark"] .bz-card {
  background: var(--card-navy-hover);
  border-color: var(--card-line-soft);
  color: var(--text);
}
:root[data-theme="dark"] .bz-views {
  background: #322022;
  border-color: rgba(232, 196, 188, 0.22);
}
:root[data-theme="dark"] .bz-views button.on {
  background: #2c1d1f;
  color: #f3e8e4;
}
:root[data-theme="dark"] .bz-chip,
:root[data-theme="dark"] .bz-select,
:root[data-theme="dark"] .bz-x,
:root[data-theme="dark"] .bz-lens {
  background: #2c1d1f;
  border-color: rgba(232, 196, 188, 0.22);
  color: #f3e8e4;
}
:root[data-theme="dark"] .bz-chip.on,
:root[data-theme="dark"] .bz-lens.on {
  background: var(--gold);
  color: var(--bg-sunken);
  border-color: var(--gold);
}
:root[data-theme="dark"] .bz-spark-track {
  background: color-mix(in srgb, var(--text) 22%, transparent);
}
:root[data-theme="dark"] .bz-spark-med {
  background: #0b0d12;
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.78);
}
:root[data-theme="dark"] .bz-fleet-block {
  background: color-mix(in srgb, var(--card-navy) 88%, #000 12%);
  border-color: var(--card-line-soft);
}
:root[data-theme="dark"] .bz-lrow:hover {
  background: color-mix(in srgb, var(--card-navy-hover) 70%, transparent);
}
:root[data-theme="dark"] .bz-slice-note {
  color: var(--gold-bright);
  background: color-mix(in srgb, var(--gold) 16%, #3a2729);
  border-color: color-mix(in srgb, var(--gold) 40%, transparent);
}
:root[data-theme="dark"] .bz-brandmark .tag {
  color: var(--gold-bright);
  background: color-mix(in srgb, var(--gold) 18%, #3a2729);
  border-color: color-mix(in srgb, var(--gold) 40%, transparent);
}
:root[data-theme="dark"] .bz-maison-link,
:root[data-theme="dark"] .bz-quirk {
  color: var(--gold-bright);
}
:root[data-theme="dark"] .bz-spark-legend strong {
  color: var(--text);
}

/* ============================================================
   Map Mode (Step 2) — context-layer toggle panel + POI popups
   The panel floats over the top-left of the map. 8 chips, all OFF by
   default; each chip shows a colored dot, label, and a live count of POIs
   currently visible (after the 50km guard). Markers are circleMarkers in
   the chip's color.
   ============================================================ */
.map-layer-panel {
  position: absolute;
  top: 12px;
  left: 12px;
  z-index: 2; /* above leaflet panes (z-index:1), below header/modals */
  max-width: min(340px, calc(100% - 24px));
  padding: 10px 12px 11px;
  background: color-mix(in srgb, var(--surface) 92%, transparent);
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-md);
  box-shadow: 0 6px 24px rgba(0, 0, 0, 0.28);
}
.map-layer-panel-title {
  font-family: var(--font-display);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin-bottom: 8px;
}
.map-layer-toggles {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
.map-layer-chip {
  --layer-color: var(--gold);
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 5px 10px;
  font-family: var(--font-body, var(--font-display));
  font-size: 0.8125rem;
  font-weight: 600;
  line-height: 1;
  color: var(--text);
  background: var(--bg-sunken, var(--surface));
  border: 1px solid var(--border-strong);
  border-radius: 999px;
  cursor: pointer;
  transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.map-layer-chip:hover { border-color: var(--layer-color); }
.map-layer-chip-dot {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--layer-color);
  flex: 0 0 auto;
}
.map-layer-chip-count {
  font-variant-numeric: tabular-nums;
  font-size: 0.72rem;
  font-weight: 700;
  color: var(--bg-sunken, #14213d);
  background: var(--layer-color);
  border-radius: 999px;
  padding: 1px 6px;
  min-width: 14px;
  text-align: center;
}
.map-layer-chip-count:empty { display: none; }
/* ON state: fill the chip with its layer color. */
.map-layer-chip.is-on {
  background: var(--layer-color);
  border-color: var(--layer-color);
  color: #fff;
}
.map-layer-chip.is-on .map-layer-chip-dot {
  background: #fff;
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.6);
}
.map-layer-chip.is-on .map-layer-chip-count {
  color: var(--layer-color);
  background: #fff;
}

/* POI popup thumbnail (Step 2 — only renders if a thumbnail URL already
   exists in the data; no network fetch is initiated by Step 2 itself). */
.atlas-poi-popup-thumb {
  display: block;
  width: 100%;
  max-width: 220px;
  height: 110px;
  object-fit: cover;
  border-radius: var(--radius-sm, 6px);
  margin-bottom: 8px;
  background: var(--bg-sunken, var(--surface));
}
/* Placeholder when a POI has no usable photo. */
.atlas-poi-popup-noimg {
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--text-muted);
  font-size: 0.75rem;
  letter-spacing: 0.04em;
}
/* Step 3 gallery strip: a lead image + a row of small thumbnails. The first
   image is the hero; the rest sit in a horizontally-scrollable row. */
.atlas-poi-popup-gallery {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 3px;
  width: 100%;
  max-width: 220px;
  margin-bottom: 8px;
  border-radius: var(--radius-sm, 6px);
  overflow: hidden;
}
.atlas-poi-popup-gallery-img {
  width: 100%;
  height: 64px;
  object-fit: cover;
  background: var(--bg-sunken, var(--surface));
  display: block;
}
/* Make the first image a full-width hero spanning all columns. */
.atlas-poi-popup-gallery-img:first-child {
  grid-column: 1 / -1;
  height: 108px;
}
/* MAP-POI-PHOTOS-2026 — lazy live gallery status + attribution. */
.atlas-poi-popup-live-status {
  font-size: 0.68rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin: -4px 0 6px;
}
.atlas-poi-popup-live-status--err {
  color: color-mix(in srgb, var(--text-muted) 70%, #8b4513);
}
.atlas-poi-popup-attrib {
  margin-top: 6px;
  font-size: 0.62rem;
  letter-spacing: 0.05em;
  color: var(--text-muted);
  opacity: 0.85;
}

/* On small screens, let the panel shrink and sit snug to the corner. */
@media (max-width: 560px) {
  .map-layer-panel {
    top: 8px;
    left: 8px;
    right: 8px;
    max-width: none;
    padding: 8px 10px 9px;
  }
}

/* Dropdown menus — Phase 14: larger type, continent grouping */
.dropdown-menu {
  position: absolute;
  top: calc(100% + 10px);
  left: 0;
  min-width: 320px;
  background: var(--bg-elevated);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-lg);
  padding: var(--space-2);
  z-index: 100;
  max-height: 75vh;
  overflow-y: auto;
}
.dropdown-menu--right { left: auto; right: 0; }
.dropdown-menu li {
  padding: 11px 14px;
  border-radius: var(--radius-sm);
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--space-3);
  cursor: pointer;
  color: var(--text);
  font-family: var(--font-display);
  font-size: 1rem;
  font-weight: 500;
  transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
}
.dropdown-menu li:hover { background: var(--surface-hover); color: var(--gold-bright); }
.dropdown-menu li[aria-selected="true"] { color: var(--gold); }
/* HEADER-BUGHUNT-2026 (L1): roving-tabindex keyboard focus ring for the
   Region/Mode listbox options (wired in app.js openMenu/wireListboxKeyboardNav). */
.dropdown-menu li[role="option"]:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: -2px;
}
/* Sub-regions (the leaves inside a continent) get a gentle left indent so
   the continent header reads as a parent heading. */
.dropdown-menu li.is-region { padding-left: 26px; font-size: 0.95rem; }
.dropdown-menu li.is-inactive {
  color: var(--text-faint);
  cursor: default;
  font-style: italic;
}
.dropdown-menu li.is-inactive:hover { background: transparent; color: var(--text-faint); }
.dropdown-menu li.is-inactive::after {
  content: "Coming soon";
  font-size: 0.7rem;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: var(--text-faint);
  font-style: normal;
  font-weight: 600;
}

/* Phase 14: "meta-regions" (World + the six continents) act as both
   selectable aggregate views AND visual section barriers between continent
   groups. Tinted background + gold uppercase text clearly separate them
   from regular leaf regions. */
.dropdown-menu li.is-meta {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.82rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--gold);
  background: var(--surface-hover);
  border: 1px solid var(--border);
  margin-top: 6px;
  padding-top: 10px;
  padding-bottom: 10px;
}
.dropdown-menu li.is-meta:first-child { margin-top: 0; }
.dropdown-menu li.is-meta:hover { color: var(--gold-bright); background: var(--surface); }
.dropdown-menu li.is-meta[aria-selected="true"] {
  color: var(--gold-bright);
  background: var(--surface);
  border-color: var(--gold);
}
/* The World entry gets slightly stronger emphasis than the continents —
   it's the super-meta at the top of the list. */
.dropdown-menu li.is-meta[data-region-id="world"] {
  font-size: 0.95rem;
  letter-spacing: 0.2em;
}
.dropdown-menu .region-count {
  font-size: 0.72em;
  font-weight: 500;
  letter-spacing: 0;
  line-height: 1;
  text-transform: none;
  opacity: 0.78;
  white-space: nowrap;
}

/* ---- Region dropdown: three explicit map-like columns ----
   The menu renders the "World" super-meta on its own row at the top, then a
   .region-columns flex row holding three .region-column lists. The columns
   mimic a world map so the eye finds continents where it expects them:
     Col 1: North America → South America
     Col 2: Europe        → Africa → Indian Ocean
     Col 3: Asia          → Oceania
   Each column is a real <ul>, so stacking is exact (no CSS multi-column
   flow guesswork). On narrow screens the columns wrap and read in order. */
.region-select-wrap .dropdown-menu {
  width: max-content;
  max-width: min(940px, calc(100vw - 32px));
}
.region-select-wrap .region-columns {
  display: flex;
  align-items: flex-start;
  gap: var(--space-4);
  margin-top: var(--space-2);
}
.region-select-wrap .region-column {
  list-style: none;
  margin: 0;
  padding: 0;
  flex: 1 1 0;
  min-width: 170px;
}
/* The first meta header in each column shouldn't carry the big top margin
   that normally separates continent groups within a single flow. */
.region-select-wrap .region-column > li.is-meta:first-child { margin-top: 0; }

/* Desktop / iPad: slightly tighter row rhythm (~18–20% less vertical padding)
   so more sub-regions fit in the panel. MOBILE-IPHONE keeps 44px touch targets. */
.region-select-wrap .dropdown-menu li {
  padding-top: 9px;
  padding-bottom: 9px;
  line-height: 1.3;
}
.region-select-wrap .dropdown-menu li.is-meta {
  margin-top: 5px;
  padding-top: 8px;
  padding-bottom: 8px;
}
.region-select-wrap .region-columns {
  margin-top: 0.4rem;
}

/* REGION-HANG-2026: wrapped region labels always hang a small amount so the
   continuation line reads as the same entry (not a sibling). Phone sheet
   keeps a slightly stronger hang in its own rules. */
.region-select-wrap .dropdown-menu li.is-region {
  white-space: normal;
  align-items: flex-start;
}
.region-select-wrap .dropdown-menu li.is-region > span {
  display: block;
  flex: 1 1 auto;
  min-width: 0;
  padding-left: 0.7em;
  text-indent: -0.7em;
  overflow-wrap: break-word;
  word-break: normal;
  hyphens: manual;
  line-height: inherit;
}

/* Narrow screens: two columns (wrap the third under), never force one-col
   until the phone sheet rules below refine typography / hanging wraps. */
@media (max-width: 720px) {
  .region-select-wrap .dropdown-menu {
    max-width: min(560px, calc(100vw - 24px));
  }
  .region-select-wrap .region-columns {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 4px 10px;
    align-items: start;
  }
  .region-select-wrap .region-column {
    flex: unset;
    min-width: 0;
    width: auto;
  }
}

/* ===========================================================
   FILTERS BUTTON (header) + count badge
   =========================================================== */
.filters-wrap { position: relative; display: inline-flex; align-items: center; }
.filters-button {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  box-sizing: border-box;
  padding: 0 var(--header-control-pad-x);
  min-height: var(--header-control-h);
  height: var(--header-control-h);
  border: 1.5px solid var(--gold);
  border-radius: var(--radius-md);
  background: var(--surface);
  color: var(--text);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--header-control-fs);
  letter-spacing: 0.02em;
  line-height: 1;
  cursor: pointer;
  position: relative;
  box-shadow: 0 1px 0 rgba(198, 167, 102, 0.18) inset;
  transition: border-color var(--dur-fast) var(--ease),
              background var(--dur-fast) var(--ease),
              box-shadow var(--dur-fast) var(--ease);
}
.filters-button:hover {
  border-color: var(--gold-bright);
  background: var(--surface-hover);
  box-shadow: 0 2px 6px rgba(198, 167, 102, 0.15);
}
.filters-button:focus-visible { outline: 2px solid var(--gold); outline-offset: 2px; }
.filters-button .filters-icon { color: var(--gold); flex-shrink: 0; }
/* Active (any filter applied) — fill gold to echo the active chips. */
.filters-button.is-active {
  background: var(--gold);
  border-color: var(--gold);
  color: var(--bg);
}
.filters-button.is-active .filters-icon { color: var(--bg); }
:root[data-theme="light"] .filters-button.is-active { color: #fff; }
:root[data-theme="light"] .filters-button.is-active .filters-icon { color: #fff; }
/* Open state — flip the look subtly so it reads as "pressed". */
.filters-button[aria-expanded="true"] {
  border-color: var(--gold-bright);
}
.filters-count {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 20px;
  height: 20px;
  padding: 0 6px;
  border-radius: 999px;
  background: var(--gold);
  color: var(--bg);
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 0.72rem;
  line-height: 1;
}
:root[data-theme="light"] .filters-count { color: #fff; }
/* When the button itself is gold (active), invert the badge so it stays legible. */
.filters-button.is-active .filters-count {
  background: var(--bg);
  color: var(--gold);
}
:root[data-theme="light"] .filters-button.is-active .filters-count {
  background: #fff;
  color: var(--gold);
}
.filters-count[hidden] { display: none; }

/* ===========================================================
   FILTERS PANEL (the "big" filter box, now opened from the header)
   Anchored just under the sticky header, right-aligned to the viewport
   edge so it sits beneath the Filters button on wide screens. Reuses
   the existing .filter-bar / .filter-row / .filter-chips styling inside.
   =========================================================== */
.filters-panel {
  position: fixed;
  /* HEADER-BUGHUNT-2026: sit just under the live header height. Hardcoded
     84px clipped the panel (and its Close control) whenever the header
     grew past that — body.filters-open raises .site-header to z-index 1300
     above this panel, so any overlap is a real cover, not a shadow. */
  top: calc(var(--header-h, 81px) + 4px);
  /* Phase 44: the Filters BUTTON lives in the left header cluster, so anchor
     the panel to the LEFT edge (aligned with the page's content gutter)
     rather than the right. Mirror of the old right-anchor expression. */
  left: max(16px, calc((100vw - var(--max-w)) / 2 + 16px));
  width: min(720px, calc(100vw - 32px));
  max-height: calc(100vh - var(--header-h, 81px) - 20px);
  overflow-y: auto;
  z-index: 120;
  background: var(--bg-elevated);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-lg);
  animation: filtersPanelIn var(--dur-fast) var(--ease);
}
.filters-panel[hidden] { display: none; }
@keyframes filtersPanelIn {
  from { opacity: 0; transform: translateY(-6px); }
  to   { opacity: 1; transform: translateY(0); }
}
.filters-panel-inner { padding: var(--space-4) var(--space-5) var(--space-5); }
.filters-panel-head {
  display: flex;
  align-items: flex-start;
  gap: var(--space-3);
  margin-bottom: var(--space-3);
  padding-bottom: var(--space-3);
  border-bottom: 1px solid var(--border);
}
.filters-panel-head-text {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  flex: 1 1 auto;
  min-width: 0;
}
.filters-panel-match {
  font-family: var(--font-body);
  font-size: 0.78rem;
  font-weight: 600;
  color: var(--text-muted);
  letter-spacing: 0.02em;
}
.filters-panel-match.is-zero {
  color: #c0392b;
  font-weight: 700;
}
:root[data-theme="light"] .filters-panel-match.is-zero { color: #b03020; }
.filters-active-summary {
  display: flex;
  flex-wrap: wrap;
  gap: 0.35rem 0.45rem;
  margin: calc(-1 * var(--space-2)) 0 var(--space-3);
  padding-bottom: var(--space-3);
  border-bottom: 1px dashed var(--border);
}
.filters-active-pill {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  max-width: 100%;
  padding: 0.22rem 0.45rem 0.22rem 0.55rem;
  border: 1px solid var(--gold);
  border-radius: 999px;
  background: rgba(198, 167, 102, 0.12);
  color: var(--text);
  font-family: var(--font-body);
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  cursor: pointer;
  transition: background var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
}
.filters-active-pill:hover {
  background: rgba(198, 167, 102, 0.22);
  border-color: var(--gold-bright);
}
.filters-active-pill-label {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.filters-active-pill-x {
  flex-shrink: 0;
  font-size: 0.85rem;
  line-height: 1;
  opacity: 0.75;
}
.filters-panel-title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.78rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--gold);
}
.clear-all-btn--inline { margin: 0; }
.filters-panel-close {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px; height: 34px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--text-muted);
  cursor: pointer;
  transition: color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
}
.filters-panel-close:hover { color: var(--gold); border-color: var(--gold); }
.filters-panel-close:focus-visible { outline: 2px solid var(--gold); outline-offset: 2px; }
/* The .filter-bar inside the panel no longer needs its own card chrome —
   the panel provides it. Strip the duplicated border/shadow/background. */
.filters-panel .filter-bar {
  background: transparent;
  border: 0;
  box-shadow: none;
  padding: 0;
  gap: var(--space-4);
}

/* Backdrop: shown at every width while the Filters panel is open (on wide
   screens it just dims the page behind the anchored panel; on narrow screens
   the panel becomes a full sheet so the dim reads more like a modal scrim).
   HEADER-BUGHUNT-2026 (C1/L4): this sits ABOVE .site-header (z-index 50), so
   without help it swallows clicks on Region/Mode/jewel/theme while Filters is
   open. body.filters-open (toggled in app.js openFiltersPanel/closeFiltersPanel)
   raises the header above this layer so header controls stay clickable. */
.filters-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(10, 12, 16, 0.5);
  z-index: 110;
  animation: filtersPanelIn var(--dur-fast) var(--ease);
}
.filters-backdrop[hidden] { display: none; }
/* 1300 clears every breakpoint's backdrop/panel z-index (110 desktop, 1240/1250
   on phone — see the iPhone media block below) so this one rule covers all widths. */
body.filters-open .site-header { z-index: 1300; }

/* ===========================================================
   TOOLBAR (Sort + Search) — sticky just below the header,
   directly above the hotel cards.
   =========================================================== */
.toolbar {
  position: sticky;
  /* Phase 44: stick flush to the bottom of the sticky header. --header-h is
     measured live in app.js (ResizeObserver on .site-header) so the toolbar
     always meets the header with NO gap at any width, including phone
     portrait where the header wraps to two rows. Falls back to 81px before
     the script runs. */
  top: var(--header-h, 81px);
  z-index: 40;
  background: var(--bg-sunken);
  border-bottom: 1px solid var(--border);
  backdrop-filter: blur(12px);
  /* TOOLBAR-ROUND-2026 — soften the previously hard-square sort/search band by
     rounding its bottom corners. The top stays flush against the header; only
     the lower edge curves, so the green band reads as a gently-rounded shelf
     rather than a sharp block. */
  border-bottom-left-radius: var(--radius-lg);
  border-bottom-right-radius: var(--radius-lg);
}
.toolbar-inner {
  max-width: var(--max-w);
  margin: 0 auto;
  padding: var(--space-3) var(--space-6);
  display: flex;
  align-items: center;
  gap: var(--space-4);
  flex-wrap: wrap;
}
.toolbar-sort {
  display: inline-flex;
  align-items: center;
  gap: var(--space-3);
  flex: 0 0 auto;
}
.toolbar-search {
  flex: 1 1 320px;
  min-width: 220px;
  display: flex;
  justify-content: flex-end;
}
/* TOOLBAR-FILIGREE-2026 (2026-06-07, eve; was HEADER-FLOURISH-2026): the search
   box was SHORTENED (was 420px) and stays right-aligned. Shortening it frees a
   wide gap to its LEFT (between it and the Sort dropdown) — the home of the new
   centred .toolbar-filigree ornament. (The old "kissing" green/purple columns
   this gap originally hosted were removed at owner request.) */
.toolbar .toolbar-search .filter-search-wrap { max-width: 280px; width: 280px; flex: 0 1 280px; }
.toolbar .toolbar-search .filter-search-input { max-width: 280px; }
.toolbar-label {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.68rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--text-muted);
  white-space: nowrap;
}
.toolbar .filter-select-wrap--always { display: block; min-width: 200px; max-width: 240px; }
/* Phase 44: give the Sort dropdown the SAME filled interior as the search
   box (var(--surface)) so its contents stand out against the toolbar bar,
   matching the search input beside it. Scoped to the toolbar so the filter
   panel's transparent selects are untouched. */
.toolbar .filter-select {
  background: var(--surface);
  border-color: var(--border);
}
.toolbar .filter-select:hover,
.toolbar .filter-select:focus {
  border-color: var(--gold);
  background: var(--surface-hover, var(--surface));
}
.toolbar .filter-select option { background: var(--bg-elevated); color: var(--text); }

/* ---- Responsive: Filters button, panel, and toolbar ---- */

/* On wide screens (filter chips visible) the panel keeps the rich chip
   layout. Below 720px the inner filter rows already collapse to native
   <select>s via the existing .filter-chips/.filter-select-wrap rules. */

@media (max-width: 820px) {
  /* Header stays single-row (HEADER-COMPRESS-2026); --header-h is measured live. */
  .filters-panel { top: calc(var(--header-h, 81px) + 4px); max-height: calc(100vh - var(--header-h, 81px) - 20px); }
}

@media (max-width: 720px) {
  /* Collapse the Filters button to the mixer icon only. */
  .filters-button .filters-button-label { display: none; }
  .filters-button {
    padding: 0;
    width: var(--header-control-h);
    min-width: var(--header-control-h);
    height: var(--header-control-h);
    justify-content: center;
  }
  /* Count badge floats as a corner bubble on the icon-only button. */
  .filters-button .filters-count {
    position: absolute;
    top: -6px;
    right: -6px;
    border: 2px solid var(--bg-sunken);
  }
}

@media (max-width: 640px) {
  .filters-panel { top: calc(var(--header-h, 120px) + 4px); max-height: calc(100vh - var(--header-h, 120px) - 20px); }
  /* Panel becomes a near-full-width sheet (left+right insets). */
  .filters-panel {
    right: 12px;
    left: 12px;
    width: auto;
  }
  /* Toolbar stacks: Sort on top, Search full-width below it (portrait). */
  .toolbar-inner { padding: var(--space-3) var(--space-4); gap: var(--space-2); }
  .toolbar-search { flex-basis: 100%; justify-content: stretch; min-width: 0; }
  .toolbar-search .filter-search-wrap { max-width: none; }
  .toolbar .filter-select-wrap--always { max-width: none; flex: 1 1 auto; }
  .toolbar-sort { flex: 1 1 100%; }
}

/* ===========================================================
   HERO
   =========================================================== */
.hero {
  position: relative;
  padding: var(--space-10) var(--space-6) var(--space-8);
  max-width: var(--max-w);
  margin: 0 auto;
  overflow: hidden;
}

/* Corner art placeholders (where hhatlas has tall ad-frames) */
.art-frame {
  position: absolute;
  width: 150px;
  height: 240px;
  border: 1px solid var(--placeholder-border);
  background: var(--placeholder-bg);
  border-radius: 2px;
  opacity: 0.85;
}
.art-frame--tl { top: var(--space-6); left: 0; }
.art-frame--tr { top: var(--space-6); right: 0; }
.art-frame--bl { bottom: var(--space-6); left: 0; }
.art-frame--br { bottom: var(--space-6); right: 0; }

.hero-inner {
  max-width: 720px;
  margin: 0 auto;
  text-align: center;
  position: relative;
  z-index: 2;
}

.hero-placeholders {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--space-4);
  max-width: 620px;
  margin: 0 auto var(--space-6);
}
.hero-ph {
  aspect-ratio: 3 / 4;
  background: transparent;
  position: relative;
  overflow: visible;
  border-radius: 2px;
}
.mascot {
  width: 100%;
  height: 100%;
  object-fit: contain;
  display: block;
  /* Keep pixels crisp at every zoom */
  image-rendering: pixelated;
  image-rendering: crisp-edges;
}
/* Theme-aware: show the right variant, hide the other */
.mascot--light { display: none; }
:root[data-theme="light"] .mascot--dark { display: none; }
:root[data-theme="light"] .mascot--light { display: block; }

.crest-divider {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  margin: var(--space-5) auto;
  max-width: 140px;
}
.crest-divider .bar { flex: 1; height: 1px; background: var(--gold); opacity: 0.6; }
.crest-divider .dot { width: 5px; height: 5px; background: var(--gold); transform: rotate(45deg); }
.crest-divider--short { max-width: 40px; margin: var(--space-3) auto; }
.crest-divider--short .bar { background: var(--text-muted); opacity: 0.5; }

.hero-title {
  font-family: var(--font-serif);
  font-style: italic;
  font-weight: 500;
  font-size: clamp(2.75rem, 6vw, 4.25rem);
  line-height: 1.05;
  color: var(--gold);
  margin: 0 0 var(--space-2);
  letter-spacing: -0.01em;
}
.hero-subtitle {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.9375rem;
  letter-spacing: 0.35em;
  color: var(--text-muted);
  margin-bottom: var(--space-2);
}
.region-eyebrow {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.72rem;
  letter-spacing: 0.38em;
  color: var(--gold);
  text-transform: uppercase;
  margin: var(--space-3) 0 2px;
  display: block;
  min-height: 1em; /* reserve space so hero doesn't jump when hidden */
}
.region-eyebrow[hidden] { visibility: hidden; display: block; }
.region-title {
  font-family: var(--font-display);
  font-weight: 900;
  font-size: clamp(3rem, 8vw, 5.5rem);
  line-height: 1;
  color: var(--text);
  margin: var(--space-2) 0 var(--space-3);
  letter-spacing: -0.02em;
}
.tagline {
  font-family: var(--font-serif);
  font-style: italic;
  font-size: 1.375rem;
  color: var(--text-muted);
  margin: var(--space-4) 0 var(--space-6);
  font-weight: 400;
}

.hero-nav {
  display: flex; gap: var(--space-8);
  justify-content: center;
  margin: var(--space-6) 0;
  flex-wrap: wrap;
}
.hero-nav--secondary { gap: var(--space-5); margin-top: var(--space-5); }
.hero-nav-item { display: flex; flex-direction: column; align-items: center; gap: 10px; }
.hero-nav-rule { width: 44px; height: 2px; background: var(--gold); }
.hero-nav-label {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.78rem;
  letter-spacing: 0.22em;
  color: var(--text);
}
.hero-nav-label--sm { font-size: 0.68rem; color: var(--text-muted); letter-spacing: 0.18em; }

/* (Phase 44: the "EXPLORE THE ATLAS" hero-arrow cue was removed per request;
   its styles are gone with it.) */

/* ===========================================================
   RESULTS
   =========================================================== */
.results {
  max-width: var(--max-w);
  margin: 0 auto;
  /* SCROLL-NUDGE-2026: trim the gap between the hero and the first card row so
     the top of row 1 "peeks" above the fold on a maximized ~1440x900 window —
     a strong, well-documented cue that there is more to scroll. Vertical only;
     horizontal padding and the layout are unchanged. Top pad tightened from
     --space-6 (2rem) to a viewport-aware clamp that stays comfortable on tall
     screens but compresses on short ones. */
  padding: clamp(0.45rem, 1vh, 0.85rem) var(--space-6) var(--space-10);
}
/* SCROLL-NUDGE-2026: header-to-cards gap tightened from --space-8 (3rem). */
.results-header { text-align: center; margin-bottom: clamp(1.25rem, 2.4vh, 2rem); }
.results-eyebrow {
  display: inline-flex; align-items: center; gap: 10px;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.75rem;
  letter-spacing: 0.28em;
  color: var(--gold);
  margin-bottom: var(--space-3);
}
.results-eyebrow .em-dash { opacity: 0.7; }
.results-heading {
  font-family: var(--font-serif);
  font-style: italic;
  font-weight: 500;
  font-size: clamp(1.75rem, 3.5vw, 2.5rem);
  color: var(--text);
  margin: 0;
}
.results-sep { color: var(--gold); margin: 0 10px; font-style: normal; }
.results-sub {
  font-family: var(--font-body);
  font-size: 0.9rem;
  color: var(--text-muted);
  margin-top: var(--space-2);
  font-weight: 300;
}

/* Card grid */
/* Phase 27d: auto-fill (not auto-fit) so that when only 1–2 hotels match a
   filter combination, the remaining tracks stay reserved — i.e. the cards
   keep their normal ~280px width instead of stretching to fill the entire
   row. On narrow viewports (mobile), the inner minmax min(100%, 280px) still
   collapses to a single full-width column. */
.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr));
  gap: var(--space-5);
}

.card {
  display: flex;
  flex-direction: column;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  overflow: hidden;
  cursor: pointer;
  transition: border-color var(--dur-med) var(--ease), transform var(--dur-med) var(--ease), box-shadow var(--dur-med) var(--ease);
  position: relative;
  text-align: left;
  font-family: inherit;
  color: inherit;
  width: 100%;
}
.card:hover {
  border-color: var(--gold);
  transform: translateY(-3px);
  box-shadow: var(--shadow-lg);
}

/* Numbered rank chip removed per user request (Phase 16). Rule kept as a
   no-op so any lingering markup — or cached HTML — stays invisible. */
.card-rank { display: none; }

.card-art {
  aspect-ratio: 16 / 10;
  border-bottom: 1px solid var(--border);
  background: #0a0a0a;
  border-left: 0;
  border-right: 0;
  border-top: 0;
  position: relative;
  overflow: hidden;
  /* CARD-PHOTO-ROUND-2026 — just a tiny bit of softening on the header photo's
     top corners (the card itself clips at --radius-lg; this gives the image a
     slightly gentler inner curve so the photo edge isn't a hard square).
     Intentionally small per direction ("just a tiny bit on the photos"). */
  border-top-left-radius: var(--radius-sm);
  border-top-right-radius: var(--radius-sm);
}

/* Phase 35.5: card hero art is now real SerpAPI / photos.json photography,
   so we use smooth (auto) image rendering. The legacy 16-bit pixelated
   /images/hotels/<id>.png path has been retired. */
.card-art-img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  image-rendering: auto;
}

/* Placeholder variant: Coming Soon hotels, or fallback if the image file
   happens to fail to load. */
.card-art--placeholder {
  background: var(--placeholder-bg);
}
.card-art--placeholder::after {
  content: "";
  position: absolute;
  inset: 10px;
  border: 1px solid var(--placeholder-border);
  border-radius: 2px;
  opacity: 0.9;
}

/* Card price badge (Phase 19.4 / CARD-STAY-STACK-2026)
   Week-over-week swing pill ('% better/worse vs last wknd') sits in
   the middle of a stay-row, between the left label and the right price.
   Compressed copy + nowrap so the oval stays one readable line. */
.card-price-badge-slot {
  /* Legacy two-column reserved lane — unused on the stacked stay-rows. */
  display: none;
}
.card-price-badge {
  display: inline-flex;
  flex-wrap: nowrap;
  align-items: center;
  justify-content: center;
  gap: 1px 4px;
  max-width: 100%;
  padding: 2px 6px;
  border-radius: 999px;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 0.5rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  border: 1px solid currentColor;
  background: transparent;
  line-height: 1.15;
  text-align: center;
  white-space: nowrap;
  overflow-wrap: normal;
}
.card-price-badge-kicker {
  font-weight: 700;
  white-space: nowrap;
}
.card-price-badge-rest {
  white-space: nowrap;
}

/* Week-over-week swing badges — only render when |Δ| > 20%. Intentionally
   brighter than any prior chip so a big swing leaps off the grid. */
.card-price-badge--wow-better {
  color: #3ddc7e;
  font-weight: 700;
}
.card-price-badge--wow-worse {
  color: #ff5252;
  font-weight: 700;
}

/* Phase 19.3: subtle visual cue that the right-column price is historical
   (last weekend) rather than the live following-weekend rate. Keep it
   neutral — same color & size as the standard gold price — but add a soft
   italic so a quick scan flags it as backward-looking. */
.card-price--last {
  font-style: italic;
  opacity: 0.92;
}

.card-body { padding: var(--space-5); display: flex; flex-direction: column; gap: var(--space-3); flex: 1; min-width: 0; }

.card-brand {
  /* Phase 28j: when a card has both a Forbes and a MICHELIN chip, the second
     chip used to overflow the card on narrower viewports (no wrap). Allow
     wrapping so both chips stay fully visible; row-gap keeps the wrapped line
     visually separated from the brand label above. */
  display: flex; flex-wrap: wrap; align-items: center;
  column-gap: 8px; row-gap: 4px;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.7rem;
  letter-spacing: 0.22em;
  color: var(--brand-badge-text);
  text-transform: uppercase;
}
.card-brand::before { content: "—"; color: var(--gold); }

/* Brand label + membership chips on one row (membership right-aligned). */
.card-brand-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  flex-wrap: wrap;
  min-width: 0;
}
.card-brand-row .card-brand {
  flex: 0 1 auto;
  min-width: 0;
}
.card-brand-row .card-memberships {
  flex: 0 0 auto;
  margin: 0;
  justify-content: flex-end;
}

/* =====================================================================
   PER-ERA CARD-NAME TYPOGRAPHY (CARD-NAME-ERA-2026)
   QA fix #1 — the biggest cohesion gap. Previously every card title across
   all 8 looks rendered in Cormorant Garamond serif, so the era only lived in
   the page chrome/hero/ornaments and NEVER in the grid itself. Now each era
   drives a distinct display face (and weight / spacing / case) for the hotel
   name via the --font-card-name family + the --card-name-* knobs, so the card
   grid itself reads unmistakably Belle Époque vs Deco vs Mid-century vs
   Editorial. All faces are already loaded in index.html. Belle Époque keeps a
   romantic high-contrast serif (Gilda) to stay the warm default; Art Deco uses
   inscriptional Roman caps (Cinzel, letter-spaced, small-caps feel); Mid-
   century uses the warm geometric Poppins semibold the QA noted was missing
   from the grid; Editorial uses the clean modern Cabinet Grotesk display sans.
   The defaults below fall back to the old serif so any un-themed context is
   unchanged. */
.card-name {
  /* CARD-NAME-SERIF-2026 — owner: hotel names back to elegant unified serif
     (Cormorant Garamond); era --font-card-name sans overrides no longer apply. */
  font-family: var(--font-serif);
  font-weight: var(--card-name-weight, 700);
  font-size: var(--card-name-size, 1.5rem);
  line-height: var(--card-name-leading, 1.25);
  letter-spacing: var(--card-name-tracking, normal);
  text-transform: var(--card-name-case, none);
  color: var(--text);
  margin: 0;
}

.card-city {
  font-family: var(--font-body);
  font-size: 0.85rem;
  color: var(--text-muted);
  font-weight: 400;
  display: flex; align-items: center; gap: 6px;
}
.card-city svg { color: var(--gold); flex-shrink: 0; }

/* =====================================================================
   LHA-TIER-CARD-META-2026 — the LHA Tier is now a very small plain-text
   "LHA Tier: N" listing in the card footer (.card-meta), to the LEFT of
   "Rooms". The previous proud gold-diamond emblem that sat under the hotel
   name has been RETIRED at the owner's request; its full implementation is
   archived verbatim in docs/design/LHA_TIER_CARD_EMBLEM_ARCHIVE.md so it can
   be restored later. The card-emblem CSS (.lha-tier / .lha-tier-medallion /
   .lha-tier-numeral / .lha-tier-text / .lha-tier-kicker / .lha-tier-name /
   .lha-tier--5 / .lha-tier--6) was removed from here. NOTE: the prototype
   MODAL tier section (.lha-tier-section, .lha-tier__*, .lha-tier-pip,
   .lha-tier-ev) has since also been removed at the owner's request — it was
   not ready to show users. Only this small card-footer indicator remains.
   .card-meta-tier inherits the muted footer styling from .card-meta; the
   inner <strong> picks up .card-meta span strong automatically.
   TIER-COLOR-RAMP-2026: the bare numeral now takes Map Mode's per-tier text
   color (see .atlas-pin-label-tier--t1..t6) via .card-meta-tier-value--t1..t6,
   so a Tier 6 property reads in the map's royal purple and a Tier 1 in its
   quiet bronze-gold right in the card footer — consistent with Map/Directory,
   still deliberately just a color change on one small numeral, not a returned
   emblem (see docs/design/LHA_TIER_CARD_EMBLEM_ARCHIVE.md for the retired
   design). */
.card-meta-tier { white-space: nowrap; }
.card-meta-tier-value { font-weight: 700; }
.card-meta-tier-value--t1 { color: #6a4f17; }
.card-meta-tier-value--t2 { color: #8f6f2e; }
.card-meta-tier-value--t3 { color: #d4a017; }
.card-meta-tier-value--t4 { color: #12897a; }
.card-meta-tier-value--t5 { color: #2a3f9e; }
.card-meta-tier-value--t6 { color: #5a2d8a; }
:root[data-theme="dark"] .card-meta-tier-value--t1 { color: #d4c4a0; }
:root[data-theme="dark"] .card-meta-tier-value--t2 { color: #d9bf82; }
:root[data-theme="dark"] .card-meta-tier-value--t3 { color: #f5c84a; }
:root[data-theme="dark"] .card-meta-tier-value--t4 { color: #5ef0d4; }
:root[data-theme="dark"] .card-meta-tier-value--t5 { color: #a8bcff; }
:root[data-theme="dark"] .card-meta-tier-value--t6 { color: #d4b8ff; }

/* Phase 28: Nearest-hotel badge. Renders right below .card-city when another
   atlas hotel is within 3 km. Uses the same muted-text styling as .card-city
   so the eye treats them as a single “location” block, but a smaller font and
   subtler icon to clearly subordinate it. */
.card-nearest {
  font-family: var(--font-body);
  font-size: 0.78rem;
  color: var(--text-muted);
  font-weight: 400;
  /* Phase 28j: long neighbor names used to truncate with "…" and hide the
     distance suffix. Switched to flex-start + wrap so the icon pins to the
     first line while the text can wrap onto a second line; distance is its
     own non-wrapping span and always stays intact. */
  display: flex;
  align-items: flex-start;
  gap: 6px;
  margin-top: 2px;
  opacity: 0.85;
  line-height: 1.35;
}
.card-nearest svg {
  color: var(--gold); flex-shrink: 0; opacity: 0.7;
  margin-top: 3px; /* optical alignment to first text line at this font size */
}
.card-nearest .card-nearest-text {
  display: inline; min-width: 0;
  overflow-wrap: anywhere;
}
.card-nearest .card-nearest-dist {
  white-space: nowrap; /* never break "5.0 km away" mid-token */
}

/* Phase 19.5: one-sentence "hook" — the most compelling thing about
   this hotel — sits between the city line and the divider on the card.
   Roman serif so it reads as editorial / human voice next to the rest of
   the card's data-heavy treatment. line-clamp prevents very long pitches
   from blowing up card height (we still want every pitch tight, but this
   is a guard rail). */
.card-pitch {
  font-family: var(--font-serif);
  font-style: normal;
  /* CARD-PITCH-SIZE-BUMP-2026 — noticeably larger hook text; still subordinate
     to .card-name (~1.3rem+). Color stays var(--text) / dark var(--card-ink). */
  font-size: 1.125rem;
  line-height: 1.45;
  color: var(--text);
  margin: 2px 0 0 0;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* ===== CARD-NAVY-DARK-2026 — START ==========================================
   Dark-mode-ONLY hotel-card treatment (light mode untouched). Per direction:
   (1) give the card interior a navy background — a bit like the old all-page
       navy but LIGHTER (old page navy was #0a1628; cards now #192740);
   (2) raise the contrast of the card's outer hairline AND the internal
       horizontal/vertical section dividers — they previously used the faint
       gold --border (rgba(198,167,102,.18)) which nearly vanished. We switch
       to a muted "moonlit steel" blue that reads clearly against the navy
       without being garish (cool, desaturated, low-key luxe);
   (3) brighten the card lettering toward a cool near-white;
   (4) enlarge the italic pitch (italics are the hardest face to read at the
       same size as roman) on the card AND in the modal;
   (5) nudge the hotel NAME size up a touch.
   These are scoped to [data-theme="dark"] .card / .modal so no other surface,
   and no light-mode styling, is affected. Tokens are declared on the card so
   every divider inside inherits one consistent contrast color. */
:root[data-theme="dark"] .card {
  background: var(--card-navy);
  border-color: var(--card-line);
}
:root[data-theme="dark"] .card:hover {
  /* keep the warm-gold hover accent so hover still reads as the active state,
     but lift the interior slightly so the navy feels interactive too. */
  background: var(--card-navy-hover);
  border-color: var(--gold);
}
/* (2) Internal dividers + image base-rule + the two-weekend vertical separator
   all pick up the steel line color instead of the faint gold --border. */
:root[data-theme="dark"] .card .card-art {
  border-bottom-color: var(--card-line-soft);
}
:root[data-theme="dark"] .card .card-stay-row,
:root[data-theme="dark"] .card .card-next-month-row,
:root[data-theme="dark"] .card .card-meta {
  border-top-color: var(--card-line-soft);
}
:root[data-theme="dark"] .card .card-price-cell--following {
  border-left-color: var(--card-line-soft);
}
:root[data-theme="dark"] .card .card-divider {
  background: var(--card-line-soft);
}
/* (3) Brighter, slightly whiter lettering on the navy. */
:root[data-theme="dark"] .card .card-name {
  color: var(--card-ink);
}
:root[data-theme="dark"] .card .card-city {
  color: #c2cbdd;                  /* brighter cool-grey than warm --text-muted */
}
:root[data-theme="dark"] .card .card-pitch {
  /* (4) larger pitch; ink matches .card-name on navy cards. */
  color: var(--card-ink);
  font-size: 1.16rem;
  line-height: 1.52;
}
:root[data-theme="dark"] .card .card-meta,
:root[data-theme="dark"] .card .card-meta span strong {
  color: #aab4c8;                  /* lift the faint footer text on navy */
}
/* (5) Hotel name a touch larger (clamp keeps it within the era's set size). */
:root[data-theme="dark"] .card .card-name {
  font-size: calc(var(--card-name-size, 1.5rem) * 1.06);
}
/* (4 cont.) Modal pitch + shell — same navy family as cards. */
:root[data-theme="dark"] .modal-pitch {
  font-size: 1.28rem;
  line-height: 1.6;
  color: var(--card-ink);
  border-bottom-color: var(--card-line-soft);
}
:root[data-theme="dark"] .modal {
  background: var(--card-navy);
  border-color: var(--card-line);
  color: var(--card-ink);
  /* Re-token --surface inside the modal so collapsible bodies, restaurant cards,
     guest-voice blocks, price/craft/chip panels inherit cool near-black instead
     of era warm browns. Section header bars keep --contrast-green (unchanged). */
  --surface: var(--modal-section-bg);
  --surface-hover: var(--modal-section-bg-hover);
}
:root[data-theme="dark"] .modal-close {
  background: var(--card-navy-hover);
  border-color: var(--card-line-soft);
  color: var(--card-ink);
}
:root[data-theme="dark"] .modal-close:hover {
  border-color: var(--gold);
  color: var(--gold);
}
/* ===== CARD-NAVY-DARK-2026 — END ============================================ */

.card-divider {
  height: 1px;
  background: var(--border);
  margin: var(--space-2) 0;
}

/* Phase 34: card-level Guest Rating row.
   Sits between the pitch (or nearest badge if no pitch) and the divider that
   separates the price block. Visually it's a small data row — gold star icon
   + body text — to feel like a sibling of .card-nearest rather than a heavy
   chip. We avoid the gold treatment for the number itself so it doesn't
   compete with the price column below. */
.card-guest-rating {
  font-family: var(--font-body);
  font-size: 0.82rem;
  color: var(--text);
  display: flex;
  align-items: center;
  gap: 6px;
  margin-top: 6px;
  line-height: 1.35;
}
.card-guest-rating svg {
  color: var(--gold);
  flex-shrink: 0;
  opacity: 0.95;
}
.card-guest-rating-text strong {
  font-weight: 600;
  color: var(--text-muted);
  font-weight: 500;
}

/* CARD-RATING-EXTREME-2026: per-region percentile tint on the Google / TA
   score numeral. Three intensities per side — high3/high2/high1 = top 5% /
   5–10% / 10–15% green; low3/low2/low1 = bottom 5% / 5–10% / 10–15% pink-red.
   Palette matches MAP-RATING-EXTREME-2026 high-10 / low-10; wash+glow shape
   matches TA-RANK-GLOW-2026 (step opacity, not a new hue). Same classes on
   desktop and MOBILE-IPHONE-2026. */
.card-rating-num {
  font-variant-numeric: tabular-nums;
}
.card-rating-num.is-rating-high3,
.card-rating-num.is-rating-high2,
.card-rating-num.is-rating-high1,
.card-rating-num.is-rating-low3,
.card-rating-num.is-rating-low2,
.card-rating-num.is-rating-low1 {
  border-radius: 4px;
  padding: 0 3px;
  margin: 0 -1px;
}
/* Faint (10–15%) — light wash so the scale is gradual; still reads on cream. */
.card-rating-num.is-rating-high1 {
  font-weight: 700;
  color: #14532d;
  background: color-mix(in srgb, #22c55e 6%, transparent);
  box-shadow:
    0 0 5px color-mix(in srgb, #22c55e 20%, transparent),
    0 0 1px color-mix(in srgb, #22c55e 28%, transparent);
  text-shadow: 0 0 4px color-mix(in srgb, #4ade80 26%, transparent);
}
.card-rating-num.is-rating-low1 {
  font-weight: 700;
  color: #b91c1c;
  background: color-mix(in srgb, #ec4899 6%, transparent);
  box-shadow:
    0 0 5px color-mix(in srgb, #ec4899 20%, transparent),
    0 0 1px color-mix(in srgb, #f87171 28%, transparent);
  text-shadow: 0 0 4px color-mix(in srgb, #f472b6 26%, transparent);
}
/* Medium (5–10%) — former single-band strength. */
.card-rating-num.is-rating-high2 {
  font-weight: 800;
  color: #14532d;
  background: color-mix(in srgb, #22c55e 12%, transparent);
  box-shadow:
    0 0 8px color-mix(in srgb, #22c55e 42%, transparent),
    0 0 1px color-mix(in srgb, #22c55e 55%, transparent);
  text-shadow: 0 0 6px color-mix(in srgb, #4ade80 50%, transparent);
}
.card-rating-num.is-rating-low2 {
  font-weight: 800;
  color: #b91c1c;
  background: color-mix(in srgb, #ec4899 12%, transparent);
  box-shadow:
    0 0 8px color-mix(in srgb, #ec4899 42%, transparent),
    0 0 1px color-mix(in srgb, #f87171 55%, transparent);
  text-shadow: 0 0 6px color-mix(in srgb, #f472b6 50%, transparent);
}
/* Intense (top/bottom 5%) — true outliers only. */
.card-rating-num.is-rating-high3 {
  font-weight: 800;
  color: #14532d;
  background: color-mix(in srgb, #22c55e 18%, transparent);
  box-shadow:
    0 0 10px color-mix(in srgb, #22c55e 58%, transparent),
    0 0 16px color-mix(in srgb, #22c55e 28%, transparent),
    0 0 1px color-mix(in srgb, #22c55e 70%, transparent);
  text-shadow:
    0 0 8px color-mix(in srgb, #4ade80 62%, transparent),
    0 0 12px color-mix(in srgb, #22c55e 36%, transparent);
}
.card-rating-num.is-rating-low3 {
  font-weight: 800;
  color: #b91c1c;
  background: color-mix(in srgb, #ec4899 18%, transparent);
  box-shadow:
    0 0 10px color-mix(in srgb, #ec4899 58%, transparent),
    0 0 16px color-mix(in srgb, #f87171 28%, transparent),
    0 0 1px color-mix(in srgb, #f87171 70%, transparent);
  text-shadow:
    0 0 8px color-mix(in srgb, #f472b6 62%, transparent),
    0 0 12px color-mix(in srgb, #ec4899 36%, transparent);
}
:root[data-theme="dark"] .card .card-rating-num.is-rating-high1 {
  color: #bbf7d0;
  background: color-mix(in srgb, #22c55e 10%, transparent);
  box-shadow:
    0 0 6px color-mix(in srgb, #4ade80 28%, transparent),
    0 0 1px color-mix(in srgb, #22c55e 36%, transparent);
  text-shadow: 0 0 5px color-mix(in srgb, #4ade80 38%, transparent);
}
:root[data-theme="dark"] .card .card-rating-num.is-rating-low1 {
  color: #fca5a5;
  background: color-mix(in srgb, #ec4899 10%, transparent);
  box-shadow:
    0 0 6px color-mix(in srgb, #f472b6 28%, transparent),
    0 0 1px color-mix(in srgb, #f87171 36%, transparent);
  text-shadow: 0 0 5px color-mix(in srgb, #f472b6 38%, transparent);
}
:root[data-theme="dark"] .card .card-rating-num.is-rating-high2 {
  color: #bbf7d0;
  background: color-mix(in srgb, #22c55e 18%, transparent);
  box-shadow:
    0 0 9px color-mix(in srgb, #4ade80 50%, transparent),
    0 0 1px color-mix(in srgb, #22c55e 60%, transparent);
  text-shadow: 0 0 7px color-mix(in srgb, #4ade80 65%, transparent);
}
:root[data-theme="dark"] .card .card-rating-num.is-rating-low2 {
  color: #fca5a5;
  background: color-mix(in srgb, #ec4899 18%, transparent);
  box-shadow:
    0 0 9px color-mix(in srgb, #f472b6 50%, transparent),
    0 0 1px color-mix(in srgb, #f87171 60%, transparent);
  text-shadow: 0 0 7px color-mix(in srgb, #f472b6 65%, transparent);
}
:root[data-theme="dark"] .card .card-rating-num.is-rating-high3 {
  color: #bbf7d0;
  background: color-mix(in srgb, #22c55e 24%, transparent);
  box-shadow:
    0 0 11px color-mix(in srgb, #4ade80 62%, transparent),
    0 0 18px color-mix(in srgb, #22c55e 36%, transparent),
    0 0 1px color-mix(in srgb, #22c55e 72%, transparent);
  text-shadow:
    0 0 8px color-mix(in srgb, #4ade80 72%, transparent),
    0 0 14px color-mix(in srgb, #22c55e 42%, transparent);
}
:root[data-theme="dark"] .card .card-rating-num.is-rating-low3 {
  color: #fca5a5;
  background: color-mix(in srgb, #ec4899 24%, transparent);
  box-shadow:
    0 0 11px color-mix(in srgb, #f472b6 62%, transparent),
    0 0 18px color-mix(in srgb, #f87171 36%, transparent),
    0 0 1px color-mix(in srgb, #f87171 72%, transparent);
  text-shadow:
    0 0 8px color-mix(in srgb, #f472b6 72%, transparent),
    0 0 14px color-mix(in srgb, #ec4899 42%, transparent);
}

.card-price-block {
  margin-top: auto;
  width: 100%;
  min-width: 0;
}

/* CARD-STAY-STACK-2026 — three identical single-rows:
   Upcoming, Following, Next Month. Label left, optional WoW oval in the
   middle, price right with dates under the price. First row has no top
   rule (the .card-divider above the block is the separator). */
.card-stay-row {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  gap: 8px;
  min-width: 0;
  width: 100%;
  margin-top: var(--space-2);
  padding-top: var(--space-2);
  border-top: 1px solid var(--border);
  box-sizing: border-box;
}
.card-price-block > .card-divider + .card-stay-row {
  margin-top: 0;
  padding-top: 0;
  border-top: none;
}
.card-price-label--stay {
  display: flex;
  flex-direction: column;
  gap: 1px;
  flex: 0 1 auto;
  min-width: 0;
  max-width: 8.6rem;
  letter-spacing: 0.12em;
  font-size: 0.6rem;
}
.card-stay-warn {
  flex: 1 1 8.5rem;
  min-width: 7.4rem;
  max-width: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  overflow: visible;
}
.card-stay-warn .card-price-badge {
  max-width: 100%;
  flex-shrink: 0;
}
/* When a WoW oval is present, give the pill a middle lane by capping
   label width — never shrink the weekend-label type (already small caps).
   Dropping "Stay" from the labels is the space trade, not smaller type. */
.card-stay-row:has(.card-stay-warn) {
  gap: 6px;
}
.card-stay-row:has(.card-stay-warn) .card-price-label--stay {
  max-width: 5.4rem;
}
.card-stay-row:has(.card-stay-warn) .card-stay-price {
  max-width: 42%;
}
.card-stay-price {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  justify-content: center;
  text-align: right;
  flex: 0 1 auto;
  min-width: 0;
  max-width: 50%;
  margin-left: auto;
}
.card-stay-price .card-price {
  white-space: nowrap;
}
.card-stay-price .card-price-wrap {
  align-items: flex-end;
}
.card-stay-price .card-price-dates {
  margin-top: 0.12rem;
}
.card-stay-price .card-price-native,
.card-stay-price .card-price-spike-context,
.card-stay-price .card-price-lead-note {
  max-width: 100%;
  text-align: right;
}
.card-stay-price .card-price-lead-note {
  white-space: normal;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
}
.card-stay-price .card-price-trust-banner {
  width: auto;
  max-width: 100%;
  font-size: 0.5rem;
  padding: 0.18rem 0.32rem;
  margin-bottom: 0.18rem;
}
.card-stay-price-pending {
  display: flex;
  flex-direction: row;
  align-items: baseline;
  justify-content: flex-end;
  flex-wrap: wrap;
  gap: 0.45rem;
  text-align: right;
}
.card-stay-row--pipeline {
  align-items: flex-start;
}
.card-stay-row--pipeline .card-stay-price {
  max-width: 70%;
  align-items: flex-end;
}

/* Phase 12 — Dual-weekend card price layout (retired CARD-STAY-STACK-2026;
   kept so any cached markup still lays out). */
.card-price-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: var(--space-3);
  row-gap: var(--space-1);
  align-items: stretch;
}
.card-price-cell {
  display: grid;
  grid-template-rows: 30px minmax(2.35em, auto) auto;
  grid-template-columns: minmax(0, 1fr);
  row-gap: 6px;
  min-width: 0;
}
.card-price-cell--following {
  /* Subtle separator between the two weekends on wide cards. */
  padding-left: var(--space-3);
  border-left: 1px dashed var(--border);
}
.card-price {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 1.45rem;
  color: var(--gold);
  letter-spacing: 0.02em;
  line-height: 1.05;
}
/* Saturated/intense variant used for the new dual-weekend prices.        */
/* Falls back gracefully if --gold-bright isn't defined in a theme.       */
.card-price--gold {
  color: var(--gold-bright, var(--gold));
  text-shadow: 0 0 0.5px currentColor; /* micro-boost intensity, no glow */
}
/* PRICE-TRUST-2026: sub-$40 captures we store but do not trust — somber gray, not gold. */
.card-price-wrap {
  display: flex;
  flex-direction: column;
  min-width: 0;
}
.card-price-wrap--untrusted .card-price-dates {
  opacity: 0.75;
}
.card-price--untrusted {
  color: var(--text-faint);
  font-weight: 700;
  opacity: 0.72;
  text-shadow: none;
}
.card-price-trust-banner {
  display: block;
  width: 100%;
  box-sizing: border-box;
  margin-bottom: 0.35rem;
  padding: 0.32rem 0.45rem;
  font-family: var(--font-body);
  font-size: 0.58rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  line-height: 1.25;
  text-align: center;
  text-transform: uppercase;
  color: #fff;
  background: #c0392b;
  border: 1px solid #922b21;
  border-radius: 2px;
}
:root[data-theme="light"] .card-price-trust-banner {
  background: #b03020;
  border-color: #862415;
}
.card-price--dummy {
  color: var(--text-faint);
  font-weight: 700;
  opacity: 0.55;
}
.card-price-label {
  font-family: var(--font-display);
  font-size: 0.64rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--text-faint);
  font-weight: 600;
  line-height: 1.2;
}
.card-price-label--stacked {
  display: flex;
  flex-direction: column;
  gap: 1px;
  margin-bottom: 0.35rem;
  min-height: 2.35em;
  justify-content: center;
}
.card-price-dates {
  font-family: var(--font-body);
  font-size: 0.66rem;
  color: var(--text-faint);
  letter-spacing: 0.02em;
  margin-top: 0.25rem;
  line-height: 1.2;
}

/* Phase 39 — NEXT MONTH (T-42) always-visible third price layer.
   CARD-STAY-STACK-2026: Upcoming / Following now share .card-stay-row;
   .card-next-month-row is kept as an alias for any leftover markup. */
.card-next-month-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  margin-top: var(--space-2);
  padding-top: var(--space-2);
  border-top: 1px solid var(--border);
}
.card-price-label--next-month {
  display: flex;
  flex-direction: column;
  gap: 1px;
  flex: 0 0 auto;
}
.card-next-month-price {
  display: flex;
  flex-direction: row;
  align-items: baseline;
  justify-content: flex-end;
  gap: 0.5rem;
  text-align: right;
  min-width: 0;
}
.card-next-month-price .card-price-dates {
  margin-top: 0;
}
/* Compact stay-row gold price (Upcoming / Following / Next Month). */
.card-price--next-month {
  font-style: normal;
  font-size: 1.05rem;
  font-weight: 700;
}
/* T-42-POLISH-2026: pending state gets structure — centered, with an       */
/* em-dash placeholder where the live rate will land, so the row never      */
/* reads as an empty strip on the (currently common) un-priced cards.       */
.card-next-month-price--pending {
  flex-direction: row;
  align-items: baseline;
  gap: 0.45rem;
}
.card-next-month-price--pending .card-price-native--pending {
  font-size: 0.66rem;
  letter-spacing: 0.04em;
}
.card-next-month-placeholder {
  font-family: var(--font-display);
  font-size: 1.05rem;
  font-weight: 700;
  color: var(--text-faint);
  opacity: 0.5;
  line-height: 1.05;
}

@media (max-width: 699.98px) {
  .card-stay-row { gap: 6px; }
  .card-price-label--stay {
    max-width: 6.8rem;
    font-size: 0.54rem;
    letter-spacing: 0.1em;
  }
  .card-stay-row:has(.card-stay-warn) .card-price-label--stay {
    max-width: 5rem;
  }
  .card-stay-warn { min-width: 6.8rem; flex-basis: 7.5rem; }
  .card-stay-price { max-width: 48%; }
  .card-stay-row:has(.card-stay-warn) .card-stay-price { max-width: 40%; }
  .card-stay-price .card-price--next-month { font-size: 0.98rem; }
  .card-price-badge { font-size: 0.46rem; letter-spacing: 0.08em; padding: 2px 5px; }
}

.card-meta {
  display: flex; justify-content: space-between;
  font-family: var(--font-body);
  font-size: 0.72rem;
  color: var(--text-faint);
  margin-top: 0;
  padding-top: var(--space-2);
  border-top: 1px dashed var(--border);
}
.card-meta span strong {
  color: var(--text-muted); font-weight: 500;
}

/* Empty state */
.empty-state {
  text-align: center;
  padding: var(--space-10) var(--space-6);
  border: 1px dashed var(--border-strong);
  border-radius: var(--radius-lg);
  background: var(--surface);
}
.empty-title {
  font-family: var(--font-serif);
  font-style: italic;
  font-size: 2rem;
  color: var(--gold);
  margin-bottom: var(--space-3);
}
.empty-sub {
  font-family: var(--font-body);
  color: var(--text-muted);
  max-width: 480px;
  margin: 0 auto var(--space-2);
}
.empty-sub:last-of-type { margin-bottom: var(--space-4); }

/* Clear-All-Filters button (Phase 35) — used by both empty state and
   the results header when any filter is active. */
.clear-all-btn[hidden] { display: none !important; }
.clear-all-btn {
  display: inline-block;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.72rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--gold);
  background: transparent;
  border: 1px solid var(--gold);
  border-radius: var(--radius-md, 6px);
  padding: 10px 18px;
  cursor: pointer;
  transition: background var(--dur-fast, 120ms) var(--ease, ease),
              color var(--dur-fast, 120ms) var(--ease, ease);
}
.clear-all-btn:hover,
.clear-all-btn:focus-visible {
  background: var(--gold);
  color: var(--bg, #0b0e16);
  outline: none;
}

/* Results-header clear button position:
   - Desktop / iPad: pinned to the right of the heading row.
   - Phone: centered below the heading. */
.results-header { position: relative; }
.results-clear-wrap {
  margin-top: var(--space-3);
  text-align: center;
}
@media (min-width: 768px) {
  .results-clear-wrap {
    position: absolute;
    top: 50%;
    right: 0;
    transform: translateY(-50%);
    margin-top: 0;
  }
}

/* ===========================================================
   MODAL
   =========================================================== */
.modal-backdrop {
  position: fixed; inset: 0;
  background: rgba(4, 10, 20, 0.82);
  backdrop-filter: blur(6px);
  z-index: 200;
  display: flex; align-items: center; justify-content: center;
  padding: var(--space-4);
  animation: fadeIn var(--dur-med) var(--ease);
}
.modal-backdrop[hidden] { display: none; }
.dropdown-menu[hidden] { display: none; }
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes slideUp {
  from { opacity: 0; transform: translateY(16px); }
  to   { opacity: 1; transform: translateY(0); }
}

.modal {
  background: var(--bg-elevated);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-lg);
  max-width: 820px;
  width: 100%;
  max-height: 90vh;
  overflow-y: auto;
  position: relative;
  box-shadow: var(--shadow-lg);
  animation: slideUp var(--dur-med) var(--ease);
}
.modal-close {
  position: absolute; top: 16px; right: 16px; z-index: 3;
  width: 36px; height: 36px;
  border-radius: 50%;
  border: 1px solid var(--border-strong);
  background: var(--bg-elevated);
  color: var(--text);
  display: flex; align-items: center; justify-content: center;
  transition: border-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
}
.modal-close:hover { border-color: var(--gold); color: var(--gold); }

.modal-body { padding: 0; }

/* ───────────────────────────────────────────────────────────────────────────
   BRAND-MODAL-2026: the Brand Overview modal-within-a-modal. Layered ABOVE the
   hotel modal (z-index 300 > the hotel modal's 200) so closing it returns the
   user to the hotel they were viewing. Fully theme-token-derived.
   ─────────────────────────────────────────────────────────────────────────── */
.brand-modal-backdrop {
  position: fixed; inset: 0;
  background: rgba(4, 10, 20, 0.72);
  backdrop-filter: blur(8px);
  z-index: 300;
  display: flex; align-items: center; justify-content: center;
  padding: var(--space-4);
  animation: fadeIn var(--dur-med) var(--ease);
}
.brand-modal {
  position: relative;
  background: var(--bg-elevated);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-lg);
  max-width: 680px;
  width: 100%;
  max-height: 88vh;
  overflow: hidden;
  box-shadow: var(--shadow-lg);
  animation: slideUp var(--dur-med) var(--ease);
}
.brand-modal-scroll {
  max-height: 88vh;
  overflow-y: auto;
  padding: 0;
}
/* Inner padding wrapper so the head can carry a full-bleed tinted band while
   the body content stays comfortably inset. */
.brand-modal-body-inner {
  padding: var(--space-5) var(--space-6) var(--space-5);
}
.brand-modal-close {
  position: absolute; top: 14px; right: 14px; z-index: 3;
  width: 34px; height: 34px;
  border-radius: 50%;
  border: 1px solid var(--border-strong);
  background: var(--bg-elevated);
  color: var(--text);
  display: flex; align-items: center; justify-content: center;
  cursor: pointer;
  transition: border-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
}
.brand-modal-close:hover { border-color: var(--gold); color: var(--gold); }

/* Head sits in its own band with a tier-hued top hairline + soft wash so the
   brand reads with a colour identity (the Bazaar idea, re-skinned dark). */
.brand-modal-head {
  position: relative;
  padding: var(--space-6) var(--space-6) var(--space-4);
  padding-right: 56px;
  border-top: 3px solid var(--brand-hue, var(--gold));
  background:
    linear-gradient(180deg,
      color-mix(in srgb, var(--brand-hue, var(--gold)) 10%, transparent),
      transparent 70%);
}
/* --brand-hue paints decorative fills/bars at full chroma; --brand-hue-ink is
   the same hue conditioned for small TEXT so it clears WCAG AA on whatever
   surface the active theme uses. Dark themes keep it bright; light themes
   darken it (the light tier hues, esp. gold, are too pale on cream paper). */
.brand-modal-head, .brand-modal-body-inner { --brand-hue-ink: var(--brand-hue, var(--gold)); }
[data-theme="light"] .brand-modal-head,
[data-theme="light"] .brand-modal-body-inner {
  --brand-hue-ink: color-mix(in srgb, var(--brand-hue, var(--gold)) 62%, #1b1206);
}
.brand-modal-eyebrow {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.72rem;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: var(--brand-hue-ink, var(--gold));
  margin-bottom: 7px;
}
.brand-modal-eyebrow::before {
  content: ""; width: 18px; height: 1px;
  background: var(--brand-hue, var(--gold));
  opacity: 0.8;
}
.brand-modal-name {
  font-family: var(--font-serif);
  font-weight: 500;
  font-size: clamp(1.85rem, 4vw, 2.5rem);
  line-height: 1.08;
  color: var(--text);
  margin: 0;
}
.brand-modal-badges {
  display: flex; flex-wrap: wrap; gap: 7px;
  margin-top: 12px;
}
.brand-modal-badge {
  font-family: var(--font-display);
  font-size: 0.66rem; font-weight: 700;
  letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--text-muted);
  background: color-mix(in srgb, var(--text) 6%, transparent);
  border: 1px solid var(--border);
  border-radius: 999px;
  padding: 4px 11px;
}
.brand-modal-badge--tier {
  color: var(--brand-hue-ink, var(--gold));
  border-color: color-mix(in srgb, var(--brand-hue, var(--gold)) 45%, transparent);
  background: color-mix(in srgb, var(--brand-hue, var(--gold)) 12%, transparent);
}
.brand-modal-lede {
  margin: 13px 0 0;
  font-family: var(--font-serif);
  font-style: italic;
  font-size: 1.04rem;
  line-height: 1.5;
  color: var(--text);
  opacity: 0.92;
  max-width: 60ch;
}

.brand-modal-stats {
  display: flex; flex-wrap: wrap; gap: var(--space-5);
  padding: var(--space-4) 0;
  border-bottom: 1px solid var(--border);
  margin-bottom: var(--space-5);
}
.brand-modal-stat { display: flex; flex-direction: column; gap: 2px; }
.brand-modal-stat__val {
  font-family: var(--font-serif);
  font-size: 1.55rem; font-weight: 500; line-height: 1;
  color: var(--brand-hue-ink, var(--gold));
  font-variant-numeric: tabular-nums;
}
.brand-modal-stat__label {
  font-size: 0.72rem; letter-spacing: 0.04em;
  color: var(--text-muted); text-transform: uppercase;
}

.brand-modal-section { margin-bottom: var(--space-5); }
.brand-modal-section__title {
  font-family: var(--font-display);
  font-size: 0.78rem; font-weight: 700;
  letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--text);
  margin: 0 0 6px;
}
.brand-modal-section__sub {
  font-size: 0.84rem; color: var(--text-muted);
  margin: 0 0 var(--space-3); line-height: 1.4;
}

/* ── Price band (Bazaar-borrowed): floor → median → ceiling on one track ── */
.brand-price { margin-top: 2px; }
.brand-price__track {
  position: relative; display: block;
  height: 10px; border-radius: 999px;
  background: color-mix(in srgb, var(--border-strong) 55%, transparent);
  overflow: visible;
}
.brand-price__fill {
  position: absolute; inset: 0;
  border-radius: 999px;
  background: linear-gradient(90deg,
    color-mix(in srgb, var(--brand-hue, var(--gold)) 45%, transparent),
    var(--brand-hue, var(--gold)));
  transform-origin: left; transform: scaleX(0);
  transition: transform 0.8s cubic-bezier(.22,.61,.36,1);
}
.brand-reveal.in .brand-price__fill,
.brand-modal-section.in .brand-price__fill { transform: scaleX(1); }
.brand-price__med {
  position: absolute; top: -4px; width: 3px; height: 18px;
  border-radius: 2px; background: var(--text);
  transform: translateX(-50%);
  opacity: 0; transition: opacity 0.45s 0.35s ease;
}
.brand-modal-section.in .brand-price__med { opacity: 0.9; }
.brand-price__ends {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 10px; margin-top: 11px;
}
.brand-price__end { display: flex; flex-direction: column; gap: 2px; max-width: 42%; }
.brand-price__end--hi { text-align: right; align-items: flex-end; }
.brand-price__val {
  font-family: var(--font-serif); font-size: 1.15rem; font-weight: 500;
  color: var(--text); font-variant-numeric: tabular-nums; line-height: 1;
}
.brand-price__where {
  font-size: 0.72rem; color: var(--text-muted); line-height: 1.3;
}
.brand-price__mid {
  font-size: 0.72rem; color: var(--text-muted);
  letter-spacing: 0.04em; text-transform: uppercase;
  align-self: center; white-space: nowrap;
}
.brand-price__note {
  margin: 11px 0 0; font-size: 0.76rem;
  color: var(--text-muted); line-height: 1.45;
}

/* ── Top properties: photo cards (Bazaar-borrowed, re-skinned) ── */
.brand-modal-props {
  display: grid; gap: 12px;
  grid-template-columns: repeat(2, 1fr);
}
.brand-prop {
  position: relative; display: flex; flex-direction: column;
  text-align: left; padding: 0;
  background: color-mix(in srgb, var(--text) 4%, transparent);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  overflow: hidden; cursor: pointer;
  transition: transform var(--dur-med) var(--ease),
              box-shadow var(--dur-med) var(--ease),
              border-color var(--dur-fast) var(--ease);
}
.brand-prop:hover, .brand-prop:focus-visible {
  transform: translateY(-3px);
  border-color: color-mix(in srgb, var(--brand-hue, var(--gold)) 55%, var(--border));
  box-shadow: 0 12px 28px rgba(0,0,0,0.35);
  outline: none;
}
.brand-prop__img {
  display: block; width: 100%; aspect-ratio: 16 / 10;
  background-size: cover; background-position: center;
  background-color: color-mix(in srgb, var(--text) 8%, var(--bg-elevated));
}
.brand-prop__img--empty {
  background-image:
    repeating-linear-gradient(135deg,
      color-mix(in srgb, var(--text) 6%, transparent) 0 10px,
      transparent 10px 20px);
}
.brand-prop__rank {
  position: absolute; top: 9px; left: 9px;
  min-width: 22px; height: 22px; padding: 0 6px;
  display: inline-flex; align-items: center; justify-content: center;
  font-family: var(--font-display); font-size: 0.72rem; font-weight: 700;
  color: #fff; background: color-mix(in srgb, var(--brand-hue, var(--gold)) 88%, #000);
  border-radius: 7px; font-variant-numeric: tabular-nums;
  box-shadow: 0 1px 6px rgba(0,0,0,0.4);
}
.brand-prop__body {
  display: flex; flex-direction: column; gap: 3px;
  padding: 11px 13px 13px;
}
.brand-prop__name {
  font-family: var(--font-serif); font-size: 0.98rem; line-height: 1.2;
  color: var(--text);
}
.brand-prop__place { font-size: 0.74rem; color: var(--text-muted); }
.brand-prop__sub {
  font-size: 0.74rem; color: var(--brand-hue-ink, var(--gold));
  font-variant-numeric: tabular-nums; margin-top: 1px;
}

/* ── Heritage timeline (Bazaar-borrowed) ── */
.brand-time { list-style: none; margin: 0; padding: 0; }
.brand-time__row {
  display: grid; grid-template-columns: 56px 1fr;
  gap: 12px; padding: 8px 0;
  border-top: 1px solid var(--border);
}
.brand-time__row:first-child { border-top: 0; }
.brand-time__yr {
  font-family: var(--font-display); font-weight: 700; font-size: 0.86rem;
  color: var(--brand-hue-ink, var(--gold)); font-variant-numeric: tabular-nums;
}
.brand-time__ev { font-size: 0.86rem; color: var(--text); line-height: 1.45; }

/* ── LHA Tier distribution bars ── */
.brand-modal-tiers { display: flex; flex-direction: column; gap: 6px; }
.brand-modal-tier {
  display: grid; grid-template-columns: 50px 1fr 26px;
  align-items: center; gap: 10px;
}
.brand-modal-tier__label {
  font-size: 0.74rem; letter-spacing: 0.02em;
  color: var(--text-muted);
}
.brand-modal-tier__track {
  height: 8px; border-radius: 999px;
  background: color-mix(in srgb, var(--border-strong) 55%, transparent);
  overflow: hidden;
}
.brand-modal-tier__fill {
  display: block; height: 100%;
  background: linear-gradient(90deg,
    color-mix(in srgb, var(--brand-hue, var(--gold)) 45%, transparent),
    var(--brand-hue, var(--gold)));
  border-radius: 999px;
  transform-origin: left; transform: scaleX(0);
  transition: transform 0.7s cubic-bezier(.22,.61,.36,1);
}
.brand-modal-section.in .brand-modal-tier__fill { transform: scaleX(1); }
.brand-modal-tier__count {
  font-size: 0.78rem; text-align: right;
  color: var(--text); font-variant-numeric: tabular-nums;
}
.brand-modal-tier.is-dom .brand-modal-tier__label { color: var(--text); font-weight: 600; }
.brand-modal-tier.is-empty .brand-modal-tier__label,
.brand-modal-tier.is-empty .brand-modal-tier__count { opacity: 0.4; }

/* Property lists (top / newest / closed) */
.brand-modal-list {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column;
}
.brand-modal-list ol, .brand-modal-list ul { counter-reset: none; }
ol.brand-modal-list { counter-reset: bmrow; }
.brand-modal-row { border-top: 1px solid var(--border); }
.brand-modal-row:first-child { border-top: 0; }
.brand-modal-row__open {
  display: flex; flex-direction: column; gap: 2px;
  width: 100%; text-align: left;
  background: none; border: 0;
  padding: 10px 4px;
  cursor: pointer;
  transition: background var(--dur-fast) var(--ease);
  border-radius: var(--radius-sm);
}
.brand-modal-row__open:hover,
.brand-modal-row__open:focus-visible {
  background: color-mix(in srgb, var(--gold) 8%, transparent);
  outline: none;
}
ol.brand-modal-list .brand-modal-row { counter-increment: bmrow; }
ol.brand-modal-list .brand-modal-row__name::before {
  content: counter(bmrow) ". ";
  color: var(--gold);
  font-variant-numeric: tabular-nums;
}
.brand-modal-row__name {
  font-family: var(--font-serif);
  font-size: 1.02rem; color: var(--text); line-height: 1.25;
}
.brand-modal-row__meta {
  font-size: 0.78rem; color: var(--text-muted);
  letter-spacing: 0.01em;
}
.brand-modal-row__tag {
  font-family: var(--font-display);
  font-size: 0.62rem; font-weight: 700;
  letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--status-reno, var(--gold));
  border: 1px solid currentColor;
  border-radius: 4px; padding: 1px 5px;
  vertical-align: middle; margin-left: 6px;
}
.brand-modal-row.is-closed .brand-modal-row__name { color: var(--text-muted); }

.brand-modal-foot {
  font-size: 0.74rem; color: var(--text-muted);
  line-height: 1.5; margin: var(--space-4) 0 0;
  padding-top: var(--space-4);
  border-top: 1px solid var(--border);
}

/* ── Dossier section (DOSSIER-RENDER-2026): authored bio prose shown in the
   craft + chef modals, styled to read as an editorial write-up. ── */
.dossier-section { margin-bottom: var(--space-5); }
.dossier-section--awards {
  margin-bottom: var(--space-4);
  padding-bottom: var(--space-3);
  border-bottom: 1px solid var(--border);
}
.dossier-section--awards .brand-modal-section__title {
  color: var(--brand-hue, var(--craft-hue, var(--gold)));
}
.dossier-block { margin: 0 0 var(--space-4); }
.dossier-block:last-of-type { margin-bottom: var(--space-3); }
.dossier-block__title {
  font-family: var(--font-display);
  font-size: 0.72rem; font-weight: 700;
  letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--brand-hue, var(--craft-hue, var(--chef-hue, var(--gold))));
  margin: 0 0 6px;
}
.dossier-para {
  font-size: 0.9rem; line-height: 1.62;
  color: var(--text); margin: 0 0 var(--space-3);
}
.dossier-para:last-child { margin-bottom: 0; }
.dossier-sources {
  font-size: 0.72rem; line-height: 1.55; color: var(--text-muted);
  margin-top: var(--space-3); padding-top: var(--space-3);
  border-top: 1px dashed var(--border);
}
.dossier-sources__label {
  font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--text-muted); margin-right: 6px;
}
.dossier-sources a { color: var(--text-muted); text-decoration: underline; text-underline-offset: 2px; }
.dossier-sources a:hover { color: var(--brand-hue, var(--gold)); }

/* Staggered reveal-in motion (Bazaar-borrowed). JS adds .brand-reveal to each
   section/head/property card on render, then toggles .in shortly after so the
   overlay assembles itself with a gentle rise + fade. The scaleX price/tier
   fills key off the same .in landing on .brand-modal-section. */
.brand-reveal { opacity: 0; transform: translateY(12px); }
.brand-reveal.in {
  opacity: 1; transform: none;
  transition: opacity 0.5s var(--ease),
              transform 0.5s cubic-bezier(.22,.61,.36,1);
}
@media (prefers-reduced-motion: reduce) {
  .brand-reveal,
  .brand-reveal.in { opacity: 1; transform: none; transition: none; }
  .brand-price__fill,
  .brand-modal-tier__fill { transition: none; }
}

@media (max-width: 560px) {
  .brand-modal-body-inner { padding: var(--space-5) var(--space-4) var(--space-4); }
  .brand-modal-head { padding: var(--space-5) var(--space-4) var(--space-4); padding-right: 52px; }
  .brand-modal-stats { gap: var(--space-3); }
  .brand-modal-props { grid-template-columns: 1fr; }
}

/* ───────────────────────────────────────────────────────────────────────────
   PLACE-MODAL-2026: city/country profile overlay (mirrors brand modal stack).
   ─────────────────────────────────────────────────────────────────────────── */
.place-modal-backdrop {
  position: fixed; inset: 0;
  background: rgba(4, 10, 20, 0.72);
  backdrop-filter: blur(8px);
  z-index: 300;
  display: flex; align-items: center; justify-content: center;
  padding: var(--space-4);
  animation: fadeIn var(--dur-med) var(--ease);
}
.place-modal {
  border-top: 3px solid var(--place-hue, #4a9fd4);
}
.place-modal-eyebrow::before {
  content: "\1F4CD";
  width: auto; height: auto; background: none; opacity: 1;
  font-size: 0.85em; line-height: 1;
}
.place-modal-sub {
  display: block;
  font-size: 0.88rem;
  color: var(--text-muted);
  margin-top: 6px;
}
.place-modal-scene {
  font-family: var(--font-serif);
  font-size: 0.96rem;
  line-height: 1.55;
  color: var(--text);
  max-height: 220px;
  overflow-y: auto;
  white-space: pre-wrap;
}
.place-modal-scene--stub {
  color: var(--text-muted);
  font-style: italic;
  max-height: none;
}
.place-modal-brands {
  display: flex; flex-wrap: wrap; gap: 7px;
}
.place-modal-brand-chip {
  font-family: var(--font-display);
  font-size: 0.66rem; font-weight: 700;
  letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--text-muted);
  background: color-mix(in srgb, var(--place-hue, #4a9fd4) 10%, transparent);
  border: 1px solid color-mix(in srgb, var(--place-hue, #4a9fd4) 35%, transparent);
  border-radius: 999px;
  padding: 4px 11px;
}
.place-modal-brand-chip__n {
  color: var(--place-hue, #4a9fd4);
  font-variant-numeric: tabular-nums;
}
.place-modal-list {
  max-height: 280px;
  overflow-y: auto;
}
.modal-place-link {
  font: inherit;
  letter-spacing: inherit;
  color: inherit;
  background: none;
  border: 0;
  padding: 0;
  margin: 0;
  cursor: pointer;
  display: inline;
  border-bottom: 1px solid color-mix(in srgb, var(--place-hue, #4a9fd4) 45%, transparent);
  transition: color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
}
.modal-place-link:hover,
.modal-place-link:focus-visible {
  color: var(--place-hue, #4a9fd4);
  border-bottom-color: var(--place-hue, #4a9fd4);
}
.modal-place-link:focus-visible {
  outline: 2px solid var(--place-hue, #4a9fd4);
  outline-offset: 3px;
  border-radius: 2px;
}

@media (max-width: 560px) {
  .place-modal-list { max-height: 220px; }
}

.modal-hero {
  aspect-ratio: 4 / 3;
  background: #0a0a0a;
  position: relative;
  border-bottom: 1px solid var(--border);
  overflow: hidden;
}

/* Pixelated 16-bit hotel portrait fills the whole hero frame. The source
   PNG is 640x480 indexed; browsers will upscale it, so we force NEAREST
   neighbor sampling to preserve the Sega Genesis / Super Nintendo feel. */
.modal-hero-img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  image-rendering: pixelated;
  image-rendering: -moz-crisp-edges;
  image-rendering: crisp-edges;
  -ms-interpolation-mode: nearest-neighbor;
}

/* Placeholder variant: used for Coming Soon pipeline hotels that don't have
   a photo yet, and as a fallback if the image file fails to load. */
.modal-hero--placeholder {
  aspect-ratio: 16 / 7;
  background: var(--placeholder-bg);
}
.modal-hero--placeholder::after {
  content: "";
  position: absolute;
  inset: 12px;
  border: 1px solid var(--placeholder-border);
  border-radius: 2px;
}

/* -------------------------------------------------------------------------
   Phase 16 — Photo gallery (Hotels.com-style)

   When a hotel has 2+ curated photos, the modal replaces the single
   pixelated hero with a hero-on-the-left + 2x2 thumbnail grid on the
   right. Thumbnails are interactive: click to promote to hero with a soft
   crossfade. Photos are real (AVIF, ~60KB hero / ~10KB thumb) and crediting
   is editorial via figcaption.

   The mid-century gold palette carries through — active/hover thumbnails
   get a gold border; empty slots get a dashed muted outline so hotels with
   only 2–3 photos still read as a complete grid.
   ------------------------------------------------------------------------- */
.modal-gallery {
  display: flex;
  gap: 4px;
  margin: 0;
  padding: 0;
  background: #0a0a0a;
  border-bottom: 1px solid var(--border);
  /* Match the legacy hero aspect so the modal doesn't jump when galleries
     load in after the initial render. */
  aspect-ratio: 16 / 9;
  overflow: hidden;
}

.modal-gallery-hero {
  position: relative;
  /* Phase 27: hero takes 70% width (was 60%); right column shrinks to 30%
     and holds 2 stacked thumbs (was a 2x2 grid of 4 thumbs). */
  flex: 0 0 70%;
  height: 100%;
  overflow: hidden;
}
/* Solo variant: exactly one real photo, no grid. Hero fills the frame. */
.modal-gallery--solo .modal-gallery-hero { flex: 1 1 100%; }

/* Phase 19.8 focus mode: arrow nav expands the hero to fill the full gallery
   width and shows the photo in its original aspect ratio (letterboxed with
   black bars where needed). The thumbnail grid collapses; the gallery
   container keeps its 16/9 aspect-ratio so the modal doesn't reflow. */
.modal-gallery--focus .modal-gallery-hero { flex: 1 1 100%; }
.modal-gallery--focus .modal-gallery-grid { display: none; }
.modal-gallery--focus .modal-gallery-hero-img {
  /* Preserve original aspect ratio; black bars (negative space) fill gaps. */
  object-fit: contain;
  background: #000;
}

.modal-gallery-hero-img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  transition: opacity 160ms ease-out;
  /* Real photography — no pixelated rendering. */
  image-rendering: auto;
}
.modal-gallery-hero-img.is-swapping { opacity: 0.15; }
.modal-gallery-hero.is-photo-error .modal-gallery-hero-img { opacity: 0; }
.modal-gallery-hero.is-photo-error::after {
  content: "Photo unavailable";
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  color: rgba(243, 236, 216, 0.72);
  font: 500 0.76rem/1 var(--font-sans);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  pointer-events: none;
}

.modal-hero-credit {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  margin: 0;
  padding: 18px 16px 10px;
  font-family: var(--font-sans);
  font-size: 0.72rem;
  letter-spacing: 0.04em;
  font-style: italic;
  color: #f3ecd8;
  background: linear-gradient(180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,0.55) 100%);
  pointer-events: none;
}

.modal-gallery-grid {
  /* Phase 27: single column, two rows. The hero is 70% and this column is
     30% — enough room for two stacked thumbnails. */
  flex: 1 1 30%;
  display: grid;
  grid-template-columns: 1fr;
  grid-template-rows: 1fr 1fr;
  gap: 4px;
}

.modal-gallery-thumb {
  /* Reset button chrome — this is a clickable tile. */
  appearance: none;
  border: 0;
  margin: 0;
  padding: 0;
  background: #0a0a0a;
  cursor: pointer;
  overflow: hidden;
  position: relative;
  outline: 2px solid transparent;
  outline-offset: -2px;
  transition: outline-color 140ms ease-out;
}
.modal-gallery-thumb img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  transition: transform 220ms ease-out;
}
.modal-gallery-thumb:hover img,
.modal-gallery-thumb:focus-visible img { transform: scale(1.03); }
.modal-gallery-thumb:hover,
.modal-gallery-thumb:focus-visible { outline-color: var(--gold-bright); }
.modal-gallery-thumb--active { outline-color: var(--gold); }
.modal-gallery-thumb--active::after {
  /* Subtle gold ring confirms which photo is currently promoted to hero. */
  content: "";
  position: absolute;
  inset: 0;
  box-shadow: inset 0 0 0 1px rgba(0,0,0,0.25);
  pointer-events: none;
}
.modal-gallery-thumb.is-photo-error img { opacity: 0; }
.modal-gallery-thumb.is-photo-error::before {
  content: "Unavailable";
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  color: rgba(243, 236, 216, 0.58);
  font: 500 0.62rem/1 var(--font-sans);
  letter-spacing: 0.05em;
  text-transform: uppercase;
}

/* Phase 27c: extra thumbnail used ONLY on phone (≤560px) to round out the
   "1 over 3" layout. On desktop the gallery is hero + 2 stacked thumbs in a
   single 30% column — a 3rd thumb would either crowd the column or require
   shrinking the hero, so we hide it. The mobile media query below resets
   .modal-gallery-grid to a horizontal scroll strip and overrides this to
   `display: block` (flex children) so all 3 thumbs become visible. */
.modal-gallery-thumb--extra { display: none; }

/* Empty-slot variant: rendered when a hotel has fewer than 4 thumbnail
   photos. Keeps the 2x2 grid shape intact and hints that more photos are
   coming without ever showing a broken image icon.

   The gallery chrome is always dark regardless of site theme (the modal
   backdrop itself is a dark spotlight), so hard-code a dark empty tile so
   light-mode doesn't produce a jarring white square. */
.modal-gallery-thumb--empty {
  cursor: default;
  background: #141414;
}
.modal-gallery-thumb--empty::before {
  content: "";
  position: absolute;
  inset: 10px;
  border: 1px dashed rgba(198, 167, 102, 0.28); /* faint gold — "more coming" */
  border-radius: 2px;
}

/* ---------------------------------------------------------------------------
   Phase 19.7 — modal gallery arrow nav + lightbox
   --------------------------------------------------------------------------- */

/* The hero is now a button (so click opens lightbox). Reset button chrome
   without disturbing the hero image layout. */
.modal-gallery-hero-btn {
  appearance: none;
  border: 0;
  margin: 0;
  padding: 0;
  background: transparent;
  display: block;
  width: 100%;
  height: 100%;
  cursor: zoom-in;
}

/* Left / right arrow nav buttons floating over the hero. Subtle by default,
   pop on hover. Keyboard-focusable via the standard outline ring. */
.modal-gallery-nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 2;
  width: 44px;
  height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: rgba(15, 15, 15, 0.55);
  color: #f3ecd8;
  border: 1px solid rgba(255, 255, 255, 0.16);
  border-radius: 50%;
  cursor: pointer;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  transition: background 160ms ease-out, transform 160ms ease-out, opacity 160ms ease-out;
  opacity: 0.78;
}
.modal-gallery-nav:hover,
.modal-gallery-nav:focus-visible {
  background: rgba(0, 0, 0, 0.78);
  opacity: 1;
  transform: translateY(-50%) scale(1.06);
  outline: 2px solid var(--gold-bright, #d6b977);
  outline-offset: 2px;
}
.modal-gallery-nav svg { width: 22px; height: 22px; display: block; }
.modal-gallery-nav--prev { left: 12px; }
.modal-gallery-nav--next { right: 12px; }

/* Focus mode: arrows sit slightly closer to the edges of the now-wider hero. */
.modal-gallery--focus .modal-gallery-nav--prev { left: 18px; }
.modal-gallery--focus .modal-gallery-nav--next { right: 18px; }

/* Back-to-grid pill — only visible in focus mode. Top-left of the hero. */
.modal-gallery-focus-exit {
  position: absolute;
  top: 14px;
  left: 14px;
  z-index: 4;
  display: none; /* shown via .modal-gallery--focus below */
  align-items: center;
  gap: 6px;
  padding: 6px 12px 6px 9px;
  border: 0;
  border-radius: 999px;
  background: rgba(0, 0, 0, 0.55);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  color: #f3ecd8;
  font-family: var(--font-sans);
  font-size: 0.72rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background-color 140ms ease-out, transform 140ms ease-out;
}
.modal-gallery-focus-exit svg { width: 14px; height: 14px; display: block; }
.modal-gallery-focus-exit:hover,
.modal-gallery-focus-exit:focus-visible {
  background: rgba(0, 0, 0, 0.75);
  outline: 1px solid var(--gold-bright);
}
.modal-gallery--focus .modal-gallery-focus-exit { display: inline-flex; }

/* Photo counter pill at the bottom-right of the hero. */
.modal-gallery-counter {
  position: absolute;
  right: 10px;
  bottom: 10px;
  z-index: 2;
  font-family: var(--font-sans);
  font-size: 0.72rem;
  letter-spacing: 0.06em;
  font-variant-numeric: tabular-nums;
  color: #f3ecd8;
  background: rgba(0, 0, 0, 0.55);
  border: 1px solid rgba(255, 255, 255, 0.14);
  padding: 3px 8px;
  border-radius: 999px;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  pointer-events: none;
}
.modal-gallery-counter-sep { opacity: 0.5; margin: 0 2px; }

/* Lightbox: full-screen photo viewer layered above the modal. */
.atlas-lightbox {
  position: fixed;
  inset: 0;
  z-index: 1000;
  background: rgba(8, 8, 8, 0.96);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: max(env(safe-area-inset-top, 0px), 24px) 24px max(env(safe-area-inset-bottom, 0px), 24px);
}
/* Full-screen modes lift the hotel modal above their own z-index:1400 shells.
   Keep the photo viewer above that lifted modal instead of leaving an inert
   hotel modal visibly covering the viewer. */
#modalBackdrop[data-maison-lifted] ~ .atlas-lightbox,
#modalBackdrop[data-bz-lifted] ~ .atlas-lightbox { z-index: 1600; }
.atlas-lightbox[hidden] { display: none; }
body.atlas-lightbox-open { overflow: hidden; }

.atlas-lightbox-figure {
  margin: 0;
  max-width: min(1600px, 96vw);
  max-height: 88vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 12px;
}
.atlas-lightbox-img {
  display: block;
  max-width: 100%;
  max-height: 82vh;
  width: auto;
  height: auto;
  object-fit: contain;
  border-radius: 4px;
  box-shadow: 0 24px 70px rgba(0, 0, 0, 0.55);
}
.atlas-lightbox-img.is-photo-error { visibility: hidden; }
.atlas-lightbox-status {
  color: #e6dec4;
  font: 500 0.82rem/1.3 var(--font-sans);
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.atlas-lightbox-credit {
  font-family: var(--font-sans);
  font-size: 0.78rem;
  letter-spacing: 0.04em;
  font-style: italic;
  color: #e6dec4;
  text-align: center;
  max-width: min(800px, 92vw);
}
.atlas-lightbox-close {
  position: absolute;
  top: 16px;
  right: 16px;
  z-index: 2;
  width: 44px;
  height: 44px;
  background: rgba(255, 255, 255, 0.08);
  color: #f3ecd8;
  border: 1px solid rgba(255, 255, 255, 0.18);
  border-radius: 50%;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: background 140ms ease-out, transform 140ms ease-out;
}
.atlas-lightbox-close:hover,
.atlas-lightbox-close:focus-visible {
  background: rgba(255, 255, 255, 0.16);
  outline: 2px solid var(--gold-bright, #d6b977);
  outline-offset: 2px;
  transform: scale(1.06);
}
.atlas-lightbox-close svg { width: 22px; height: 22px; }

.atlas-lightbox-nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 2;
  width: 52px;
  height: 52px;
  background: rgba(255, 255, 255, 0.08);
  color: #f3ecd8;
  border: 1px solid rgba(255, 255, 255, 0.18);
  border-radius: 50%;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: background 140ms ease-out, transform 140ms ease-out;
}
.atlas-lightbox-nav:hover,
.atlas-lightbox-nav:focus-visible {
  background: rgba(255, 255, 255, 0.16);
  outline: 2px solid var(--gold-bright, #d6b977);
  outline-offset: 2px;
  transform: translateY(-50%) scale(1.06);
}
.atlas-lightbox-nav svg { width: 26px; height: 26px; }
.atlas-lightbox-nav--prev { left: 24px; }
.atlas-lightbox-nav--next { right: 24px; }

.atlas-lightbox-counter {
  position: absolute;
  bottom: 18px;
  left: 50%;
  transform: translateX(-50%);
  font-family: var(--font-sans);
  font-size: 0.78rem;
  letter-spacing: 0.08em;
  font-variant-numeric: tabular-nums;
  color: #e6dec4;
  background: rgba(0, 0, 0, 0.55);
  border: 1px solid rgba(255, 255, 255, 0.14);
  padding: 4px 12px;
  border-radius: 999px;
}
.atlas-lightbox-counter-sep { opacity: 0.5; margin: 0 4px; }

@media (max-width: 560px) {
  .modal-gallery-nav { width: 38px; height: 38px; }
  .modal-gallery-nav--prev { left: 8px; }
  .modal-gallery-nav--next { right: 8px; }
  .atlas-lightbox-nav { width: 44px; height: 44px; }
  .atlas-lightbox-nav--prev { left: 8px; }
  .atlas-lightbox-nav--next { right: 8px; }
  .atlas-lightbox { padding: 12px; }
}

/* Mobile: collapse to hero-on-top with a horizontal scroll strip beneath.
   Keeps one-hand scrollable, matches the Hotels.com mobile pattern, and
   respects the portrait aspect cap so we never get a tiny cramped grid. */
@media (max-width: 560px) {
  .modal-gallery {
    flex-direction: column;
    aspect-ratio: auto;
    gap: 6px;
  }
  .modal-gallery-hero {
    flex: 0 0 auto;
    aspect-ratio: 4 / 3;
    width: 100%;
  }
  .modal-gallery-grid {
    display: flex;
    flex: 0 0 auto;
    height: 84px;
    overflow-x: auto;
    overflow-y: hidden;
    gap: 6px;
    padding: 0 2px 2px;
    scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
  }
  .modal-gallery-thumb {
    flex: 0 0 120px;
    height: 100%;
    scroll-snap-align: start;
  }
  /* Phase 27c: reveal the 3rd thumb on phone so the strip reads 1 hero +
     3 thumbs (was 1 + 2 after Phase 27b dropped the 4th tile). */
  .modal-gallery-thumb--extra { display: block; }

  /* Mobile portrait: keep the thumbnail strip visible and the hero in
     'cover' mode even when the user taps the prev/next arrows. The desktop
     focus-mode (letterboxed contain + collapsed grid) was needed only to
     reclaim horizontal space in the 60/40 layout — on a portrait phone the
     hero already spans the full screen width. */
  .modal-gallery--focus .modal-gallery-grid { display: flex; }
  .modal-gallery--focus .modal-gallery-hero-img {
    object-fit: cover;
    background: transparent;
  }
  .modal-gallery--focus .modal-gallery-focus-exit { display: none; }
}

.modal-content { padding: var(--space-8) var(--space-8); }

.modal-brand {
  /* Phase 41: now also carries award chips + the hotel-class badge inline,
     mirroring the card. Allow wrapping so a hotel with Forbes + MICHELIN +
     AAA + a star badge never overflows the modal on narrow viewports. */
  display: flex; flex-wrap: wrap; align-items: center;
  column-gap: 8px; row-gap: 6px;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.92rem;
  letter-spacing: 0.26em;
  color: var(--gold);
  text-transform: uppercase;
  margin-bottom: var(--space-3);
}

/* The clickable brand trigger is a <button>, which otherwise resets to the
   UA default font/letter-spacing and ends up smaller than the surrounding
   eyebrow. Force it to inherit the .modal-brand typography so the brand name
   reads at the same (slightly enlarged) size, and add the affordance. */
.modal-brand-link {
  font: inherit;
  letter-spacing: inherit;
  text-transform: inherit;
  color: inherit;
  background: none;
  border: 0;
  padding: 0;
  margin: 0;
  cursor: pointer;
  display: inline;
  border-bottom: 1px solid color-mix(in srgb, var(--gold) 45%, transparent);
  transition: color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
}
.modal-brand-link:hover,
.modal-brand-link:focus-visible {
  color: var(--gold-bright, var(--gold));
  border-bottom-color: var(--gold);
}
.modal-brand-link:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 3px;
  border-radius: 2px;
}
.modal-brand::before { content: "—"; flex: none; }

/* Brand lineage cue ("Formerly Waldorf Astoria → …"). Rendered just under the
   gold brand eyebrow for properties whose brand_status is "rebranded". Quieter
   than the eyebrow: muted weight + normal case so it reads as secondary
   history, not a second brand. Driven by the derived previous_brand_labels. */
.modal-brand-lineage {
  display: block;
  font-family: var(--font-body, inherit);
  font-size: 0.78rem;
  font-weight: 500;
  letter-spacing: 0.01em;
  text-transform: none;
  color: var(--ink-muted, #8a8a8a);
  margin: calc(-1 * var(--space-2)) 0 var(--space-3);
  line-height: 1.4;
}
.modal-brand-lineage__label {
  text-transform: uppercase;
  letter-spacing: 0.14em;
  font-size: 0.66rem;
  font-weight: 700;
  color: color-mix(in srgb, var(--gold) 70%, var(--ink-muted, #8a8a8a));
  margin-right: 4px;
}
.modal-brand-lineage__since {
  margin-left: 6px;
  font-variant-numeric: tabular-nums;
  opacity: 0.85;
}

/* Phase 41: numeric hotel-class star badge (modal header). Sits next to the
   brand name + award chips. Gold stars + a small "5-star" caption. Kept
   visually lighter than award chips so the awards still lead the eye. */
.hotel-class-badge {
  display: inline-flex; align-items: center; gap: 5px;
  flex: none;
  padding: 3px 8px;
  border-radius: 999px;
  border: 1px solid var(--border);
  background: color-mix(in srgb, var(--gold) 8%, transparent);
  letter-spacing: 0.04em;
  text-transform: none;
  line-height: 1;
}
.hotel-class-badge__stars {
  color: var(--gold);
  font-size: 0.62rem;
  letter-spacing: 1px;
}
.hotel-class-badge__num {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 0.6rem;
  letter-spacing: 0.08em;
  color: var(--text-muted);
  text-transform: uppercase;
}

.modal-title {
  font-family: var(--font-serif);
  font-weight: 500;
  /* CARD-NAME-SIZE-BUMP-2026 — owner asked for the modal hotel name to be
     slightly bigger too (clamp min/ideal/max 1.95/4.4vw/2.75 -> 2.1/4.7vw/2.95). */
  font-size: clamp(2.1rem, 4.7vw, 2.95rem);
  line-height: 1.15;
  color: var(--text);
  margin: 0 0 var(--space-3);
}

/* Title + prominent View & Book CTA on the same row */
.modal-title-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--space-5);
  margin-bottom: var(--space-3);
  flex-wrap: wrap;
}
.modal-title-row .modal-title { margin: 0; flex: 1 1 auto; min-width: 0; }
.modal-book--header {
  flex: 0 0 auto;
  margin: 0;
  padding: 12px 22px;
  font-size: 0.82rem;
  letter-spacing: 0.18em;
  white-space: nowrap;
  box-shadow: 0 8px 24px rgba(198, 156, 82, 0.28);
}
.modal-book--header svg { flex: 0 0 auto; }
.modal-book--disabled {
  opacity: 0.45;
  pointer-events: none;
}
@media (max-width: 640px) {
  .modal-title-row { gap: var(--space-3); }
  .modal-book--header {
    padding: 10px 18px;
    font-size: 0.72rem;
    letter-spacing: 0.16em;
  }
}

.modal-meta-row {
  display: flex; flex-wrap: wrap; gap: var(--space-5);
  font-family: var(--font-body);
  font-size: 0.875rem;
  color: var(--text-muted);
  padding-bottom: var(--space-5);
  border-bottom: 1px solid var(--border);
  margin-bottom: var(--space-6);
}

/* Phase 19.5: when a pitch sentence follows the meta row, we strip the
   border + bottom spacing off the meta row and re-attach them to the
   pitch paragraph so the divider lives BELOW the pitch (per spec). The
   pitch itself is roman serif, slightly larger than the card variant
   for more breathing room in the modal. */
.modal-meta-row--no-border {
  border-bottom: 0;
  padding-bottom: var(--space-3);
  margin-bottom: 0;
}
.modal-pitch {
  font-family: var(--font-serif);
  font-style: normal;
  font-size: 1.15rem;
  line-height: 1.55;
  color: var(--text);
  margin: 0 0 var(--space-6) 0;
  padding-bottom: var(--space-5);
  border-bottom: 1px solid var(--border);
}
/* Pitch + Quick Brief read as one editorial block at the modal top. */
.modal-pitch--with-facts {
  border-bottom: 0;
  padding-bottom: var(--space-3);
  margin-bottom: 0;
}
.modal-pitch + .modal-bullets {
  margin-top: 0;
  padding-bottom: var(--space-5);
  border-bottom: 1px solid var(--border);
}
.modal-meta-row + .modal-bullets {
  margin-top: 0;
}
.modal-meta-row strong {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.68rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--text-faint);
  display: block;
  margin-bottom: 4px;
}
/* Neighborhood name shown right before the city in the modal Location cell.
   Slightly emphasized (accent color + weight) so the neighborhood reads as the
   most specific, guest-useful locator. Renders only when a hotel has one. */
.modal-neighborhood {
  font-weight: 600;
  color: var(--text);
}

.modal-section { margin-bottom: var(--space-6); }
.modal-section-label {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.7rem;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: var(--space-3);
  display: inline-flex; align-items: center; gap: 10px;
}
.modal-section-label::before {
  content: ""; width: 24px; height: 1px; background: var(--gold); display: inline-block;
}

.modal-heritage {
  font-family: var(--font-serif);
  font-size: 1.0625rem;
  line-height: 1.65;
  color: var(--text);
  font-weight: 400;
}
.modal-heritage + .modal-heritage { margin-top: var(--space-3); }

/* "Show all" toggle for long History narratives. The hidden remainder lives
   inside a nested <details>; the summary flips its label via [open]. Antique
   gold accent only — never bright video-game gold. */
.history-showall { margin-top: var(--space-3); }
.history-showall > summary {
  list-style: none;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-sans, inherit);
  font-size: 0.8125rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--gold);
  border-bottom: 1px solid color-mix(in srgb, var(--gold) 45%, transparent);
  padding-bottom: 2px;
  width: fit-content;
  transition: color 0.2s ease, border-color 0.2s ease;
}
.history-showall > summary::-webkit-details-marker { display: none; }
.history-showall > summary::after {
  content: "\203a";
  display: inline-block;
  transform: rotate(90deg);
  transition: transform 0.2s ease;
  font-size: 1rem;
  line-height: 1;
}
.history-showall[open] > summary::after { transform: rotate(-90deg); }
.history-showall > summary:hover {
  color: color-mix(in srgb, var(--gold) 80%, #fff 20%);
  border-color: var(--gold);
}
.history-showall .history-showall-less { display: none; }
.history-showall[open] .history-showall-more { display: none; }
.history-showall[open] .history-showall-less { display: inline; }
.history-showall-rest { margin-top: var(--space-3); }
.history-showall-rest > .modal-heritage:first-child { margin-top: 0; }

/* Modal layout compression — subsections, flag lede, nested AQS */
.modal-subsection + .modal-subsection {
  margin-top: var(--space-5);
  padding-top: var(--space-5);
  border-top: 1px solid var(--border);
}
.modal-subsection-label {
  font-family: var(--font-body);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin: 0 0 var(--space-3);
}
.modal-subsection-body > :first-child { margin-top: 0; }

/* Guest echo nested under Guest Sentiment (GUEST-ECHO-SENT-2026) */
.sent-guest-echo {
  margin-top: var(--space-5);
  padding-top: var(--space-5);
  border-top: 1px solid var(--border);
}
.sent-echo-label {
  font-family: var(--font-body);
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin: 0 0 var(--space-3);
}
.sent-guest-echo .uw-sample {
  font-size: 0.82rem;
  color: var(--text);
  line-height: 1.45;
}

.modal-flag-stack {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}
.modal-flag-text.modal-flag-text--clamp {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 5;
  overflow: hidden;
}
.modal-flag-showmore {
  align-self: flex-start;
  margin: 0;
  padding: 0;
  border: none;
  background: none;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--gold);
  cursor: pointer;
}
.modal-flag-showmore:hover { text-decoration: underline; }
.modal-flag-showmore[hidden] { display: none; }

.modal-flag-detail-lede {
  font-size: 0.875rem;
  line-height: 1.55;
  color: var(--text);
}
.modal-flag-detail-rest {
  margin-top: var(--space-3);
  font-size: 0.875rem;
  line-height: 1.55;
}
.modal-flags-more { margin-top: var(--space-2); }
.modal-flags-more-list { margin-top: var(--space-2); }

.modal-flag-sentiment-link {
  margin: 6px 0 0;
  font-size: 0.8125rem;
}
.modal-internal-anchor {
  color: var(--gold);
  text-decoration: none;
  border-bottom: 1px solid color-mix(in srgb, var(--gold) 45%, transparent);
}
.modal-internal-anchor:hover {
  color: color-mix(in srgb, var(--gold) 80%, #fff 20%);
  border-bottom-color: var(--gold);
}

.modal-aqs-nested {
  margin-top: var(--space-4);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: color-mix(in srgb, var(--gold) 6%, var(--bg-elevated));
}
.modal-aqs-nested > summary {
  list-style: none;
  cursor: pointer;
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 8px 12px;
  padding: 10px 12px;
  font-family: var(--font-body);
}
.modal-aqs-nested > summary::-webkit-details-marker { display: none; }
.modal-aqs-nested-label {
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--text);
}
.modal-aqs-nested-meta {
  font-size: 0.8125rem;
  color: var(--text-muted);
  flex: 1;
}
.modal-aqs-nested-body {
  padding: 0 12px 12px;
  border-top: 1px solid var(--border);
}
.modal-aqs-nested-body .aqs-hero { margin-top: var(--space-3); }

/* Quick Brief — bullet_points under the pitch. */
.modal-bullet-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
}
.modal-bullet-list li {
  position: relative;
  padding-left: var(--space-5);
  font-family: var(--font-serif);
  font-size: 1.0625rem;
  line-height: 1.62;
  color: var(--text);
}
.modal-bullet-list li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.62em;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--gold);
}
.modal-bullet-list .modal-bullet-head {
  font-weight: 700;
  font-size: 1.0625em;
}

.modal-restaurants { display: flex; flex-direction: column; gap: var(--space-3); }
.modal-restaurant {
  padding: var(--space-3) var(--space-4);
  border-left: 2px solid var(--gold);
  background: var(--surface);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
}
.modal-restaurant-name {
  font-family: var(--font-serif);
  font-style: italic;
  font-weight: 500;
  font-size: 1.0625rem;
  color: var(--text);
  margin-bottom: 4px;
  line-height: 1.3;
}
.modal-restaurant-name:has(+ .modal-restaurant-dek) {
  margin-bottom: 0;
}
.modal-restaurant-dek {
  font-family: var(--font-body);
  font-size: 0.875rem;
  font-style: italic;
  font-weight: 400;
  line-height: 1.45;
  color: var(--text-muted);
  margin: 6px 0 10px;
  max-width: 40em;
}
.modal-restaurant--chef-spotlight .modal-restaurant-dek {
  color: color-mix(in srgb, var(--text) 82%, var(--chef-hue, #7c5cbf));
}
[data-theme="dark"] .modal-restaurant-dek {
  color: color-mix(in srgb, var(--text) 78%, transparent);
}
[data-theme="dark"] .modal-restaurant--chef-spotlight .modal-restaurant-dek {
  color: color-mix(in srgb, var(--text) 88%, #c4b5fd);
}
.modal-restaurant-chef {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.7rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: 4px;
}
.modal-restaurant-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-2);
  font-family: var(--font-body);
  font-size: 0.82rem;
  font-style: italic;
  color: var(--text-muted);
  margin-bottom: 4px;
}
.modal-restaurant-stars {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-style: normal;
  color: var(--gold);
  letter-spacing: 0.04em;
}
.modal-restaurant-stars__label {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.62rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--text-muted);
}
.modal-restaurant-note {
  font-family: var(--font-body);
  font-size: 0.85rem;
  color: var(--text-muted);
}

/* Restaurant name mention echo — hotel reviews naming on-site venues */
.modal-restaurant-mentions {
  margin-top: var(--space-3);
  padding-top: var(--space-3);
  border-top: 1px solid color-mix(in srgb, var(--border) 70%, transparent);
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}
.modal-restaurant-mentions-head {
  font-family: var(--font-display);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--gold);
  margin: 0;
}
.modal-restaurant-mentions-lede {
  font-family: var(--font-body);
  font-size: 0.78rem;
  color: var(--text-muted);
  margin: 0;
}
.rm-mention-list { display: flex; flex-direction: column; gap: var(--space-2); }
.rm-mention {
  margin: 0;
  padding: var(--space-2) var(--space-3);
  border-left: 2px solid color-mix(in srgb, var(--gold) 45%, var(--border));
  background: color-mix(in srgb, var(--surface) 92%, var(--gold));
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  font-family: var(--font-serif);
  font-size: 0.88rem;
  line-height: 1.45;
  color: var(--text);
}
.rm-mention--hidden { display: none; }
.rm-mention-cite {
  display: block;
  margin-top: 6px;
  font-family: var(--font-body);
  font-style: normal;
  font-size: 0.72rem;
  color: var(--text-muted);
}
.rm-mention-rating { margin-left: 6px; }
.rm-mention-date { margin-left: 6px; opacity: 0.85; }
.rm-mention-more {
  align-self: flex-start;
  margin-top: var(--space-1);
  font-size: 0.78rem;
}

/* ───────────────────────────────────────────────────────────────────────
   Dining Sentiment ("What Diners Say") — restaurant-level diner voice merged
   from OpenTable + Yelp venue pulls. Mirrors the modal-restaurant / sentiment
   vocabulary (gold accents, serif venue names, surface cards).
   ─────────────────────────────────────────────────────────────────────── */
.modal-dining-voice { display: flex; flex-direction: column; gap: var(--space-3); }
.dv-foodie {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  flex-wrap: wrap;
  padding: var(--space-3) var(--space-4);
  background: var(--surface);
  border: 1px solid var(--gold);
  border-radius: var(--radius-sm);
}
.dv-foodie-label {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.72rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--gold);
}
.dv-foodie-score { display: inline-flex; align-items: baseline; gap: 8px; }
.dv-foodie-num {
  font-family: var(--font-serif);
  font-weight: 600;
  font-size: 1.4rem;
  color: var(--text);
}
.dv-foodie-out { font-family: var(--font-body); font-size: 0.8rem; color: var(--text-muted); }

/* ── Foodie Score hero (modal dining section) ───────────────────────────── */
.modal-dining-program { display: flex; flex-direction: column; gap: var(--space-4); }
.foodie-hero {
  padding: var(--space-4);
  border-radius: var(--radius-sm);
  border: 1px solid color-mix(in srgb, var(--gold) 55%, var(--border));
  background: linear-gradient(145deg,
    color-mix(in srgb, var(--gold) 8%, var(--surface)),
    var(--surface));
}
.foodie-hero--elite {
  border-color: color-mix(in srgb, var(--gold) 75%, var(--border));
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--gold) 18%, transparent),
    0 8px 28px color-mix(in srgb, var(--gold) 12%, transparent);
}
.foodie-hero--strong {
  border-color: color-mix(in srgb, var(--gold) 62%, var(--border));
}
.foodie-hero--developing {
  border-color: color-mix(in srgb, var(--border) 85%, var(--gold));
}
.foodie-hero--pending {
  border-style: dashed;
  border-color: var(--border);
}
.foodie-hero-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-3);
  flex-wrap: wrap;
}
.foodie-hero-titleblock {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px 12px;
  padding-top: 4px;
}
.foodie-hero-elite {
  display: inline-flex;
  align-items: center;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.58rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  padding: 4px 10px;
  border-radius: 999px;
  color: #7a5c2e;
  background: color-mix(in srgb, var(--gold) 22%, transparent);
  border: 1px solid color-mix(in srgb, var(--gold) 45%, transparent);
}
:root[data-theme="dark"] .foodie-hero-elite {
  color: #e8c878;
  background: color-mix(in srgb, var(--gold) 18%, transparent);
}
.foodie-hero-coverage {
  margin: var(--space-2) 0 0;
  font-size: 0.78rem;
  font-style: italic;
  color: var(--text-muted);
  line-height: 1.4;
}
.modal-dining-subhead {
  margin: 0 0 var(--space-2);
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.62rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--text-muted);
}
.modal-dining-program-block + .modal-dining-voice {
  margin-top: var(--space-2);
  padding-top: var(--space-3);
  border-top: 1px solid rgba(160, 160, 160, 0.16);
}
.dv-ai-summary {
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.82rem;
  font-style: italic;
  line-height: 1.45;
  color: var(--text-muted);
}
.foodie-comp-bar--pending { opacity: 0.45; }
.foodie-comp-val--pending {
  color: var(--text-muted);
  font-weight: 400;
  font-family: var(--font-body);
  font-size: 0.72rem;
}
.foodie-comp-row--pending .foodie-comp-label { opacity: 0.72; }
.modal-restaurant-live--compact {
  padding: 5px 10px;
  gap: 5px 8px;
}
.modal-restaurant-live-hint {
  font-family: var(--font-body);
  font-size: 0.72rem;
  color: var(--text-muted);
  font-style: italic;
}
@media (max-width: 520px) {
  .foodie-comp-row {
    grid-template-columns: minmax(5.5em, 7em) 1fr 1.6em;
    gap: 6px;
  }
  .foodie-hero-num { font-size: 1.85rem; }
}
.foodie-hero-label {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.72rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--gold);
  padding-top: 6px;
}
.foodie-hero-score {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 10px 16px;
}
.foodie-hero-num {
  font-family: var(--font-serif);
  font-weight: 700;
  font-size: 2.25rem;
  line-height: 1;
  color: var(--text);
}
.foodie-hero-denom {
  font-family: var(--font-body);
  font-size: 0.95rem;
  color: var(--text-muted);
  margin-right: 8px;
}
.foodie-hero-diner {
  display: inline-flex;
  align-items: baseline;
  gap: 6px;
  padding: 4px 10px;
  border-radius: 999px;
  background: color-mix(in srgb, var(--gold) 12%, transparent);
  border: 1px solid color-mix(in srgb, var(--gold) 35%, transparent);
}
.foodie-hero-diner-num {
  font-family: var(--font-serif);
  font-weight: 600;
  font-size: 0.95rem;
}
.foodie-hero-diner-lbl {
  font-family: var(--font-display);
  font-size: 0.58rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-muted);
}
.foodie-hero-pending {
  margin: 0;
  font-size: 0.85rem;
  font-style: italic;
  color: var(--text-muted);
  max-width: 36em;
}
.foodie-hero-meta {
  margin: var(--space-2) 0 0;
  font-size: 0.78rem;
  color: var(--text-muted);
}
.foodie-hero-srcs {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: var(--space-2);
}
.foodie-pillars {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-3);
  margin-top: var(--space-3);
}
@media (max-width: 520px) {
  .foodie-pillars { grid-template-columns: 1fr; }
}
.foodie-pillar {
  display: grid;
  grid-template-columns: 1fr auto;
  grid-template-rows: auto auto;
  gap: 4px 10px;
  align-items: center;
}
.foodie-pillar-k {
  grid-column: 1 / -1;
  font-family: var(--font-display);
  font-size: 0.58rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-muted);
}
.foodie-pillar-bar {
  height: 5px;
  border-radius: 999px;
  background: var(--border);
  overflow: hidden;
}
.foodie-pillar-bar > span {
  display: block;
  height: 100%;
  border-radius: 999px;
}
.foodie-pillar--ours .foodie-pillar-bar > span {
  background: linear-gradient(90deg, rgba(180, 140, 60, 0.5), var(--gold));
}
.foodie-pillar--ext .foodie-pillar-bar > span {
  background: linear-gradient(90deg, rgba(90, 150, 110, 0.45), #4caf76);
}
.foodie-pillar-v {
  font-family: var(--font-serif);
  font-weight: 600;
  font-size: 0.85rem;
  min-width: 1.8em;
  text-align: right;
}
.foodie-comp-details {
  margin-top: var(--space-3);
  border-top: 1px solid rgba(160, 160, 160, 0.18);
  padding-top: var(--space-2);
}
.foodie-comp-toggle {
  font-family: var(--font-display);
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--gold);
  cursor: pointer;
  list-style: none;
}
.foodie-comp-toggle::-webkit-details-marker { display: none; }
.foodie-comp-grid {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-top: var(--space-2);
}
.foodie-comp-row {
  display: grid;
  grid-template-columns: minmax(7em, 9em) 1fr 2em;
  gap: 8px;
  align-items: center;
}
.foodie-comp-label {
  font-size: 0.72rem;
  color: var(--text-muted);
  line-height: 1.2;
}
.foodie-comp-bar {
  height: 5px;
  border-radius: 999px;
  background: var(--border);
  overflow: hidden;
}
.foodie-comp-fill {
  display: block;
  height: 100%;
  border-radius: 999px;
  background: linear-gradient(90deg, rgba(180, 140, 60, 0.45), var(--gold));
}
.foodie-comp-row--external .foodie-comp-fill {
  background: linear-gradient(90deg, rgba(90, 150, 110, 0.45), #4caf76);
}
.foodie-comp-val {
  font-family: var(--font-serif);
  font-weight: 600;
  font-size: 0.78rem;
  text-align: right;
}

/* ── Atlas Quality Score v2 (modal) — AQS_V2_SPEC.md ───────────────────── */
.aqs-hero {
  padding: var(--space-4);
  border-radius: var(--radius-sm);
  border: 1px solid color-mix(in srgb, var(--accent-blue, #4a7c9b) 45%, var(--border));
  background: linear-gradient(145deg,
    color-mix(in srgb, var(--accent-blue, #4a7c9b) 6%, var(--surface)),
    var(--surface));
}
.aqs-hero--elite {
  border-color: color-mix(in srgb, var(--gold) 70%, var(--border));
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--gold) 14%, transparent);
}
.aqs-hero-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-3);
  flex-wrap: wrap;
}
.aqs-hero-titleblock {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px 12px;
  padding-top: 4px;
}
.aqs-hero-label {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.72rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--accent-blue, #4a7c9b) 85%, var(--text));
}
.aqs-hero-elite {
  display: inline-flex;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.58rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  padding: 4px 10px;
  border-radius: 999px;
  color: #7a5c2e;
  background: color-mix(in srgb, var(--gold) 22%, transparent);
  border: 1px solid color-mix(in srgb, var(--gold) 45%, transparent);
}
.aqs-hero-score {
  display: flex;
  align-items: baseline;
  gap: 4px;
}
.aqs-hero-num {
  font-family: var(--font-serif);
  font-weight: 700;
  font-size: 2.25rem;
  line-height: 1;
  color: var(--text);
}
.aqs-hero-denom {
  font-family: var(--font-body);
  font-size: 0.95rem;
  color: var(--text-muted);
}
.aqs-hero-intro {
  margin: var(--space-2) 0 0;
  font-size: 0.82rem;
  line-height: 1.45;
  color: var(--text-muted);
  max-width: 42em;
}
.aqs-hero-meta {
  margin: var(--space-2) 0 0;
  font-size: 0.78rem;
  color: var(--text-muted);
}
.aqs-streams {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-2);
  margin-top: var(--space-3);
}
@media (max-width: 600px) {
  .aqs-streams { grid-template-columns: 1fr; }
}
.aqs-stream {
  display: grid;
  grid-template-columns: 1fr auto;
  grid-template-rows: auto auto;
  gap: 4px 8px;
  padding: 8px 10px;
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--surface-elevated, var(--surface)) 80%, transparent);
  border: 1px solid rgba(160, 160, 160, 0.12);
}
.aqs-stream-k {
  grid-column: 1;
  font-family: var(--font-display);
  font-size: 0.58rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-muted);
}
.aqs-stream-v {
  grid-column: 2;
  grid-row: 1 / 3;
  align-self: center;
  font-family: var(--font-serif);
  font-weight: 700;
  font-size: 1.1rem;
}
.aqs-stream-bar {
  grid-column: 1;
  height: 4px;
  border-radius: 2px;
  background: rgba(160, 160, 160, 0.2);
  overflow: hidden;
}
.aqs-stream-bar > span {
  display: block;
  height: 100%;
  background: color-mix(in srgb, var(--accent-blue, #4a7c9b) 70%, var(--gold));
  border-radius: 2px;
}
.aqs-stream-n {
  grid-column: 1;
  font-size: 0.68rem;
  color: var(--text-muted);
}
.aqs-components {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin-top: var(--space-3);
}
.aqs-comp-row {
  display: grid;
  grid-template-columns: minmax(7em, 10em) 1fr 2em;
  align-items: center;
  gap: 8px;
}
.aqs-comp-label {
  font-family: var(--font-body);
  font-size: 0.72rem;
  color: var(--text-muted);
  line-height: 1.25;
}
.aqs-comp-bar {
  height: 6px;
  border-radius: 3px;
  background: rgba(160, 160, 160, 0.18);
  overflow: hidden;
}
.aqs-comp-fill {
  display: block;
  height: 100%;
  background: linear-gradient(90deg, color-mix(in srgb, var(--accent-blue, #4a7c9b) 50%, transparent), var(--accent-blue, #4a7c9b));
  border-radius: 3px;
}
.aqs-comp-row--integrity .aqs-comp-fill {
  background: linear-gradient(90deg, rgba(180, 140, 80, 0.45), var(--gold));
}
.aqs-comp-row--recognition .aqs-comp-fill {
  background: linear-gradient(90deg, rgba(90, 150, 110, 0.45), #4caf76);
}
.aqs-comp-val {
  font-family: var(--font-serif);
  font-weight: 600;
  font-size: 0.78rem;
  text-align: right;
}
.aqs-comp-bar--pending { opacity: 0.4; }
.aqs-comp-val--pending { color: var(--text-muted); font-weight: 400; font-size: 0.72rem; }
.aqs-comp-row--pending .aqs-comp-label { opacity: 0.72; }

.modal-restaurant-live {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px 10px;
  margin-top: 6px;
  padding: 8px 10px;
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--gold) 6%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--gold) 22%, transparent);
}
.modal-restaurant-live-label {
  font-family: var(--font-display);
  font-size: 0.58rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-muted);
}
.modal-restaurant-live-num {
  font-family: var(--font-serif);
  font-weight: 600;
  font-size: 0.9rem;
}
.modal-restaurant-live-srcs { display: inline-flex; flex-wrap: wrap; gap: 4px; }
.modal-restaurant-w50 {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-family: var(--font-serif);
  font-weight: 600;
  font-size: 0.85rem;
  color: #7a5c2e;
}
.modal-restaurant-w50__label {
  font-family: var(--font-display);
  font-size: 0.55rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-muted);
}
:root[data-theme="dark"] .modal-restaurant-w50 { color: #d4b878; }
.modal-restaurant-honor {
  display: inline-flex;
  align-items: center;
  padding: 1px 7px;
  border-radius: 999px;
  font-family: var(--font-display);
  font-size: 0.56rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  line-height: 1.4;
  text-transform: uppercase;
  font-style: normal;
  color: var(--gold);
  background: color-mix(in srgb, var(--gold) 9%, transparent);
  border: 1px solid color-mix(in srgb, var(--gold) 28%, transparent);
}
.modal-restaurant-standout {
  display: inline-flex;
  align-items: center;
  padding: 2px 7px;
  border-radius: 999px;
  font-family: var(--font-display);
  font-size: 0.56rem;
  font-weight: 800;
  letter-spacing: 0.11em;
  line-height: 1.35;
  text-transform: uppercase;
  color: var(--chef-hue, #6d28d9);
  background: color-mix(in srgb, var(--chef-hue, #7c5cbf) 10%, transparent);
  border: 1px solid color-mix(in srgb, var(--chef-hue, #7c5cbf) 36%, transparent);
}
:root[data-theme="dark"] .modal-restaurant-standout {
  color: #ddd6fe;
  background: color-mix(in srgb, var(--chef-hue, #7c5cbf) 18%, transparent);
}

.dv-intro {
  font-family: var(--font-body);
  font-size: 0.85rem;
  font-style: italic;
  color: var(--text-muted);
  margin: 0;
}

/* Distinctive Guest Vocabulary (review corpus analysis) */
.modal-unusual-words { display: flex; flex-direction: column; gap: var(--space-4); }
.uw-intro {
  font-family: var(--font-body);
  font-size: 0.85rem;
  font-style: italic;
  color: var(--text-muted);
  margin: 0;
  line-height: 1.45;
}
.uw-lane { display: flex; flex-direction: column; gap: var(--space-2); }
.uw-lane-label {
  font-family: var(--font-display);
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-muted);
}
.uw-lanes-split {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-4);
}
@media (max-width: 520px) {
  .uw-lanes-split { grid-template-columns: 1fr; }
}
.uw-lane--neg .uw-bar-fill {
  background: linear-gradient(90deg, rgba(180, 90, 90, 0.45), rgba(200, 80, 80, 0.85));
}
.uw-lane--pos .uw-bar-fill {
  background: linear-gradient(90deg, rgba(90, 150, 110, 0.45), rgba(70, 140, 95, 0.85));
}
.uw-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.uw-row {
  display: grid;
  grid-template-columns: 1.4rem minmax(5rem, 9rem) 1fr auto;
  align-items: center;
  gap: 10px;
}
.uw-row--has-samples {
  grid-template-columns: 1.4rem minmax(5rem, 9rem) 1fr auto;
}
.uw-row--has-samples .uw-samples {
  grid-column: 2 / -1;
}
.uw-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  margin-top: 4px;
}
.uw-tag {
  display: inline-block;
  font-family: var(--font-display);
  font-size: 0.52rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 2px 5px;
  border-radius: 3px;
}
.uw-tag--staff {
  background: rgba(120, 140, 180, 0.15);
  color: var(--text-muted);
}
.uw-tag--concern {
  background: rgba(180, 90, 90, 0.18);
  color: #a04444;
}
.uw-samples {
  list-style: none;
  margin: 4px 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.uw-sample {
  font-family: var(--font-body);
  font-size: 0.78rem;
  line-height: 1.4;
  color: var(--text-muted);
  font-style: italic;
  padding-left: 8px;
  border-left: 2px solid rgba(160, 160, 160, 0.25);
}
.uw-sample-meta {
  font-style: normal;
  font-size: 0.68rem;
  color: var(--text-muted);
  opacity: 0.85;
}
.uw-concern-note {
  font-family: var(--font-body);
  font-size: 0.8rem;
  color: var(--text-muted);
  margin: 0;
  line-height: 1.45;
}

/* Card teaser — top distinctive guest vocabulary terms */
.card-vocab-teaser {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
  margin: 6px 0 4px;
  cursor: pointer;
  border-radius: 6px;
  padding: 2px 0;
}
.card-vocab-teaser:hover .card-vocab-chip,
.card-vocab-teaser:focus-visible .card-vocab-chip {
  border-color: rgba(184, 150, 90, 0.45);
  background: rgba(184, 150, 90, 0.18);
}
.card-vocab-teaser:focus-visible {
  outline: 2px solid rgba(184, 150, 90, 0.35);
  outline-offset: 2px;
}
.card-vocab-label {
  font-family: var(--font-display);
  font-size: 0.58rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin-right: 2px;
}
.card-vocab-chip {
  font-family: var(--font-serif);
  font-size: 0.78rem;
  font-weight: 600;
  color: var(--text);
  padding: 2px 8px;
  border-radius: 999px;
  background: rgba(184, 150, 90, 0.12);
  border: 1px solid rgba(184, 150, 90, 0.22);
}
.uw-rank {
  font-family: var(--font-display);
  font-size: 0.65rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  color: var(--text-muted);
  text-align: right;
}
.uw-word {
  font-family: var(--font-serif);
  font-weight: 600;
  font-size: 0.95rem;
  color: var(--text);
}
.uw-bar {
  display: block;
  height: 6px;
  border-radius: 999px;
  background: rgba(160, 160, 160, 0.18);
  overflow: hidden;
  min-width: 40px;
}
.uw-bar-fill {
  display: block;
  height: 100%;
  border-radius: inherit;
  background: linear-gradient(90deg, rgba(184, 150, 90, 0.55), var(--gold));
}
.uw-meta {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
  justify-content: flex-end;
}
.uw-lift {
  font-family: var(--font-display);
  font-size: 0.58rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--gold);
  white-space: nowrap;
}
.uw-lift--low {
  opacity: 0.72;
  font-weight: 600;
}
.uw-sources {
  font-size: 0.62rem;
  color: var(--text-muted);
  white-space: nowrap;
  opacity: 0.9;
}
.uw-brand-crosslink {
  font-family: var(--font-body);
  font-size: 0.82rem;
  color: var(--text-muted);
  margin: 0;
  line-height: 1.5;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
}
.uw-brand-crosslink-label {
  font-family: var(--font-display);
  font-size: 0.58rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.uw-brand-link {
  font-family: var(--font-body);
  font-size: 0.72rem;
  font-weight: 600;
  color: var(--gold);
  background: none;
  border: none;
  padding: 0;
  cursor: pointer;
  text-decoration: underline;
  text-underline-offset: 2px;
}
.uw-brand-link:hover,
.uw-brand-link:focus-visible {
  color: var(--text);
}
.uw-lane-note {
  font-family: var(--font-body);
  font-size: 0.75rem;
  color: var(--text-muted);
  margin: 0;
  line-height: 1.45;
  font-style: italic;
}
.uw-revs {
  font-family: var(--font-body);
  font-size: 0.62rem;
  color: var(--text-muted);
  white-space: nowrap;
}
.uw-count {
  font-family: var(--font-display);
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  color: var(--text-muted);
  white-space: nowrap;
}
:root[data-theme="dark"] .uw-bar-fill {
  background: linear-gradient(90deg, rgba(212, 178, 110, 0.45), var(--gold));
}
:root[data-theme="dark"] .uw-lane--neg .uw-bar-fill {
  background: linear-gradient(90deg, rgba(220, 120, 120, 0.35), rgba(230, 100, 100, 0.75));
}
:root[data-theme="dark"] .uw-lane--pos .uw-bar-fill {
  background: linear-gradient(90deg, rgba(100, 180, 130, 0.35), rgba(90, 170, 120, 0.75));
}

.dv-stars { color: var(--gold); letter-spacing: 0.06em; white-space: nowrap; }
.dv-foodie-score .dv-stars { font-size: 1.05rem; }
.dv-venues { display: flex; flex-direction: column; gap: var(--space-3); }
.dv-venue {
  padding: var(--space-3) var(--space-4);
  border-left: 2px solid var(--gold);
  background: var(--surface);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.dv-venue-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-2);
  flex-wrap: wrap;
}
.dv-venue-name {
  font-family: var(--font-serif);
  font-style: italic;
  font-weight: 500;
  font-size: 1.0625rem;
  color: var(--text);
}
.dv-venue-score { display: inline-flex; align-items: baseline; gap: 6px; white-space: nowrap; }
.dv-venue-num { font-family: var(--font-serif); font-weight: 600; font-size: 0.95rem; color: var(--text); }
.dv-srcs { display: flex; flex-wrap: wrap; gap: 6px; }
.dv-src {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.62rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  padding: 3px 8px;
  border-radius: 999px;
  color: var(--text-muted);
  background: rgba(160, 160, 160, 0.12);
}
.dv-src--ot { color: #c0392b; background: rgba(192, 57, 43, 0.12); }
.dv-src--yelp { color: #b8541f; background: rgba(184, 84, 31, 0.12); }
.dv-src--ta { color: #00aa6c; background: rgba(0, 170, 108, 0.12); }
.dv-src-nr { font-weight: 600; letter-spacing: 0.04em; text-transform: none; opacity: 0.85; }
:root[data-theme="dark"] .dv-src--ot { color: #f08a7d; background: rgba(240, 138, 125, 0.14); }
:root[data-theme="dark"] .dv-src--yelp { color: #e0a878; background: rgba(224, 168, 120, 0.14); }
:root[data-theme="dark"] .dv-src--ta { color: #6dd4a8; background: rgba(109, 212, 168, 0.14); }
.dv-subratings { display: flex; flex-wrap: wrap; gap: var(--space-2) var(--space-3); }
.dv-sub { display: inline-flex; align-items: baseline; gap: 5px; font-size: 0.8rem; }
.dv-sub-k {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.62rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-muted);
}
.dv-sub-v { font-family: var(--font-serif); font-weight: 600; color: var(--text); }
.dv-quotes { display: flex; flex-direction: column; gap: 8px; margin-top: 2px; }
.dv-quote {
  margin: 0;
  padding: 8px 0 8px var(--space-3);
  border-left: 2px solid rgba(160, 160, 160, 0.3);
  font-family: var(--font-body);
  font-size: 0.875rem;
  line-height: 1.5;
  color: var(--text);
  overflow-wrap: anywhere;
}
.dv-cite {
  display: block;
  margin-top: 5px;
  font-style: normal;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.6rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-muted);
}
.dv-elite {
  display: inline-block;
  margin-left: 6px;
  padding: 1px 6px;
  border-radius: 999px;
  background: var(--gold);
  color: #1a1a1a;
  letter-spacing: 0.08em;
}

/* Guest Voice ("What guests say") — hotel-level corpora. Reuses the dv- quote
   /cite/subrating/source machinery; these add the per-source blocks, the extra
   source chips (Google / Google Maps), and the unique signal badges (Local
   Guide, Filtered, non-English language tag). */
.dv-source-block { display: flex; flex-direction: column; gap: 8px; }
.dv-source-block + .dv-source-block { margin-top: var(--space-3); padding-top: var(--space-3); border-top: 1px solid rgba(160, 160, 160, 0.18); }
.dv-src--google { color: #2a73c2; background: rgba(42, 115, 194, 0.12); }
.dv-src--gmaps { color: #1a7a4f; background: rgba(26, 122, 79, 0.12); }
.dv-src--locale { color: #8b4513; background: rgba(139, 69, 19, 0.12); }
.dv-src--holidaycheck { color: #0a6b55; background: rgba(10, 107, 85, 0.1); }
.dv-src--naver { color: #1a9e45; background: rgba(26, 158, 69, 0.1); }
.dv-src--tripcom { color: #2563b0; background: rgba(37, 99, 176, 0.1); }
:root[data-theme="dark"] .dv-src--google { color: #7db2ec; background: rgba(125, 178, 236, 0.14); }
:root[data-theme="dark"] .dv-src--gmaps { color: #6fc79b; background: rgba(111, 199, 155, 0.14); }
:root[data-theme="dark"] .dv-src--locale { color: #e8b882; background: rgba(232, 184, 130, 0.14); }
:root[data-theme="dark"] .dv-src--holidaycheck { color: #6fd4b8; background: rgba(111, 212, 184, 0.12); }
:root[data-theme="dark"] .dv-src--naver { color: #7ee09a; background: rgba(126, 224, 154, 0.12); }
:root[data-theme="dark"] .dv-src--tripcom { color: #8eb8f0; background: rgba(142, 184, 240, 0.12); }
.dv-guide,
.dv-filtered,
.dv-lang {
  display: inline-block;
  margin-left: 6px;
  padding: 1px 6px;
  border-radius: 999px;
  letter-spacing: 0.08em;
}
.dv-guide { background: rgba(26, 122, 79, 0.16); color: #1a7a4f; }
.dv-filtered { background: rgba(184, 84, 31, 0.16); color: #b8541f; }
.dv-lang { background: rgba(160, 160, 160, 0.2); color: var(--text-muted); }
:root[data-theme="dark"] .dv-guide { background: rgba(111, 199, 155, 0.18); color: #6fc79b; }
:root[data-theme="dark"] .dv-filtered { background: rgba(224, 168, 120, 0.18); color: #e0a878; }
.dv-filtered-block { display: flex; flex-direction: column; gap: 6px; margin-top: 4px; }
.dv-filtered-toggle {
  opacity: 0.5;
  background: none;
  border: none;
  padding: 0;
  margin: 0;
  cursor: pointer;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.6rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-muted);
  text-align: left;
  line-height: 1.4;
}
.dv-filtered-toggle:hover,
.dv-filtered-toggle:focus-visible {
  opacity: 0.72;
  outline: none;
  text-decoration: underline;
  text-underline-offset: 2px;
}
.dv-filtered-toggle[aria-expanded="true"] {
  opacity: 1;
}
.dv-filtered-toggle-state {
  text-transform: none;
  letter-spacing: 0.02em;
  font-weight: 400;
  font-family: var(--font-body);
  font-size: 0.8rem;
}
.dv-filtered-panel {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.dv-filtered-panel[hidden] {
  display: none;
}
.dv-filtered-label,
.dv-filtered-note {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.6rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin: 0;
}
.dv-filtered-note { text-transform: none; letter-spacing: 0.02em; font-weight: 400; font-family: var(--font-body); font-size: 0.8rem; }

/* Amenities list */
.modal-amenities {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-3) var(--space-5);
  font-family: var(--font-body);
  font-size: 0.92rem;
  color: var(--text);
}
.modal-amenity {
  display: flex; align-items: flex-start; gap: 10px;
  line-height: 1.45;
}
.modal-amenity::before {
  content: "";
  width: 6px; height: 6px;
  background: var(--gold);
  transform: rotate(45deg);
  flex-shrink: 0;
  margin-top: 8px;
}
@media (max-width: 640px) {
  .modal-amenities { grid-template-columns: 1fr; }
}

/* Awards list */
.modal-awards { display: flex; flex-direction: column; gap: 8px; }
.modal-award {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: var(--space-3);
  padding: 8px 0;
  border-bottom: 1px dashed var(--border);
  font-family: var(--font-body);
  font-size: 0.93rem;
  color: var(--text);
}
.modal-award:last-child { border-bottom: none; }
.modal-award-year {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.72rem;
  letter-spacing: 0.18em;
  color: var(--gold);
  flex-shrink: 0;
}

/* Architect / Designer / Rooms meta line */
.modal-craft {
  display: flex; flex-wrap: wrap; gap: var(--space-5);
  padding: var(--space-4) var(--space-5);
  margin: var(--space-4) 0 var(--space-6);
  background: var(--surface);
  border: 1px solid var(--border);
  border-left: 3px solid var(--gold);
  border-radius: 0 var(--radius-md) var(--radius-md) 0;
  font-family: var(--font-body);
  font-size: 0.875rem;
  color: var(--text);
}
.modal-craft strong {
  display: block;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.66rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--text-faint);
  margin-bottom: 3px;
}
/* CRAFT-FREQ-2026: atlas-wide listing counts — green/blue heat (positive only),
   rescaled to craft-name frequency tiers (top 20/15/10/5%). Mirrors Map Mode
   rating numerals (.atlas-pin-label-score.is-rating-high-*). */
.modal-craft .craft-freq {
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  margin-left: 0.15em;
  color: var(--text-faint);
}
.modal-craft .craft-freq.is-craft-high-20 {
  color: var(--text);
  text-shadow:
    0 0 2px rgba(96, 165, 250, 0.55),
    0 0 5px rgba(59, 130, 246, 0.3);
}
.modal-craft .craft-freq.is-craft-high-15 {
  color: #1e3a5f;
  text-shadow:
    0 0 3px rgba(96, 165, 250, 0.65),
    0 0 7px rgba(59, 130, 246, 0.4);
}
.modal-craft .craft-freq.is-craft-high-10 {
  color: #14532d;
  font-weight: 900;
  text-shadow:
    0 0 3px rgba(74, 222, 128, 0.65),
    0 0 7px rgba(34, 197, 94, 0.4);
}
.modal-craft .craft-freq.is-craft-high-5 {
  color: #166534;
  font-weight: 900;
  text-shadow:
    0 0 4px rgba(74, 222, 128, 0.75),
    0 0 9px rgba(34, 197, 94, 0.5);
}
[data-theme="dark"] .modal-craft .craft-freq.is-craft-high-15 { color: #93c5fd; }
[data-theme="dark"] .modal-craft .craft-freq.is-craft-high-10 { color: #86efac; }
[data-theme="dark"] .modal-craft .craft-freq.is-craft-high-5 { color: #4ade80; }

.modal-craft-link {
  font: inherit;
  letter-spacing: inherit;
  color: inherit;
  background: none;
  border: 0;
  padding: 0;
  margin: 0;
  cursor: pointer;
  display: inline;
  border-bottom: 1px solid color-mix(in srgb, var(--craft-hue, #6b9080) 45%, transparent);
  transition: color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
}
.modal-craft-link:hover,
.modal-craft-link:focus-visible {
  color: var(--craft-hue, #6b9080);
  border-bottom-color: var(--craft-hue, #6b9080);
}
.modal-craft-link:focus-visible {
  outline: 2px solid var(--craft-hue, #6b9080);
  outline-offset: 3px;
  border-radius: 2px;
}
.craft-modal-list {
  max-height: 320px;
  overflow-y: auto;
}
.craft-modal-loading {
  color: var(--text-muted);
  padding: var(--space-4) 0;
}

/* CHEF-FREQ-2026 — head/executive chef atlas-wide restaurant counts.
   "(N)" badge mirrors the craft-freq numerals; the clickable chef name opens the
   chef portfolio modal. DINING-SPOTLIGHT-2026 uses this plus Michelin / 50 Best /
   high-confidence diner evidence for the regal-purple venue box. */
.modal-restaurant-chef .chef-freq {
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  margin-left: 0.15em;
  color: var(--text-faint);
}
.modal-restaurant-chef .chef-freq.is-craft-high-20 { color: var(--text); }
.modal-restaurant-chef .chef-freq.is-craft-high-15 {
  color: #6d28d9;
  text-shadow: 0 0 4px rgba(167, 139, 250, 0.45);
}
.modal-restaurant-chef .chef-freq.is-craft-high-10 {
  color: #5b21b6;
  font-weight: 900;
  text-shadow: 0 0 5px rgba(167, 139, 250, 0.55);
}
.modal-restaurant-chef .chef-freq.is-craft-high-5 {
  color: #4c1d95;
  font-weight: 900;
  text-shadow: 0 0 6px rgba(167, 139, 250, 0.7);
}
.modal-restaurant-chef .chef-blurb {
  font-weight: 400;
  font-style: italic;
  color: var(--text);
  margin-left: 0.1em;
}
[data-theme="dark"] .modal-restaurant-chef .chef-blurb {
  color: color-mix(in srgb, var(--text) 88%, #c4b5fd);
}
[data-theme="dark"] .modal-restaurant-chef .chef-freq.is-craft-high-15 { color: #c4b5fd; }
[data-theme="dark"] .modal-restaurant-chef .chef-freq.is-craft-high-10 { color: #ddd6fe; }
[data-theme="dark"] .modal-restaurant-chef .chef-freq.is-craft-high-5 { color: #ede9fe; }

.modal-chef-link {
  font: inherit;
  letter-spacing: inherit;
  color: inherit;
  background: none;
  border: 0;
  padding: 0;
  margin: 0;
  cursor: pointer;
  display: inline;
  border-bottom: 1px solid color-mix(in srgb, var(--chef-hue, #7c5cbf) 50%, transparent);
  transition: color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
}
.modal-chef-link:hover,
.modal-chef-link:focus-visible {
  color: var(--chef-hue, #7c5cbf);
  border-bottom-color: var(--chef-hue, #7c5cbf);
}
.modal-chef-link:focus-visible {
  outline: 2px solid var(--chef-hue, #7c5cbf);
  outline-offset: 3px;
  border-radius: 2px;
}

/* Destination-dining evidence: spotlight the whole venue card in regal purple. */
.modal-restaurant--chef-spotlight {
  --chef-hue: #7c5cbf;
  border-left: 2px solid color-mix(in srgb, var(--chef-hue) 62%, var(--gold));
  border-radius: var(--radius-md, 10px);
  background:
    linear-gradient(
      180deg,
      color-mix(in srgb, var(--chef-hue) 12%, var(--surface)),
      color-mix(in srgb, var(--chef-hue) 6%, var(--surface))
    );
  box-shadow:
    inset 0 0 0 1px color-mix(in srgb, var(--chef-hue) 28%, transparent),
    0 1px 8px color-mix(in srgb, var(--chef-hue) 14%, transparent);
}
[data-theme="dark"] .modal-restaurant--chef-spotlight {
  background:
    linear-gradient(
      180deg,
      color-mix(in srgb, var(--chef-hue) 22%, var(--surface)),
      color-mix(in srgb, var(--chef-hue) 11%, var(--surface))
    );
  box-shadow:
    inset 0 0 0 1px color-mix(in srgb, var(--chef-hue) 40%, transparent),
    0 1px 10px color-mix(in srgb, var(--chef-hue) 22%, transparent);
}
.modal-restaurant--chef-spotlight .modal-restaurant-chef {
  color: var(--chef-hue);
}
[data-theme="dark"] .modal-restaurant--chef-spotlight .modal-restaurant-chef {
  color: color-mix(in srgb, var(--chef-hue) 45%, #ffffff);
}

/* Chef portfolio modal — reuses .brand-modal / .craft-modal chrome. */
.chef-modal-list {
  max-height: 340px;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}
.chef-modal-row {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: var(--space-2) var(--space-3);
  border-left: 2px solid color-mix(in srgb, var(--chef-hue, #7c5cbf) 55%, transparent);
  background: color-mix(in srgb, var(--chef-hue, #7c5cbf) 6%, var(--surface));
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
}
.chef-modal-row__main {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-2);
}
.chef-modal-venue {
  font-family: var(--font-serif);
  font-style: italic;
  font-size: 1rem;
  color: var(--text);
}
.chef-modal-cuisine {
  font-family: var(--font-body);
  font-size: 0.8rem;
  font-style: italic;
  color: var(--text-muted);
}
.chef-modal-michelin { color: var(--gold); letter-spacing: 0.04em; }
.chef-modal-row__hotel { font-size: 0.9rem; }
.chef-modal-row__hotel .chef-modal-row__open {
  font: inherit;
  color: var(--chef-hue, #7c5cbf);
  background: none;
  border: 0;
  padding: 0;
  cursor: pointer;
  border-bottom: 1px solid color-mix(in srgb, var(--chef-hue, #7c5cbf) 45%, transparent);
}
.chef-modal-row__hotel .chef-modal-row__open:hover,
.chef-modal-row__hotel .chef-modal-row__open:focus-visible {
  border-bottom-color: var(--chef-hue, #7c5cbf);
}
.chef-modal-row__loc {
  font-family: var(--font-body);
  font-size: 0.78rem;
  color: var(--text-faint);
}
.chef-modal-empty,
.chef-modal-loading {
  color: var(--text-muted);
  padding: var(--space-4) 0;
}

.modal-price-block {
  padding: var(--space-5);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-md);
  background: var(--surface);
  margin-bottom: var(--space-6);
}
.modal-price-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--space-4);
  margin-bottom: var(--space-4);
}
.modal-price-cell { text-align: left; }
.modal-price-cell-label {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.66rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--text-faint);
  margin-bottom: 6px;
}
.modal-price-cell-value {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 1.75rem;
  color: var(--gold);
  line-height: 1;
}
.modal-price-cell-sub {
  font-family: var(--font-body);
  font-size: 0.8rem;
  color: var(--text-muted);
  margin-top: 6px;
}
.modal-price-footer {
  display: flex; justify-content: space-between;
  font-family: var(--font-body);
  font-size: 0.75rem;
  color: var(--text-faint);
  padding-top: var(--space-3);
  border-top: 1px dashed var(--border);
}

.modal-book {
  display: inline-flex; align-items: center; gap: 10px;
  padding: 14px 28px;
  background: var(--gold);
  color: var(--bg);
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.8rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  border-radius: var(--radius-md);
  transition: background var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease);
}
.modal-book:hover { background: var(--gold-bright); transform: translateY(-2px); }
:root[data-theme="light"] .modal-book { color: #ffffff; }

/* ===========================================================
   FOOTER
   =========================================================== */
.site-footer {
  border-top: 1px solid var(--border);
  padding: var(--space-8) var(--space-6);
  margin-top: var(--space-10);
  background: var(--bg-sunken);
}
.footer-inner { max-width: var(--max-w); margin: 0 auto; text-align: center; }
.footer-crest {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  max-width: 120px; margin: 0 auto var(--space-4);
}
.footer-crest .bar { flex: 1; height: 1px; background: var(--gold); opacity: 0.5; }
.footer-crest .dot { width: 5px; height: 5px; background: var(--gold); transform: rotate(45deg); }
.footer-text {
  font-family: var(--font-display);
  font-size: 0.8rem;
  letter-spacing: 0.18em;
  color: var(--text-muted);
  margin: 0;
  text-transform: uppercase;
}
.footer-text--small {
  font-family: var(--font-body);
  font-size: 0.72rem;
  color: var(--text-faint);
  text-transform: none;
  letter-spacing: 0.02em;
  margin-top: var(--space-2);
}

/* ===========================================================
   RESPONSIVE
   =========================================================== */
/* ===========================================================
   HEADER-COMPRESS-2026 — keep a SINGLE header row as long as possible.
   Order (desktop/tablet ≥700px only; phone layout is separate at ≤699.98):
     1) stack wordmark (Luxury / Hotels / Atlas)
     2) Filters → icon-only
     3) Mode → icon-only
     4) wordmark → crest only (narrow tablet only)
   Jewel + theme toggle stay visible on iPad Pro and up (≥834px). They hide
   only on phone (MOBILE-IPHONE ≤699.98) and the slim 700–833px tablet band
   below iPad Pro portrait (mini / small Air), where chrome is genuinely tight.
   Never prefer a 2-row header on tablet/desktop — empty stretch space
   (oversized region bar + barren second row) is worse than compact chrome.
   =========================================================== */
/* Below iPad Pro 11" portrait (~834px): still hide jewel/theme so mini/Air
   don't crush the region pill. Phone already hides them in MOBILE-IPHONE. */
@media (max-width: 833px) and (min-width: 700px) {
  .jewel-toggle { display: none !important; }
  .theme-toggle { display: none !important; }
}
@media (max-width: 1020px) and (min-width: 700px) {
  .wordmark-text {
    flex-direction: column;
    align-items: flex-start;
    gap: 0.08em;
    letter-spacing: 0.12em;
    font-size: 0.72rem;
    line-height: 1.12;
  }
  .wordmark-crest { width: 34px; height: 34px; }
  .wordmark { gap: var(--space-2); }
  .header-grid {
    gap: var(--space-2);
    padding-left: var(--space-2);
    padding-right: var(--space-2);
  }
  .region-select-wrap { gap: var(--space-2); }
  .header-right { gap: var(--space-2); }
  /* Region pill sizes to its label — never grow into empty 1fr column space. */
  .region-select-wrap .region-select {
    flex: 0 1 auto;
    min-width: 0;
    max-width: min(42vw, 280px);
  }
  #regionButtonLabel {
    min-width: 0;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
  }
}
@media (max-width: 960px) and (min-width: 700px) {
  /* Filters icon-only — reclaim the "Filters" word before crowding. */
  .filters-button .filters-button-label { display: none; }
  .filters-button {
    padding: 0;
    width: var(--header-control-h);
    min-width: var(--header-control-h);
    height: var(--header-control-h);
    justify-content: center;
  }
  .filters-button .filters-count {
    position: absolute;
    top: -6px;
    right: -6px;
    border: 2px solid var(--bg-sunken);
  }
  .region-select-wrap .region-select { max-width: min(36vw, 220px); }
}
@media (max-width: 860px) and (min-width: 700px) {
  /* Mode icon + chevron only — keep stacked wordmark text so the center isn't barren. */
  #modeButton.mode-select #modeButtonLabel { display: none; }
  #modeButton.mode-select {
    padding: 0 12px;
    gap: 6px;
  }
  .region-select,
  #modeButton.mode-select {
    padding-left: 12px;
    padding-right: 12px;
  }
  .region-select-wrap .region-select { max-width: min(28vw, 180px); }
}
@media (max-width: 740px) and (min-width: 700px) {
  /* Last resort before phone chrome: crest-only wordmark. */
  .wordmark-text { display: none; }
  .wordmark-crest { width: 36px; height: 36px; }
  .wordmark { gap: 0; }
}

@media (max-width: 820px) {
  .art-frame { display: none; }
  .hero { padding: var(--space-6) var(--space-4); }
  .hero-placeholders { max-width: 380px; }
}

@media (max-width: 640px) {
  .header-grid { padding: var(--space-3) var(--space-4); gap: var(--space-2); }
  .wordmark-text { font-size: 0.7rem; letter-spacing: 0.12em; }
  .wordmark-crest { width: 32px; height: 32px; }
  .region-select-prefix { display: none; }
  .region-select {
    padding: 0 14px;
    font-size: var(--header-control-fs);
    min-height: var(--header-control-h);
    height: var(--header-control-h);
  }
  .region-select .pin-icon { width: 16px; height: 16px; }
  .region-select .chev { width: 12px; height: 12px; }
  .region-select { flex-wrap: nowrap; }
  .region-select .pin-icon,
  .region-select .chev { flex-shrink: 0; }
  #regionButtonLabel {
    min-width: 0;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
  }
  .theme-toggle {
    width: var(--header-control-h);
    height: var(--header-control-h);
  }
  .theme-toggle svg { width: 20px; height: 20px; }
  .hero { padding: var(--space-5) var(--space-3) var(--space-6); }
  .hero-title { font-size: 2.5rem; }
  .region-title { font-size: 2.75rem; }
  .tagline { font-size: 1.1rem; }
  .hero-nav { gap: var(--space-5); }
  .hero-nav--secondary { gap: var(--space-3); }
  .results { padding: var(--space-5) var(--space-4) var(--space-8); }
  .card-grid { grid-template-columns: 1fr; gap: var(--space-4); }
  .modal { max-height: 94vh; }
  .modal-content { padding: var(--space-5) var(--space-5); }
  .modal-meta-row { gap: var(--space-4); }
  .modal-price-grid { grid-template-columns: 1fr; gap: var(--space-3); }
  .dropdown-menu { min-width: 220px; }
  .dropdown-menu--right { right: 0; left: auto; }
}

@media (max-width: 420px) {
  .hero-placeholders { max-width: 260px; }
  .hero-ph { aspect-ratio: 1 / 1; }
  .hero-title { font-size: 2.125rem; }
  .region-title { font-size: 2.25rem; }
  .results-heading { font-size: 1.5rem; }
  .footer-text { font-size: 0.7rem; letter-spacing: 0.15em; }
}

/* =========================================================
   FILTER BAR (hhatlas-style)
   Sits between hero and results.
   Desktop (≥720px): chip buttons inline with labels.
   Mobile  (<720px):  chips hide, native <select> shows.
   ========================================================= */
.filter-bar-wrap {
  width: 100%;
  padding: 0 var(--space-6);
  margin: 0 auto var(--space-6);
  max-width: calc(var(--max-w) + var(--space-12));
  position: relative;
  z-index: 2;
}

.filter-bar {
  background: var(--bg-elevated);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-lg);
  padding: var(--space-4) var(--space-5);
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

.filter-row {
  display: flex;
  align-items: flex-start; /* label aligns with the first row of chips even when chips wrap */
  gap: var(--space-4);
  flex-wrap: nowrap; /* keep label adjacent to chip block; chips themselves wrap internally */
  min-height: 40px;
}
.filter-row .filter-label {
  /* Nudge the label down a hair so it visually baselines with the chip row. */
  padding-top: 10px;
}

.filter-label {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.68rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--text-muted);
  flex: 0 0 auto;
  min-width: 52px;
}

/* ---- Chips (desktop default) ---- */
.filter-chips {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2);
  flex: 1 1 0;
  min-width: 0; /* allow the chip row to shrink so label stays on the same line */
}

.filter-chip {
  display: inline-flex;
  align-items: center;
  padding: 8px 14px;
  border: 1px solid var(--border-strong);
  border-radius: 999px;
  background: transparent;
  color: var(--text-muted);
  font-family: var(--font-body);
  font-weight: 500;
  font-size: 0.82rem;
  letter-spacing: 0.02em;
  cursor: pointer;
  transition: color var(--dur-fast) var(--ease),
              border-color var(--dur-fast) var(--ease),
              background var(--dur-fast) var(--ease);
  white-space: nowrap;
}
.filter-chip:hover {
  color: var(--gold-bright);
  border-color: var(--gold);
}
.filter-chip.is-active {
  background: var(--gold);
  border-color: var(--gold);
  color: var(--bg);
  font-weight: 700;
}
:root[data-theme="light"] .filter-chip.is-active {
  color: #fff;
}
.filter-chip.filter-chip--zero-match {
  opacity: 0.38;
  cursor: not-allowed;
  filter: grayscale(0.35);
  box-shadow: none !important;
}
.filter-chip.filter-chip--zero-match:hover {
  border-color: var(--border);
  color: var(--text-faint);
}

/* ---- Independents chip ----
   "Independent" is conceptually the OPPOSITE of a brand, so it gets a
   distinct teal/jade treatment (never gold) and is pinned right after
   "All Brands". The colour persists whether or not it is selected so it
   always reads as "this is something different". */
.filter-chip--independent {
  border-color: var(--indie);
  color: var(--indie-text);
  background: var(--indie-bg);
  font-weight: 600;
}
.filter-chip--independent:hover {
  border-color: var(--indie-bright);
  color: var(--indie-bright);
}
.filter-chip--independent.is-active {
  background: var(--indie);
  border-color: var(--indie);
  color: #06231f;
  font-weight: 700;
}
:root[data-theme="light"] .filter-chip--independent.is-active {
  color: #fff;
}

/* ---- "View more" chip (City / Brand pagination) ----
   On big meta-regions (World, large continents) the City and Brand chip
   rows can run to 100+ entries. We page them 30 at a time; this button
   reveals the next batch and disappears once everything is shown. It is
   visually loud and distinct from both normal chips and the Independents
   chip so it reads as an ACTION, not a filter value. */
.filter-chip--more {
  border: 1px dashed var(--more-border);
  background: var(--more-bg);
  color: var(--more-text);
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  font-size: 0.72rem;
}
.filter-chip--more:hover {
  background: var(--more-bright);
  border-color: var(--more-bright);
  color: #06231f;
}
:root[data-theme="light"] .filter-chip--more:hover {
  color: #fff;
}

/* COUNTRY-FILTER-2026 (2026-06-08): the Country row gets its OWN "view more"
   chip in champagne gold so it reads as visually DISTINCT from the City row's
   blue "view more" chip (per user: "a different colored button"). Same dashed
   ACTION affordance + 20-at-a-time pagination behaviour; only the palette
   differs. Gold (#C9A86A / highlight #E2C98F / bronze #8A6E3C) is the project's
   signature accent — NOT canary/brassy yellow. Works in both themes. */
.filter-chip--more-country {
  border: 1px dashed rgba(201, 168, 106, 0.6);
  background: rgba(201, 168, 106, 0.12);
  color: #E2C98F;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  font-size: 0.72rem;
}
.filter-chip--more-country:hover {
  background: #E2C98F;
  border-color: #E2C98F;
  color: #3a2c12;
}
:root[data-theme="light"] .filter-chip--more-country {
  border-color: rgba(138, 110, 60, 0.55);
  background: rgba(201, 168, 106, 0.15);
  color: #8A6E3C;
}
:root[data-theme="light"] .filter-chip--more-country:hover {
  background: #8A6E3C;
  border-color: #8A6E3C;
  color: #fff;
}

/* FILTER-HEAT-2026: region-responsive proportional density heatmap for City,
   Country, Brand, Rewards, and Amenities chips. Tiers 1–5 — tier 5 = apex orange
   glow for true regional heavyweights (~6k atlas scale). Same pink→orange scale
   across rows; class prefix varies (.city-heat-N, .brand-heat-N, …).
   FILTER-HEAT-FLOOR-2026: city ≤6 / country ≤9 / brand ≤6 / rewards ≤3 / amenity ≤3 in-region → no heat
   class (normal chip styling); thresholds enforced in app.js cityHeatTier et al. */

/* Tier 1 — lightest band (~bottom quintile vs regional max). */
.filter-chip.city-heat-1:not(.is-active),
.filter-chip.country-heat-1:not(.is-active),
.filter-chip.brand-heat-1:not(.is-active),
.filter-chip.rewards-heat-1:not(.is-active),
.filter-chip.amenity-heat-1:not(.is-active) {
  background: rgba(236, 120, 160, 0.10);
  border-color: rgba(236, 120, 160, 0.34);
}
/* Tier 2 */
.filter-chip.city-heat-2:not(.is-active),
.filter-chip.country-heat-2:not(.is-active),
.filter-chip.brand-heat-2:not(.is-active),
.filter-chip.rewards-heat-2:not(.is-active),
.filter-chip.amenity-heat-2:not(.is-active) {
  background: rgba(236, 96, 150, 0.20);
  border-color: rgba(236, 96, 150, 0.55);
}
/* Tier 3 */
.filter-chip.city-heat-3:not(.is-active),
.filter-chip.country-heat-3:not(.is-active),
.filter-chip.brand-heat-3:not(.is-active),
.filter-chip.rewards-heat-3:not(.is-active),
.filter-chip.amenity-heat-3:not(.is-active) {
  background: rgba(233, 60, 110, 0.34);
  border-color: rgba(233, 60, 110, 0.78);
  color: #fff0f4;
  font-weight: 700;
}
/* Tier 4 — regional heavyweight */
.filter-chip.city-heat-4:not(.is-active),
.filter-chip.country-heat-4:not(.is-active),
.filter-chip.brand-heat-4:not(.is-active),
.filter-chip.rewards-heat-4:not(.is-active),
.filter-chip.amenity-heat-4:not(.is-active) {
  background: rgba(229, 45, 90, 0.42);
  border-color: #ff2d55;
  border-width: 2px;
  color: #ffffff;
  font-weight: 700;
  box-shadow: 0 0 0 1px rgba(255, 45, 85, 0.55), 0 0 10px rgba(255, 45, 85, 0.30);
}
/* Tier 5 — apex density: pink core + orange glow (heaviest in this view) */
.filter-chip.city-heat-5:not(.is-active),
.filter-chip.country-heat-5:not(.is-active),
.filter-chip.brand-heat-5:not(.is-active),
.filter-chip.rewards-heat-5:not(.is-active),
.filter-chip.amenity-heat-5:not(.is-active) {
  background: linear-gradient(135deg, rgba(255, 115, 45, 0.58) 0%, rgba(255, 45, 90, 0.52) 100%);
  border-color: #ff9a4d;
  border-width: 2px;
  color: #ffffff;
  font-weight: 700;
  box-shadow: 0 0 0 1px rgba(255, 154, 77, 0.65), 0 0 14px rgba(255, 120, 50, 0.48);
}
.filter-chip.city-heat-1:not(.is-active):hover,
.filter-chip.city-heat-2:not(.is-active):hover,
.filter-chip.city-heat-3:not(.is-active):hover,
.filter-chip.city-heat-4:not(.is-active):hover,
.filter-chip.city-heat-5:not(.is-active):hover,
.filter-chip.country-heat-1:not(.is-active):hover,
.filter-chip.country-heat-2:not(.is-active):hover,
.filter-chip.country-heat-3:not(.is-active):hover,
.filter-chip.country-heat-4:not(.is-active):hover,
.filter-chip.country-heat-5:not(.is-active):hover,
.filter-chip.brand-heat-1:not(.is-active):hover,
.filter-chip.brand-heat-2:not(.is-active):hover,
.filter-chip.brand-heat-3:not(.is-active):hover,
.filter-chip.brand-heat-4:not(.is-active):hover,
.filter-chip.brand-heat-5:not(.is-active):hover,
.filter-chip.rewards-heat-1:not(.is-active):hover,
.filter-chip.rewards-heat-2:not(.is-active):hover,
.filter-chip.rewards-heat-3:not(.is-active):hover,
.filter-chip.rewards-heat-4:not(.is-active):hover,
.filter-chip.rewards-heat-5:not(.is-active):hover,
.filter-chip.amenity-heat-1:not(.is-active):hover,
.filter-chip.amenity-heat-2:not(.is-active):hover,
.filter-chip.amenity-heat-3:not(.is-active):hover,
.filter-chip.amenity-heat-4:not(.is-active):hover,
.filter-chip.amenity-heat-5:not(.is-active):hover {
  color: #fff;
  border-color: #ff5e82;
}

:root[data-theme="light"] .filter-chip.city-heat-1:not(.is-active),
:root[data-theme="light"] .filter-chip.country-heat-1:not(.is-active),
:root[data-theme="light"] .filter-chip.brand-heat-1:not(.is-active),
:root[data-theme="light"] .filter-chip.rewards-heat-1:not(.is-active),
:root[data-theme="light"] .filter-chip.amenity-heat-1:not(.is-active) {
  background: rgba(214, 51, 108, 0.10);
  border-color: rgba(214, 51, 108, 0.40);
  color: #8a2e4d;
}
:root[data-theme="light"] .filter-chip.city-heat-2:not(.is-active),
:root[data-theme="light"] .filter-chip.country-heat-2:not(.is-active),
:root[data-theme="light"] .filter-chip.brand-heat-2:not(.is-active),
:root[data-theme="light"] .filter-chip.rewards-heat-2:not(.is-active),
:root[data-theme="light"] .filter-chip.amenity-heat-2:not(.is-active) {
  background: rgba(214, 51, 108, 0.20);
  border-color: rgba(214, 51, 108, 0.58);
  color: #7d1f3e;
}
:root[data-theme="light"] .filter-chip.city-heat-3:not(.is-active),
:root[data-theme="light"] .filter-chip.country-heat-3:not(.is-active),
:root[data-theme="light"] .filter-chip.brand-heat-3:not(.is-active),
:root[data-theme="light"] .filter-chip.rewards-heat-3:not(.is-active),
:root[data-theme="light"] .filter-chip.amenity-heat-3:not(.is-active) {
  background: rgba(206, 30, 84, 0.62);
  border-color: rgba(206, 30, 84, 0.9);
  color: #fff5f8;
  font-weight: 700;
}
:root[data-theme="light"] .filter-chip.city-heat-4:not(.is-active),
:root[data-theme="light"] .filter-chip.country-heat-4:not(.is-active),
:root[data-theme="light"] .filter-chip.brand-heat-4:not(.is-active),
:root[data-theme="light"] .filter-chip.rewards-heat-4:not(.is-active),
:root[data-theme="light"] .filter-chip.amenity-heat-4:not(.is-active) {
  background: rgba(206, 24, 78, 0.74);
  border-color: #d6002f;
  border-width: 2px;
  color: #ffffff;
  font-weight: 700;
  box-shadow: 0 0 0 1px rgba(214, 0, 47, 0.5), 0 0 10px rgba(214, 0, 47, 0.28);
}
:root[data-theme="light"] .filter-chip.city-heat-5:not(.is-active),
:root[data-theme="light"] .filter-chip.country-heat-5:not(.is-active),
:root[data-theme="light"] .filter-chip.brand-heat-5:not(.is-active),
:root[data-theme="light"] .filter-chip.rewards-heat-5:not(.is-active),
:root[data-theme="light"] .filter-chip.amenity-heat-5:not(.is-active) {
  background: linear-gradient(135deg, rgba(230, 95, 35, 0.82) 0%, rgba(206, 24, 78, 0.78) 100%);
  border-color: #e86a1a;
  border-width: 2px;
  color: #ffffff;
  font-weight: 700;
  box-shadow: 0 0 0 1px rgba(232, 106, 26, 0.55), 0 0 12px rgba(230, 95, 35, 0.38);
}

/* (Legacy duplicate country-heat block removed — unified above.) */

/* METRO-REGIONS-2026: metropolitan area chips — distinct slate-blue so they read
   as "the whole metro" rather than a single municipality or a density heat tier. */
.filter-chip.filter-chip--metro-region:not(.is-active) {
  background: rgba(72, 145, 220, 0.14);
  border-color: rgba(96, 168, 235, 0.62);
  border-style: dashed;
  color: #d4ebff;
  font-weight: 600;
  letter-spacing: 0.01em;
}
.filter-chip.filter-chip--metro-region:not(.is-active):hover {
  background: rgba(72, 145, 220, 0.24);
  border-color: rgba(130, 195, 255, 0.85);
  color: #eef6ff;
}
:root[data-theme="light"] .filter-chip.filter-chip--metro-region:not(.is-active) {
  background: rgba(36, 98, 168, 0.10);
  border-color: rgba(36, 98, 168, 0.55);
  color: #1e4a78;
}
:root[data-theme="light"] .filter-chip.filter-chip--metro-region:not(.is-active):hover {
  background: rgba(36, 98, 168, 0.18);
  border-color: rgba(36, 98, 168, 0.75);
  color: #123456;
}

/* ---- Select (mobile) ---- */
.filter-select-wrap {
  display: none;
  position: relative;
  flex: 1 1 auto;
  min-width: 0;
}
.filter-select {
  width: 100%;
  appearance: none;
  -webkit-appearance: none;
  padding: 10px 36px 10px 14px;
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-md);
  background: transparent;
  color: var(--text);
  font-family: var(--font-body);
  font-weight: 500;
  font-size: 0.9rem;
  letter-spacing: 0.02em;
  cursor: pointer;
  transition: border-color var(--dur-fast) var(--ease);
}
.filter-select:hover,
.filter-select:focus {
  border-color: var(--gold);
  outline: none;
}
.filter-select option {
  background: var(--bg-elevated);
  color: var(--text);
}
.filter-select-chev {
  position: absolute;
  right: 12px;
  top: 50%;
  transform: translateY(-50%);
  color: var(--gold);
  pointer-events: none;
  opacity: 0.8;
}

/* Sort row: always uses the select (no chips), at every width */
.filter-row--sort .filter-select-wrap--always {
  display: block;
  max-width: 320px;
}
.filter-row--sort .filter-select {
  padding-right: 36px;
}

/* Phase 12 — Freeform search input (hhatlas-style)                     */
/* Lives in its own .filter-row--search row with label "Search". The   */
/* input is always visible (unlike chips, which hide on mobile). Uses  */
/* a magnifying-glass icon on the left and an optional × clear button. */
.filter-row--search {
  /* Give the search its own full-width lane even when chip rows are */
  /* showing, so typing feels like a first-class action.             */
}
.filter-search-wrap {
  position: relative;
  flex: 1 1 auto;
  max-width: 420px;
  display: flex;
  align-items: center;
}
/* SEARCH-ICON-2026 (2026-06-07): the search box has no "Search" label, so the
   magnifying glass must be unmistakable. Enlarged in markup (14->20px) and here
   recoloured to a BRIGHT, high-contrast icon. On dark themes that's pure white;
   on light themes pure white would vanish on the pale --surface, so light themes
   use a strong near-black ink instead (still bright/prominent against the field).
   Slight glow on dark themes lifts it off the surface. */
.filter-search-icon {
  position: absolute;
  left: 12px;
  color: #ffffff;            /* bright white (dark themes) */
  opacity: 1;
  pointer-events: none;
}
:root[data-theme="light"] .filter-search-icon { color: #1d1d1d; }   /* near-black so it stays bright/visible on pale search field */
:root[data-theme="dark"]  .filter-search-icon { filter: drop-shadow(0 0 2px rgba(0,0,0,0.45)); }
.filter-search-input {
  flex: 1 1 auto;
  width: 100%;
  padding: 8px 34px 8px 42px;   /* SEARCH-ICON-2026: widened left pad 34->42px for the larger glass */
  font-family: var(--font-body);
  font-size: 0.85rem;
  color: var(--text);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-md, 6px);
  outline: none;
  transition: border-color 120ms ease, background 120ms ease;
  letter-spacing: 0.01em;
}
.filter-search-input::placeholder {
  color: var(--text-faint);
  opacity: 0.75;
  font-style: italic;
}
.filter-search-input:hover  { border-color: var(--border-strong, var(--border)); }
.filter-search-input:focus  { border-color: var(--gold); background: var(--surface-hover, var(--surface)); }
/* Strip the native webkit clear button — we render our own × button. */
.filter-search-input::-webkit-search-cancel-button { display: none; }
.filter-search-clear {
  position: absolute;
  right: 8px;
  width: 22px;
  height: 22px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 0;
  border-radius: 50%;
  color: var(--text-faint);
  font-size: 1.05rem;
  line-height: 1;
  cursor: pointer;
  transition: background 120ms ease, color 120ms ease;
}
.filter-search-clear:hover {
  background: var(--surface-hover, var(--border));
  color: var(--gold);
}
.filter-search-clear[hidden] { display: none; }

/* ---- Responsive: collapse to selects under 720px ---- */
@media (max-width: 720px) {
  .filter-bar-wrap {
    padding: 0 var(--space-4);
  }
  .filter-bar {
    padding: var(--space-3) var(--space-4);
    gap: var(--space-2);
  }
  .filter-chips { display: none; }
  .filter-select-wrap { display: block; }
  .filter-row { gap: var(--space-3); flex-wrap: nowrap; }
  .filter-label {
    min-width: 42px;
    font-size: 0.62rem;
    letter-spacing: 0.18em;
  }
  .filter-search-wrap { max-width: none; }
}

/* Phase 27c: keep the two weekend cells side-by-side on phone widths. The
   prior ≤480px override stacked them vertically (which created a large
   empty zone below the upcoming-weekend price). On a phone-width card,
   the body is ~340px wide — each cell still gets ~150px which is enough
   for the price + label + date range without truncation. */

/* =========================================================
   HERO STATS — hhatlas-style counter block
   ========================================================= */
.hero-stats {
  display: flex;
  align-items: flex-start;
  justify-content: center;
  gap: var(--space-6);
  margin: var(--space-5) auto var(--space-5);
  flex-wrap: nowrap;
}

.hero-stat {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  min-width: 0;
}

.hero-stat-num {
  font-family: var(--font-serif);
  font-weight: 500;
  /* STAT-FONT-BUMP-2026: a touch bigger per request (was 2.75rem). */
  font-size: 3.05rem;
  line-height: 1;
  color: var(--gold);
  letter-spacing: 0.01em;
  font-variant-numeric: lining-nums tabular-nums;
  transition: color var(--dur-fast) var(--ease);
}

.hero-stat-label {
  font-family: var(--font-display);
  font-weight: 700;
  /* STAT-FONT-BUMP-2026: was 0.68rem. */
  font-size: 0.74rem;
  letter-spacing: 0.25em;
  text-transform: uppercase;
  color: var(--text-muted);
}

.hero-stat-sub {
  font-family: var(--font-display);
  font-weight: 500;
  /* STAT-FONT-BUMP-2026: was 0.56rem. */
  font-size: 0.62rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--text-faint);
  margin-top: 2px;
}

.hero-stat-divider {
  width: 1px;
  align-self: stretch;
  background: var(--border-strong);
  margin-top: 6px;
  margin-bottom: 14px;
  opacity: 0.6;
}

/* "Zero" state — when no hotels in the filtered set, gray out numbers */
.hero-stat-num.is-zero { color: var(--text-faint); }

/* FILIGREE-MOVE-2026: the live counters (HOTELS | BRANDS | FROM $NN) were
   relocated out of the left masthead into this centered band that sits just
   above the (left-aligned) 'World · All Brands' results header, above the sort
   box. It is horizontally centered within the results container. */
.hero-stats--band {
  width: 100%;
  /* SCROLL-NUDGE-2026: tighten the space below the stats band (was
     margin-bottom clamp(1.25,3vw,2.25rem) / padding-bottom clamp(1,2.4vw,1.75rem))
     to pull the results header + first card row higher up the page. */
  margin: 0 auto clamp(0.9rem, 2vh, 1.6rem);
  padding-bottom: clamp(0.75rem, 1.6vh, 1.35rem);
  border-bottom: 1px solid var(--hairline);
  /* Optically centered 5-track grid: Hotels | Brands | Minimum share
     equal 1fr tracks; dividers sit in the auto tracks. */
  display: grid;
  grid-template-columns: 1fr auto 1fr auto 1fr;
  align-items: center;
  column-gap: clamp(var(--space-5), 3.5vw, var(--space-8));
}
/* Each of the three stats lives in its own 1fr track and is centered within
   it; the middle track (Brands) is pinned to the band's exact horizontal
   center. Dividers sit in the two narrow auto tracks between them. */
.hero-stats--band > .hero-stat:nth-child(1)  { grid-column: 1; justify-self: center; }
.hero-stats--band > .hero-stat-divider:nth-child(2) { grid-column: 2; }
.hero-stats--band > .hero-stat:nth-child(3)  { grid-column: 3; justify-self: center; }
.hero-stats--band > .hero-stat-divider:nth-child(4) { grid-column: 4; }
.hero-stats--band > .hero-stat--from         { grid-column: 5; justify-self: center; }

/* STAT-FROM-ALIGN-2026: third cell is identical to Hotels/Brands —
   big $num + "Minimum" label on the shared baseline. */

/* Mobile: preserve 3-column layout but scale down */
@media (max-width: 640px) {
  .hero-stats {
    gap: var(--space-4);
    margin: var(--space-4) auto var(--space-4);
  }
  .hero-stat-num { font-size: 2rem; }
  .hero-stat-label { font-size: 0.58rem; letter-spacing: 0.2em; }
  .hero-stat-sub { font-size: 0.5rem; letter-spacing: 0.18em; }
}

@media (max-width: 420px) {
  .hero-stats { gap: var(--space-3); }
  .hero-stat-num { font-size: 1.625rem; }
  .hero-stat-label { font-size: 0.54rem; letter-spacing: 0.16em; }
}

/* ============================================================
   CHEAPEST-5 HERO TEASER (hhatlas-style)
   ============================================================ */
.cheapest-teaser {
  margin: var(--space-6) auto 0;
  max-width: 640px;
  width: 100%;
  padding: var(--space-5) var(--space-5);
  border-top: 1px solid var(--hairline);
  border-bottom: 1px solid var(--hairline);
  text-align: left;
}

/* Phase 28d: on wide viewports, render the two leaderboards side-by-side
   instead of stacked. The flat HTML structure stays as-is — we use explicit
   grid placement to put list 1 in column 1, list 2 in column 3, and the
   existing hairline divider in column 2 (spanning both rows as a vertical
   rule). Below 880px we fall back to the original stacked flow. */
@media (min-width: 880px) {
  .cheapest-teaser {
    max-width: 1080px;
    display: grid;
    grid-template-columns: 1fr auto 1fr;
    grid-template-rows: auto;
    column-gap: var(--space-6);
    row-gap: 0;
    align-items: start;
  }
  .cheapest-teaser > .cheapest-teaser-section:nth-of-type(1) { grid-column: 1; grid-row: 1; }
  .cheapest-teaser > .cheapest-teaser-divider              { grid-column: 2; grid-row: 1; align-self: stretch; }
  .cheapest-teaser > .cheapest-teaser-section:nth-of-type(2) { grid-column: 3; grid-row: 1; }

  /* FILIGREE-MOVE-2026: inside the narrow hero rail the two lists must stay
     STACKED (01 over 02), per the owner. Override the side-by-side grid above
     only when the teaser sits in the rail; the horizontal divider becomes a
     full-width rule between the two stacked lists. */
  .hero-rail .cheapest-teaser {
    display: block;
    max-width: none;
  }
}

.cheapest-teaser-section {
  min-width: 0;
}

.cheapest-teaser-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-3);
  margin-bottom: var(--space-3);
  padding: 0.45rem 0 0.55rem;
  border-bottom: 1px solid color-mix(in srgb, var(--gold) 42%, transparent);
}

.cheapest-teaser-head:has(.cheapest-teaser-from[hidden]) {
  margin-bottom: 0.5rem;
}

/* Section titles — must read clearly above hotel names, not as list items. */
.cheapest-teaser-label {
  margin: 0;
  flex: 1 1 auto;
  min-width: 0;
}

.cheapest-teaser-title {
  display: block;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(0.92rem, 1.05vw, 1.12rem);
  letter-spacing: 0.04em;
  line-height: 1.28;
  color: var(--text);
  text-transform: none;
}

.cheapest-teaser-dates {
  display: block;
  margin: 0.28rem 0 0;
  font-family: var(--font-serif);
  font-style: italic;
  font-weight: 500;
  font-size: clamp(0.82rem, 0.95vw, 0.94rem);
  letter-spacing: 0.02em;
  text-transform: none;
  color: color-mix(in srgb, var(--gold) 78%, var(--text));
  white-space: pre;
}

.cheapest-teaser-from {
  font-family: var(--font-sans);
  font-weight: 600;
  font-size: 0.82rem;
  letter-spacing: 0.1em;
  color: var(--gold);
  text-transform: uppercase;
}

.cheapest-teaser-from.is-zero {
  color: var(--text-faint);
  letter-spacing: 0.18em;
}

.cheapest-teaser-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
}

.cheapest-teaser-item {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: baseline;
  gap: var(--space-3);
  padding: 9px 0;
  border-bottom: 1px dashed var(--hairline-soft, var(--hairline));
  cursor: default;
  background: none;
  border-left: none;
  border-right: none;
  border-top: none;
  width: 100%;
  text-align: left;
  color: var(--text);
  font-family: inherit;
  transition: background 0.15s ease, border-color 0.15s ease;
}

.cheapest-teaser-item:last-child {
  border-bottom: none;
}

.cheapest-teaser-item:hover {
  background: var(--surface-soft, rgba(255,255,255,0.03));
}

.cheapest-teaser-item:hover .cheapest-teaser-loc {
  color: var(--text);
  opacity: 1;
}

.cheapest-teaser-rank {
  /* Legacy — rank numerals removed from teaser rows; kept for any stale markup. */
  display: none;
}

.cheapest-teaser-namecell {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  row-gap: 0.1em;
  min-width: 0;
}

.cheapest-teaser-name {
  font-family: var(--font-sans);
  font-weight: 600;
  font-size: 1rem;
  color: var(--text);
  line-height: 1.28;
  flex: 0 1 auto;
  min-width: 0;
  max-width: 100%;
  align-self: flex-start;
  background: none;
  border: 0;
  padding: 0;
  margin: 0;
  cursor: pointer;
  text-align: left;
  -webkit-appearance: none;
  appearance: none;
}
.cheapest-teaser-name:hover,
.cheapest-teaser-name:focus-visible {
  color: var(--gold);
  text-decoration: underline;
  text-decoration-color: var(--gold);
  text-underline-offset: 3px;
  text-decoration-thickness: 1px;
}
.cheapest-teaser-name:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 2px;
  border-radius: 2px;
}

.cheapest-teaser-loc {
  font-family: var(--font-sans);
  font-weight: 400;
  font-size: 0.84rem;
  letter-spacing: 0.015em;
  color: var(--text-muted);
  line-height: 1.22;
  flex: 0 1 auto;
  min-width: 0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  opacity: 1;
}

/* CHEAPEST-PLACE-FILTER-2026: city/country look clickable like other
   filter-triggering place text (underline, pointer) — not the gold
   hotel-name link, so the two actions stay visually distinct. */
.cheapest-teaser-place {
  font: inherit;
  letter-spacing: inherit;
  color: inherit;
  background: none;
  border: 0;
  padding: 0;
  margin: 0;
  cursor: pointer;
  display: inline;
  -webkit-appearance: none;
  appearance: none;
  border-radius: 0;
  border-bottom: 1px solid color-mix(in srgb, currentColor 40%, transparent);
}
.cheapest-teaser-place:hover,
.cheapest-teaser-place:focus-visible,
.cheapest-teaser-place.is-active {
  color: var(--text);
  border-bottom-color: currentColor;
}
.cheapest-teaser-place:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 2px;
  border-radius: 2px;
}

.cheapest-teaser-loc::before {
  content: none;
}

.cheapest-teaser-price {
  font-family: var(--font-sans);
  font-weight: 700;
  font-size: 0.92rem;
  color: var(--text);
  letter-spacing: 0.02em;
  white-space: nowrap;
  flex-shrink: 0;
  padding-left: 0.25rem;
  cursor: default;
}

.cheapest-teaser-empty {
  padding: var(--space-4) 0;
  font-family: var(--font-sans);
  font-size: 0.82rem;
  color: var(--text-faint);
  letter-spacing: 0.08em;
  text-align: center;
  font-style: italic;
}

/* Phase 19.2: hybrid row used for future weekends only.
   The <li> is the grid container with 3 explicit columns AND a single
   row, so the rank/price button (display:contents) and the name link
   stay on one line. We pin each child to its column to defeat the
   auto-placement that would otherwise wrap when there are 3 grid items
   (rank, price, link) and only 2 children in the <li>. */
.cheapest-teaser-row {
  display: grid;
  grid-template-columns: 24px 1fr auto;
  grid-template-rows: auto;
  grid-auto-flow: column;
  align-items: baseline;
  gap: var(--space-3);
  padding: 10px 0;
  border-bottom: 1px dashed var(--hairline-soft, var(--hairline));
  list-style: none;
}
.cheapest-teaser-row:last-child {
  border-bottom: none;
}
.cheapest-teaser-row:hover {
  background: var(--surface-soft, rgba(255,255,255,0.03));
}

/* The split button has display:contents so its children become direct
   grid items of the <li>. Explicit column pins guarantee the order
   rank → link → price regardless of DOM order. */
.cheapest-teaser-item--split {
  display: contents;
  cursor: pointer;
}
.cheapest-teaser-row .cheapest-teaser-rank   { grid-column: 1; }
.cheapest-teaser-row .cheapest-teaser-name,
.cheapest-teaser-row .cheapest-teaser-name--link { grid-column: 2; min-width: 0; }
.cheapest-teaser-row .cheapest-teaser-price  { grid-column: 3; }

/* Focus ring for keyboard users — the button itself is invisible
   (display:contents), so we ring the rank+price cells instead. */
.cheapest-teaser-item--split:focus-visible ~ .cheapest-teaser-name--link,
.cheapest-teaser-item--split:focus .cheapest-teaser-rank,
.cheapest-teaser-item--split:focus .cheapest-teaser-price {
  outline: none;
}
.cheapest-teaser-item--split:focus-visible .cheapest-teaser-rank,
.cheapest-teaser-item--split:focus-visible .cheapest-teaser-price {
  outline: 2px solid var(--gold);
  outline-offset: 2px;
  border-radius: 2px;
}

.cheapest-teaser-name--link {
  text-decoration: none;
  color: var(--text);
  transition: color 0.15s ease;
  cursor: pointer;
  font-family: var(--font-sans);
  font-weight: 600;
  font-size: 1rem;
  line-height: 1.28;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.cheapest-teaser-name--link:hover,
.cheapest-teaser-name--link:focus-visible {
  color: var(--gold);
  text-decoration: underline;
  text-decoration-color: var(--gold);
  text-underline-offset: 3px;
  text-decoration-thickness: 1px;
  outline: none;
}

/* Mobile tweaks */
@media (max-width: 560px) {
  .cheapest-teaser {
    padding: var(--space-4) var(--space-4);
    margin-top: var(--space-5);
  }
  .cheapest-teaser-title { font-size: 0.8rem; letter-spacing: 0.06em; }
  .cheapest-teaser-dates  { font-size: 0.74rem; }
  .cheapest-teaser-from  { font-size: 0.64rem; }
  .cheapest-teaser-item  { grid-template-columns: minmax(0, 1fr) auto; gap: var(--space-2); }
  .cheapest-teaser-row   { grid-template-columns: minmax(0, 1fr) auto; gap: var(--space-2); }
  .cheapest-teaser-name  { font-size: 0.92rem; }
  .cheapest-teaser-loc   { font-size: 0.78rem; max-width: 100%; white-space: normal; }
  .cheapest-teaser-price { font-size: 0.86rem; }
}

/* ------------------------------------------------------------
   Upcoming Weekend · Live Rate block (modal)
   ------------------------------------------------------------ */

/* ------------------------------------------------------------
   Dual-column weekend row (Phase 16 redesign)
   ------------------------------------------------------------
   The modal now presents Upcoming and Following weekends as two
   side-by-side columns (mirroring the card's two-column price row).
   Each column is self-contained: header + role/dates, optional
   confidence badge, big price, specific room name, typical range,
   native-currency line, the compressed 5-segment price meter, and
   the Checked + Open-Listing footer. */

.modal-weekend-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0;
  border: 1px solid var(--border);
  border-radius: 4px;
  background: linear-gradient(180deg, rgba(198, 166, 100, 0.04) 0%, var(--surface) 100%);
  overflow: hidden;
}

.modal-weekend-col {
  padding: var(--space-5) var(--space-5) var(--space-4);
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  min-width: 0; /* allow children to shrink/wrap inside grid column */
}

/* Vertical divider between the two columns (only desktop). */
.modal-weekend-col + .modal-weekend-col {
  border-left: 1px solid var(--border);
}

.modal-weekend-col--past { opacity: 0.88; }

/* Phase 39: triple-column layout when the always-visible NEXT MONTH (T-42)
   card is present. The existing `.modal-weekend-col + .modal-weekend-col`
   divider rule already draws a left border on the 2nd and 3rd columns, so
   we only need to switch the grid to three equal tracks. Stacks vertically
   on narrow viewports (see the max-width block below) so three columns never
   crush on a phone. */
.modal-weekend-row--triple {
  grid-template-columns: 1fr 1fr 1fr;
  align-items: stretch;
}

/* Triple-column price row: tight vertical rhythm; prices align via shared
   structure without reserved empty slots above the dollar amounts. */
.modal-weekend-row--triple .modal-weekend-col {
  padding: var(--space-3) var(--space-4) var(--space-3);
  gap: var(--space-1);
}
.modal-weekend-row--triple .modal-weekend-preprice {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.modal-weekend-preprice:empty {
  display: none;
}
.modal-weekend-price-hero {
  flex: 0 0 auto;
}
.modal-weekend-row--triple .modal-weekend-price-hero {
  margin-top: var(--space-1);
}
.modal-weekend-row--triple .modal-weekend-price {
  margin-top: 0;
}
.modal-weekend-row--triple .modal-price-footer {
  padding-top: var(--space-2);
  margin-top: var(--space-1);
}

/* Modal-only: multi-source rate comparison (Booking / Expedia / direct, etc.) */
.modal-checked-rates {
  margin-top: var(--space-4);
  padding-top: var(--space-4);
  border-top: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}
.modal-checked-rates-head {
  font-family: var(--font-display);
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--text-muted);
}
.modal-checked-rates-lede {
  font-family: var(--font-body);
  font-size: 0.84rem;
  color: var(--text-muted);
  line-height: 1.45;
  margin: 0;
}
.modal-checked-rates-block {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}
.modal-checked-rates-subhead {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 8px 12px;
}
.modal-checked-rates-role {
  font-family: var(--font-serif);
  font-weight: 600;
  font-size: 0.92rem;
  color: var(--text);
}
.modal-checked-rates-dates {
  font-family: var(--font-body);
  font-size: 0.8rem;
  color: var(--text-muted);
}
.modal-src-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.modal-src-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 10px 12px;
  border-radius: var(--radius-sm, 8px);
  border: 1px solid color-mix(in srgb, var(--border) 85%, var(--gold) 15%);
  background: color-mix(in srgb, var(--surface) 96%, var(--gold) 4%);
}
[data-theme="dark"] .modal-src-row {
  background: color-mix(in srgb, var(--card-navy) 92%, var(--gold) 8%);
  border-color: color-mix(in srgb, var(--card-line) 80%, var(--gold) 10%);
}
.modal-src-row--best {
  border-color: color-mix(in srgb, var(--gold) 55%, var(--border));
  background: color-mix(in srgb, var(--gold) 12%, var(--surface));
  box-shadow: 0 1px 0 color-mix(in srgb, var(--gold) 25%, transparent) inset;
}
[data-theme="dark"] .modal-src-row--best {
  background: color-mix(in srgb, var(--gold) 16%, var(--card-navy));
}
.modal-src-main {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px 10px;
  min-width: 0;
  flex: 1 1 auto;
}
.modal-src-logo {
  width: 22px;
  height: 22px;
  object-fit: contain;
  border-radius: 4px;
  flex: 0 0 auto;
}
.modal-src-name {
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 0.88rem;
  color: var(--text);
}
.modal-src-badges {
  display: inline-flex;
  flex-wrap: wrap;
  gap: 4px;
}
.modal-src-badge {
  font-family: var(--font-display);
  font-size: 0.52rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  padding: 2px 6px;
  border-radius: 999px;
  border: 1px solid transparent;
}
.modal-src-badge--best {
  color: var(--gold-bright, var(--gold));
  border-color: color-mix(in srgb, var(--gold) 45%, transparent);
  background: color-mix(in srgb, var(--gold) 14%, transparent);
}
.modal-src-badge--direct {
  color: var(--text-muted);
  border-color: color-mix(in srgb, var(--border) 70%, var(--gold) 20%);
}
.modal-src-badge--refund {
  color: var(--text-muted);
  border-color: color-mix(in srgb, var(--border) 60%, transparent);
}
.modal-src-right {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 2px;
  flex: 0 0 auto;
}
.modal-src-price {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 1rem;
  color: var(--text);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.modal-src-unit {
  font-size: 0.72rem;
  font-weight: 500;
  color: var(--text-muted);
  margin-left: 2px;
}
.modal-src-before-tax {
  display: block;
  font-size: 0.72rem;
  color: var(--text-muted);
}
.modal-src-book {
  font-family: var(--font-display);
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--gold);
  text-decoration: none;
}
.modal-src-book:hover { text-decoration: underline; }
.modal-checked-rates-more {
  margin-top: var(--space-1);
}
.modal-checked-rates-more-summary {
  font-family: var(--font-body);
  font-size: 0.82rem;
  color: var(--gold);
  cursor: pointer;
  list-style: none;
}
.modal-checked-rates-more-summary::-webkit-details-marker { display: none; }
.modal-checked-rates-more-body {
  margin-top: var(--space-2);
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

.modal-weekend-head {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.modal-weekend-role {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.72rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--gold);
  display: flex;
  align-items: center;
  gap: 10px;
}
.modal-weekend-role::before {
  content: "";
  display: inline-block;
  width: 20px; height: 1px;
  background: var(--gold);
  flex: 0 0 auto;
}

.modal-weekend-dates {
  font-family: var(--font-body);
  font-size: 0.85rem;
  color: var(--text-muted);
  letter-spacing: 0.01em;
}

.modal-weekend-badge-row {
  /* Slot for the VERIFIED RATE / Past-weekend chip. When empty, it
     collapses to zero height so the header spacing stays tight. */
  display: flex;
  align-items: center;
  min-height: 0;
}
.modal-weekend-badge-row:empty { display: none; }

.modal-weekend-price {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 2rem;
  color: var(--gold);
  line-height: 1;
  letter-spacing: -0.01em;
  margin-top: 2px;
}
.modal-weekend-price-unit {
  font-size: 0.9rem;
  font-weight: 500;
  color: var(--text-muted);
  letter-spacing: 0.02em;
}
.modal-weekend-price--untrusted {
  color: var(--text-faint);
  opacity: 0.72;
  text-shadow: none;
}
.modal-price-trust-banner {
  display: block;
  width: 100%;
  box-sizing: border-box;
  margin: 0.35rem 0 0.15rem;
  padding: 0.38rem 0.55rem;
  font-family: var(--font-body);
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  line-height: 1.25;
  text-align: center;
  text-transform: uppercase;
  color: #fff;
  background: #c0392b;
  border: 1px solid #922b21;
  border-radius: 2px;
}
:root[data-theme="light"] .modal-price-trust-banner {
  background: #b03020;
  border-color: #862415;
}

.modal-weekend-room {
  font-family: var(--font-body);
  font-size: 0.85rem;
  color: var(--text-muted);
  line-height: 1.35;
  margin-top: 2px;
}

.modal-weekend-room--spike {
  color: var(--text-secondary, var(--text-muted));
  font-style: italic;
}

/* Maps-shaped (non-itinerary) prices: disclosed as indicative on cards (~) and in the modal. */
.modal-weekend-indicative { font-style: italic; }
.modal-hist-source-note { margin-top: 0.6rem; font-size: 0.78rem; color: var(--text-muted); }
.card-price-approx {
  font-weight: 500;
  color: var(--text-muted);
  margin-right: 0.08em;
}

.card-price-spike-context {
  margin-top: 4px;
  font-family: var(--font-body);
  font-size: 0.68rem;
  line-height: 1.3;
  color: var(--text-muted);
  font-style: italic;
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}

/* Phase 46 (pricing hardening review, fix #8): lead-time note when the
   card's headline price came from a later-horizon bucket (following/next
   month) or a sibling-slot fill rather than this weekend's own capture. */
.card-price-lead-note {
  margin-top: 4px;
  font-family: var(--font-body);
  font-size: 0.68rem;
  line-height: 1.3;
  color: var(--text-muted);
  font-style: italic;
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Phase 18.1: staleness banner for fallback rates. */
.modal-weekend-stale {
  display: inline-block;
  margin: 4px 0 8px 0;
  padding: 3px 8px;
  border-radius: 4px;
  font-family: var(--font-display);
  font-size: 0.65rem;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: #b06a00;
  background: rgba(255, 184, 77, 0.12);
  border: 1px solid rgba(255, 184, 77, 0.35);
}
.modal-weekend-col--stale .modal-weekend-price { opacity: 0.92; }

/* History-fallback note when following weekend has no public bookable rate
   yet and we show the latest listed weekend instead. */
.modal-weekend-stale--hist {
  color: var(--text-muted);
  background: color-mix(in srgb, var(--text-muted) 8%, transparent);
  border-color: var(--border);
}
.modal-weekend-col--hist .modal-weekend-price { opacity: 0.94; }

/* Phase 41: the >20% price-swing flag chip, now INSIDE the modal weekend
   column (it used to live only on the grid card). Bright so a big swing leaps
   off the modal, mirroring the card's --wow-better / --wow-worse vocabulary. */
.modal-weekend-flag {
  /* WEEKEND-FLAG-FITCONTENT-2026: in the flex column the pill was blockified to
     display:flex and stretched to the full column width, leaving a large dead
     gap at the rounded right end on shorter labels (e.g. "44% cheaper") while
     longer labels nearly filled it — making the two pills look unbalanced.
     align-self:flex-start lets the pill shrink to its content so BOTH variants
     hug their text with symmetric 9px padding, left-aligned under the price. */
  display: inline-flex; align-items: center; justify-content: center; gap: 4px;
  align-self: flex-start;
  max-width: 100%;
  margin: 2px 0 8px 0;
  padding: 3px 9px;
  border-radius: 999px;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.62rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  border: 1px solid currentColor;
  background: transparent;
  line-height: 1;
}
.modal-weekend-flag__arrow { font-size: 0.8rem; line-height: 1; }
.modal-weekend-flag--better { color: #1f9d57; }
.modal-weekend-flag--worse  { color: #d23b3b; }
:root[data-theme="dark"] .modal-weekend-flag--better,
body[data-theme="dark"] .modal-weekend-flag--better { color: #3ddc7e; }
:root[data-theme="dark"] .modal-weekend-flag--worse,
body[data-theme="dark"] .modal-weekend-flag--worse { color: #ff5252; }

.modal-weekend-typical {
  font-family: var(--font-body);
  font-size: 0.8rem;
  color: var(--text-muted);
  line-height: 1.4;
}

.modal-weekend-link {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.68rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--gold);
  text-decoration: none;
  border-bottom: 1px solid var(--gold);
  padding-bottom: 2px;
  transition: opacity 0.2s ease;
}
.modal-weekend-link:hover { opacity: 0.8; }

.modal-weekend-pending {
  padding: var(--space-3) 0 var(--space-2);
  text-align: left;
}

.modal-weekend-pending-title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.72rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--text-faint);
  margin-bottom: 6px;
}

.modal-weekend-pending-sub {
  font-family: var(--font-body);
  font-size: 0.82rem;
  color: var(--text-muted);
  line-height: 1.5;
}

/* Phone portrait: keep the two weekend columns side-by-side (mirrors the
   PC layout). Compress padding + price font so the row still fits on a
   narrow screen. The previous stacked-row layout used too much vertical
   space and pushed the next hotel below the fold. */
@media (max-width: 560px) {
  /* Phase 39: stack the triple layout on phones — three columns are too
     tight below ~560px. Each card becomes a full-width row, divided by a
     top border instead of the vertical rule. */
  .modal-weekend-row--triple {
    grid-template-columns: 1fr;
  }
  .modal-weekend-row--triple .modal-weekend-col + .modal-weekend-col {
    border-left: none;
    border-top: 1px solid var(--border);
  }
  .modal-weekend-col {
    padding: var(--space-3) var(--space-3) var(--space-3);
    gap: var(--space-2);
  }
  .modal-weekend-price { font-size: 1.35rem; }
  .modal-weekend-price-unit { font-size: 0.7rem; }
  .modal-weekend-role { font-size: 0.62rem; letter-spacing: 0.14em; }
  .modal-weekend-dates { font-size: 0.78rem; }
  .modal-weekend-room { font-size: 0.78rem; }
  .modal-weekend-typical { font-size: 0.72rem; }
  .modal-weekend-stale { font-size: 0.58rem; padding: 2px 6px; margin: 2px 0 4px; }
  .modal-weekend-link { font-size: 0.62rem; letter-spacing: 0.12em; }
}

/* ------------------------------------------------------------
   Confidence badge + section label row
   ------------------------------------------------------------ */

.modal-section-label-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--space-3);
  margin-bottom: var(--space-3);
  flex-wrap: wrap;
}
.modal-section-label-row .modal-section-label {
  margin-bottom: 0;
}

.modal-conf {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 0.62rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  padding: 5px 10px;
  border-radius: 999px;
  border: 1px solid currentColor;
  cursor: help;
  white-space: nowrap;
}
.modal-conf--verified {
  color: #6fb888;
  background: rgba(111, 184, 136, 0.08);
}
.modal-conf--matched {
  color: var(--gold);
  background: rgba(198, 166, 100, 0.1);
}
.modal-conf--approx {
  color: var(--text-muted);
  background: var(--surface-soft, rgba(255,255,255,0.04));
  border-style: dashed;
}

/* ------------------------------------------------------------
   Typical rate + Native currency lines (inside modal-weekend-meta)
   ------------------------------------------------------------ */

.modal-native {
  display: grid;
  grid-template-columns: 70px 1fr;
  gap: var(--space-3);
  align-items: baseline;
}
.modal-native strong {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.66rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--text-faint);
}
.modal-native-rate {
  color: var(--text-muted);
  font-size: 0.78rem;
  margin-left: 4px;
}

/* ------------------------------------------------------------
   Price meter (5-segment "relative to typical" indicator)
   ------------------------------------------------------------ */

.price-meter {
  margin-top: var(--space-4);
  padding-top: var(--space-4);
  border-top: 1px dashed var(--border);
}

.price-meter-label {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  margin-bottom: 10px;
  gap: var(--space-3);
  flex-wrap: wrap;
}
.price-meter-label-main {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.84rem;
  letter-spacing: 0.06em;
  color: var(--text);
}
.price-meter-label-sub {
  font-family: var(--font-body);
  font-size: 0.74rem;
  color: var(--text-muted);
  letter-spacing: 0.04em;
}

.price-meter-track {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 4px;
  margin-bottom: 6px;
}
.price-meter-seg {
  height: 6px;
  border-radius: 2px;
  background: var(--surface-soft, rgba(255,255,255,0.06));
  border: 1px solid var(--border);
  transition: all 0.2s ease;
}
.price-meter-seg.is-filled {
  background: var(--text-faint);
  border-color: transparent;
  opacity: 0.45;
}
.price-meter-seg.is-active {
  border-color: transparent;
  transform: scaleY(1.4);
  transform-origin: center;
}

.price-meter-scale {
  display: flex;
  justify-content: space-between;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 0.6rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--text-faint);
}

/* Tone-specific colors for the active segment + label sub */
.price-meter--deal-strong .price-meter-seg.is-active { background: #6fb888; }
.price-meter--deal-strong .price-meter-label-main { color: #6fb888; }

.price-meter--deal .price-meter-seg.is-active { background: #a8cc9c; }
.price-meter--deal .price-meter-label-main { color: #a8cc9c; }

.price-meter--neutral .price-meter-seg.is-active { background: var(--gold); }
.price-meter--neutral .price-meter-label-main { color: var(--gold); }

.price-meter--premium .price-meter-seg.is-active { background: #d89c6a; }
.price-meter--premium .price-meter-label-main { color: #d89c6a; }

.price-meter--premium-strong .price-meter-seg.is-active { background: #c86a5a; }
.price-meter--premium-strong .price-meter-label-main { color: #c86a5a; }

@media (max-width: 560px) {
  .price-meter-label-main { font-size: 0.78rem; }
  .price-meter-label-sub  { font-size: 0.68rem; }
  .price-meter-scale      { font-size: 0.54rem; letter-spacing: 0.14em; }
}

/* ──────────────────────────────────────────────────────────────────── */
/* Phase 4 — Price-first card + FX meter                                */
/* ──────────────────────────────────────────────────────────────────── */

/* "Upcoming weekend stay" card price — USD gets pride of place,        */
/* native currency is the small italic footnote underneath.            */
.card-price-unit {
  font-family: var(--font-body);
  font-weight: 500;
  font-size: 0.72rem;
  color: var(--text-muted);
  letter-spacing: 0.01em;
  margin-left: 0.25rem;
}
.card-price-native {
  font-family: var(--font-body);
  font-size: 0.78rem;
  font-style: italic;
  color: var(--gold-muted, var(--text-muted));
  margin-top: 0.1rem;
  letter-spacing: 0.01em;
}
.card-price--pending {
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--text-muted);
  letter-spacing: 0.02em;
  font-style: italic;
}
.card-price-native--pending {
  font-size: 0.7rem;
  color: var(--text-faint);
  font-style: normal;
  letter-spacing: 0.02em;
}

/* --- Phase 18.2: pricing_quirk card pill ----------------------------- *
 * Properties that genuinely do not publish nightly rates (safari camps,  *
 * all-inclusive resorts, seasonal closures, urban inquiry-only). Show a  *
 * neutral, slightly muted label — not red/error, not gold/positive.     */
.card-price--quirk {
  font-size: 0.82rem;
  font-weight: 600;
  color: var(--gold-muted, var(--text-muted));
  letter-spacing: 0.04em;
  text-transform: uppercase;
  font-family: var(--font-body);
  padding: 0.18rem 0.55rem;
  border: 1px solid rgba(196, 168, 110, 0.45);
  border-radius: 4px;
  display: inline-block;
  background: rgba(196, 168, 110, 0.06);
  white-space: nowrap;
}
.modal-weekend-col--quirk {
  background: rgba(196, 168, 110, 0.04);
}
.modal-weekend-pending-title--quirk {
  color: var(--gold-muted, var(--text-muted));
  letter-spacing: 0.03em;
}

/* FX meter reuses all .price-meter-* classes; only need separation     */
/* from the price meter so the two stack cleanly in the modal.         */
.fx-meter {
  margin-top: var(--space-2);
}

/* Modal section dedicated to the (newly promoted) price block — gives  */
/* it a touch more breathing room now that it sits above History.      */
.modal-section--price {
  margin-top: var(--space-2);
}

/* ============================================================
 * Phase 7 — Coming Soon (pipeline properties)
 * Used for announced-but-not-yet-open hotels like Park Hyatt Sapporo,
 * Six Senses Myoko. Shown on the card and inside the modal.
 * ============================================================ */

/* ============================================================================
   Phase 48 — Photo ribbons (awards left; opened / renovated / brand-change right)
   ============================================================================ */

/* Base ribbon — left-anchored (awards) */
.card-status-bar {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 4;                           /* Above photo, below any focus ring */
  width: max-content;
  max-width: calc(100% - 2px);
  padding: 5px 34px 5px 10px;
  /* Notch sits in right padding — 92% keeps the year out of the diagonal cut. */
  clip-path: polygon(0% 0%, 100% 0%, 92% 50%, 100% 100%, 0% 100%);
  box-sizing: border-box;

  /* OS fonts: Satoshi/Cabinet omit some ribbon glyphs (é, en-dash) at small sizes. */
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  font-size: 0.63rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  color: #fff;
  white-space: nowrap;
  text-shadow: 0 1px 3px rgba(0,0,0,0.55);

  /* Drop shadow gives separation from busy photos */
  filter: drop-shadow(0 2px 6px rgba(0,0,0,0.45));
  pointer-events: none;           /* Ribbon is decorative — card button still handles clicks */
}

/* Right-anchored lifecycle ribbons — mirrored notch (8% = mirror of left 92%) */
.card-status-bar--right {
  left: auto;
  right: 0;
  padding: 5px 10px 5px 34px;
  clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%, 8% 50%);
  max-width: calc(100% - 4px);
}

/* ----- Colour modifiers ----- */

/* OPENED → fresh green (hotel just opened) */
.card-status-bar--opened {
  background: #1a8c4e;
}
:root[data-theme="light"] .card-status-bar--opened {
  background: #177a43;
}

/* AWARDED (generic fallback) → warm antique gold */
.card-status-bar--awarded {
  background: linear-gradient(135deg, #8a6218 0%, #c49a2e 55%, #a67c1a 100%);
}
:root[data-theme="light"] .card-status-bar--awarded {
  background: linear-gradient(135deg, #7a5614 0%, #b08828 55%, #946818 100%);
}

/* Forbes → lavender (distinct from CNT champagne gold; matches news-mode forbes badge) */
.card-status-bar--forbes {
  background: linear-gradient(135deg, #4a3580 0%, #7a5cc6 52%, #9470d8 100%);
}
:root[data-theme="light"] .card-status-bar--forbes {
  background: linear-gradient(135deg, #3d2b6e 0%, #6a4cb0 50%, #805ec4 100%);
}

/* Leading Hotels of the World → deep burgundy (membership vetting ribbon) */
.card-status-bar--lhw {
  background: linear-gradient(135deg, #4a1528 0%, #7a2840 52%, #5c1c30 100%);
}
:root[data-theme="light"] .card-status-bar--lhw {
  background: linear-gradient(135deg, #3d1020 0%, #6a2238 50%, #501828 100%);
}

/* Condé Nast Gold List → editorial champagne gold (lighter/warmer than Forbes antique) */
.card-status-bar--cnt {
  background: linear-gradient(135deg, #8a7028 0%, #c8a84b 55%, #b09238 100%);
}
:root[data-theme="light"] .card-status-bar--cnt {
  background: linear-gradient(135deg, #7a6020 0%, #b89840 55%, #9a8230 100%);
}

/* World's 50 Best → emerald (matches .award-chip--w50) */
.card-status-bar--w50 {
  background: linear-gradient(135deg, #0a5c44 0%, #16a374 52%, #0f7a5a 100%);
}
:root[data-theme="light"] .card-status-bar--w50 {
  background: linear-gradient(135deg, #084a38 0%, #128f68 50%, #0c664c 100%);
}

/* Travel + Leisure → electric blue (matches .award-chip--tl) */
.card-status-bar--tl {
  background: linear-gradient(135deg, #0f4a8a 0%, #2279d4 52%, #1565b8 100%);
}
:root[data-theme="light"] .card-status-bar--tl {
  background: linear-gradient(135deg, #0c3d72 0%, #1c6bc0 50%, #1256a0 100%);
}

/* AHEAD Hotel of the Year → bronze/copper */
.card-status-bar--ahead {
  background: linear-gradient(135deg, #7a4a18 0%, #c9854a 55%, #a8642a 100%);
}
:root[data-theme="light"] .card-status-bar--ahead {
  background: linear-gradient(135deg, #6a4014 0%, #b07440 55%, #985824 100%);
}

/* MICHELIN Keys → deep burgundy (matches .award-chip--mk* in modal) */
.card-status-bar--michelin {
  background: linear-gradient(135deg, #5a0e22 0%, #8b1530 48%, #c41e3a 100%);
}
:root[data-theme="light"] .card-status-bar--michelin {
  background: linear-gradient(135deg, #4a0b1c 0%, #7a1228 50%, #a81832 100%);
}

/* AAA Diamonds → navy (matches .award-chip--aaa in modal) */
.card-status-bar--aaa {
  background: linear-gradient(135deg, #152a66 0%, #1f3a8a 55%, #2b4eb8 100%);
}
:root[data-theme="light"] .card-status-bar--aaa {
  background: linear-gradient(135deg, #0f204f 0%, #1a3278 55%, #2444a0 100%);
}

/* Stacked award ribbons (up to 3, top-left) */
.card-award-ribbons {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 4;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 1px;
  max-width: calc(100% - 4px);
  pointer-events: none;
}
.card-award-ribbons .card-status-bar {
  position: relative;
  top: auto;
  left: auto;
  font-size: 0.58rem;
  padding: 4px 28px 4px 8px;
  letter-spacing: 0.05em;
}
.card-award-ribbons:not(:has(.card-status-bar:nth-child(2))) .card-status-bar {
  font-size: 0.63rem;
  padding: 5px 34px 5px 10px;
  letter-spacing: 0.06em;
}

/* Palace Distinction (France) → royal blue */
.card-status-bar--palace {
  background: linear-gradient(135deg, #1a3060 0%, #2d4a8a 52%, #c9a227 115%);
}
:root[data-theme="light"] .card-status-bar--palace {
  background: linear-gradient(135deg, #142850 0%, #243e78 50%, #b08828 115%);
}

/* Robb Report Best of the Best → charcoal / platinum */
.card-status-bar--robb {
  background: linear-gradient(135deg, #2a2a2a 0%, #4a4a4a 55%, #7a7a7a 100%);
}
:root[data-theme="light"] .card-status-bar--robb {
  background: linear-gradient(135deg, #1e1e1e 0%, #3a3a3a 55%, #5c5c5c 100%);
}

/* Virtuoso Best of the Best → deep teal */
.card-status-bar--virtuoso {
  background: linear-gradient(135deg, #004854 0%, #006d77 52%, #008891 100%);
}
:root[data-theme="light"] .card-status-bar--virtuoso {
  background: linear-gradient(135deg, #003840 0%, #005f68 50%, #007880 100%);
}

/* CNT Hot List → editorial coral (distinct from Gold List champagne) */
.card-status-bar--cnt-hotlist {
  background: linear-gradient(135deg, #8a3828 0%, #c85848 55%, #a84838 100%);
}
:root[data-theme="light"] .card-status-bar--cnt-hotlist {
  background: linear-gradient(135deg, #7a3020 0%, #b05040 55%, #984030 100%);
}

/* The AA Five Red Stars → AA yellow on dark */
.card-status-bar--aa {
  background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 40%, #f5c400 115%);
  color: #fff;
}
:root[data-theme="light"] .card-status-bar--aa {
  background: linear-gradient(135deg, #141414 0%, #222 45%, #e0b000 115%);
}

/* T+L It List → bright cyan (lighter than World's Best blue) */
.card-status-bar--tl-itlist {
  background: linear-gradient(135deg, #0878a0 0%, #22a8c8 52%, #4ec8e0 100%);
}
:root[data-theme="light"] .card-status-bar--tl-itlist {
  background: linear-gradient(135deg, #066888 0%, #1a98b8 50%, #38b8d0 100%);
}

/* Andrew Harper Grand Award → forest green */
.card-status-bar--harper {
  background: linear-gradient(135deg, #1e3a18 0%, #3a6a2a 55%, #4a8a38 100%);
}
:root[data-theme="light"] .card-status-bar--harper {
  background: linear-gradient(135deg, #183014 0%, #325a24 55%, #427830 100%);
}

/* World Travel Awards → gala ruby red */
.card-status-bar--wta {
  background: linear-gradient(135deg, #5a1020 0%, #8a1828 52%, #b82840 100%);
}
:root[data-theme="light"] .card-status-bar--wta {
  background: linear-gradient(135deg, #4a0c18 0%, #781420 50%, #a02034 100%);
}

/* RENOVATED → teal/blue (reserved — not yet shown; ready when renovation_year field is added) */
.card-status-bar--renovated {
  background: #1b7fa0;
}
:root[data-theme="light"] .card-status-bar--renovated {
  background: #15698a;
}

/* SWITCHED BRAND → amber/gold */
.card-status-bar--switched {
  background: #b07b1a;
}
:root[data-theme="light"] .card-status-bar--switched {
  background: #9a6c14;
}

/* LEFT BRAND → slate / neutral-strong */
.card-status-bar--left {
  background: #4a5569;
}
:root[data-theme="light"] .card-status-bar--left {
  background: #3b4560;
}

/* ---- Card: Coming Soon variant ---- */

/* Subtle left border and muted accent, not flashy — these belong in
   the same grid as live hotels, just clearly labeled. */
.card--coming-soon {
  position: relative;
}
.card--coming-soon::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  pointer-events: none;
  background: linear-gradient(
    135deg,
    rgba(198, 156, 82, 0.04) 0%,
    rgba(198, 156, 82, 0) 60%
  );
}
.card-coming-soon {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin-top: 4px;
}
.card-coming-soon__pill {
  display: inline-flex;
  align-items: center;
  padding: 3px 10px;
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--gold);
  background: color-mix(in srgb, var(--gold) 12%, transparent);
  border: 1px solid color-mix(in srgb, var(--gold) 40%, transparent);
  border-radius: 999px;
  white-space: nowrap;
}
.card-coming-soon__year {
  font-size: 0.78rem;
  font-weight: 500;
  color: var(--text-muted);
  letter-spacing: 0.01em;
}

/* Option B — pipeline (coming soon) card treatment */
.card--pipeline {
  border-color: color-mix(in srgb, var(--gold) 42%, var(--border));
}
.card--pipeline:hover {
  border-color: var(--gold);
  transform: translateY(-3px);
  box-shadow: var(--shadow-lg);
}
/* dimmed, still-aspirational hero */
.card-art--pipeline { position: relative; }
.card-art--pipeline.card-art--placeholder::after { opacity: 0.55; }
/* COMING-SOON-CENTER-2026: the badge is centered dead-center inside the empty
   placeholder photo box (was a bottom-left pinned banner). */
.card-pipeline-banner {
  position: absolute;
  inset: 0;
  z-index: 3;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 12px;
  text-align: center;
  pointer-events: none;
}
.card-pipeline-banner__row {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}
.card-pipeline-banner__dot {
  flex: 0 0 auto;
  width: 7px; height: 7px;
  border-radius: 50%;
  background: var(--gold);
  box-shadow: 0 0 8px var(--gold);
}
.card-pipeline-banner__label {
  font-family: var(--font-display);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--gold);
  /* Longer "Hotel In Development" may wrap on narrow cards; keep centered. */
  white-space: normal;
  max-width: 14em;
  line-height: 1.35;
}
.card-pipeline-banner__year {
  font-family: var(--font-display);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--gold);
  white-space: nowrap;
}
.card-pipeline-source {
  display: inline-block;
  margin-top: 6px;
  font-size: 0.74rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  color: var(--gold);
  white-space: nowrap;
}

/* ---- Modal: Coming Soon section ---- */

.modal-coming-soon {
  display: flex;
  gap: var(--space-3);
  padding: var(--space-3) var(--space-4);
  background: color-mix(in srgb, var(--gold) 5%, transparent);
  border: 1px solid color-mix(in srgb, var(--gold) 22%, transparent);
  border-radius: 14px;
}
.modal-coming-soon__icon {
  flex: 0 0 auto;
  width: 36px;
  height: 36px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--gold);
  background: color-mix(in srgb, var(--gold) 14%, transparent);
  border-radius: 50%;
}
.modal-coming-soon__body {
  flex: 1 1 auto;
  min-width: 0;
}
.modal-coming-soon__title {
  font-size: 0.92rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  color: var(--gold);
  text-transform: uppercase;
  margin-bottom: 6px;
}
.modal-coming-soon__desc {
  font-size: 0.92rem;
  line-height: 1.55;
  color: var(--text-muted);
  margin: 0 0 var(--space-2) 0;
}
.modal-coming-soon__status {
  font-size: 0.82rem;
  color: var(--text-faint);
  padding-top: 8px;
  border-top: 1px dashed color-mix(in srgb, var(--gold) 20%, transparent);
}
.modal-coming-soon__status strong {
  display: inline-block;
  margin-right: 8px;
  color: var(--text-muted);
  font-weight: 600;
  font-size: 0.72rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

/* Softer header button variant for announced properties — still
   the primary CTA, but with "announcement" framing rather than booking. */
.modal-book--coming-soon {
  background: linear-gradient(
    180deg,
    color-mix(in srgb, var(--gold) 18%, #111111) 0%,
    color-mix(in srgb, var(--gold) 8%, #0b0b0b) 100%
  );
  border: 1px solid color-mix(in srgb, var(--gold) 60%, transparent);
  color: var(--gold);
  box-shadow: 0 4px 16px rgba(198, 156, 82, 0.18);
}

@media (max-width: 640px) {
  .modal-coming-soon { flex-direction: column; gap: var(--space-2); padding: var(--space-3); }
  .modal-coming-soon__icon { width: 32px; height: 32px; }
}

/* ============================================================
   PHASE 15 — Dual-weekend layout + historical pricing
   ============================================================ */

/* Thin gold hairline between the two weekend lists with breathing room.
   On narrow viewports this is a horizontal rule between the stacked lists.
   On wide viewports (≥ 880px) the .cheapest-teaser grid promotes it to a
   vertical rule via the @media block below. */
.cheapest-teaser-divider {
  display: block;
  height: 1px;
  /* SCROLL-NUDGE-2026: was --space-5 (1.5rem) top+bottom; tightened so the
     two stacked lists pack a little closer and the hero shortens. */
  margin: clamp(0.6rem, 1.4vh, 1rem) auto;
  max-width: 520px;
  background: linear-gradient(
    90deg,
    transparent 0%,
    color-mix(in srgb, var(--gold) 55%, transparent) 50%,
    transparent 100%
  );
  border: 0;
}

/* Vertical-rule variant for the side-by-side leaderboard layout. */
@media (min-width: 880px) {
  .cheapest-teaser-divider {
    width: 1px;
    height: auto;
    margin: 0;
    max-width: none;
    align-self: stretch;
    background: linear-gradient(
      180deg,
      transparent 0%,
      color-mix(in srgb, var(--gold) 55%, transparent) 50%,
      transparent 100%
    );
  }
}

@media (max-width: 560px) {
  .cheapest-teaser-title { font-size: 0.84rem; letter-spacing: 0.06em; }
  .cheapest-teaser-dates { font-size: 0.78rem; }
  .cheapest-teaser-divider { margin: var(--space-4) auto; max-width: 85%; }
}

/* --- Past-weekend modal section dim + gray conf pill --- */
.modal-section--past {
  opacity: 0.78;
  background:
    linear-gradient(
      180deg,
      color-mix(in srgb, var(--text-faint) 6%, transparent) 0%,
      transparent 100%
    );
  border-radius: 10px;
}
.modal-section--past .modal-section-label {
  color: var(--text-muted);
}

.modal-conf--past {
  color: var(--text-muted);
  background: color-mix(in srgb, var(--text-faint) 12%, transparent);
  border-color: color-mix(in srgb, var(--text-faint) 45%, transparent);
}

.modal-conf--draft {
  color: var(--text-muted);
  background: transparent;
  border: 1px dashed color-mix(in srgb, var(--text-faint) 55%, transparent);
}

/* --- Pending weekend (no data yet) card --- */
.modal-price-block--pending {
  padding: var(--space-5) var(--space-4);
  border: 1px dashed color-mix(in srgb, var(--gold) 35%, transparent);
  border-radius: 10px;
  background: color-mix(in srgb, var(--gold) 3%, transparent);
  text-align: center;
}
.modal-weekend-pending-title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.75rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: 8px;
}
.modal-weekend-pending-sub {
  font-family: var(--font-sans);
  font-size: 0.85rem;
  color: var(--text-muted);
  line-height: 1.5;
  max-width: 44ch;
  margin: 0 auto;
}

/* --- Historical Pricing section --- */
.modal-section--historical {
  margin-top: var(--space-5);
}
/* HIST-CHROME-2026: era×theme-aware tile + chart surfaces (scoped to this collapsible). */
.modal-section[data-collapse-key="historical"] {
  --hist-tile-bg: color-mix(in srgb, var(--gold) 10%, var(--surface));
  --hist-tile-bg-hover: color-mix(in srgb, var(--gold) 14%, var(--surface));
  --hist-tile-border: color-mix(in srgb, var(--gold) 28%, var(--border));
  --hist-chart-bg: color-mix(in srgb, var(--gold) 7%, var(--surface));
  --hist-chart-border: color-mix(in srgb, var(--gold) 35%, var(--border));
  --hist-chart-inset: color-mix(in srgb, var(--gold) 4%, var(--surface));
}
.modal-hist-intro {
  font-family: var(--font-sans);
  font-size: 0.82rem;
  line-height: 1.55;
  color: var(--text-muted);
  margin: 0 0 var(--space-4) 0;
  max-width: 62ch;
}

.modal-hist-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: var(--space-3);
}

/* HIST-CHART-2026: dashboard grid — median UL, chart UR (2×2), delta LR. */
.modal-hist-dashboard {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  grid-template-rows: auto auto auto;
  gap: var(--space-3);
  margin-bottom: var(--space-2);
  align-items: stretch;
}
.modal-section[data-collapse-key="historical"] .modal-hist-dashboard {
  padding: var(--space-2);
  border-radius: 10px;
  background: color-mix(in srgb, var(--gold) 3%, transparent);
}
.modal-hist-dashboard__median {
  grid-column: 1;
  grid-row: 1;
}
.modal-hist-dashboard__chart {
  grid-column: 2 / 4;
  grid-row: 1 / 3;
  min-height: 260px;
  display: flex;
  flex-direction: column;
}
.modal-hist-dashboard__avg {
  grid-column: 1;
  grid-row: 2;
}
.modal-hist-dashboard__country {
  grid-column: 1;
  grid-row: 3;
}
.modal-hist-dashboard__brand {
  grid-column: 2;
  grid-row: 3;
}
.modal-hist-dashboard__delta {
  grid-column: 3;
  grid-row: 3;
}
/* Bottom row: equal footprint for all three cohort / delta tiles. */
.modal-hist-dashboard__country,
.modal-hist-dashboard__brand,
.modal-hist-dashboard__delta {
  display: flex;
  min-width: 0;
}
.modal-hist-dashboard__country > .modal-hist-metric,
.modal-hist-dashboard__brand > .modal-hist-metric,
.modal-hist-dashboard__delta > .modal-hist-metric {
  flex: 1;
  width: 100%;
  min-height: 7.75rem;
}
.modal-hist-dashboard__median > .modal-hist-metric,
.modal-hist-dashboard__avg > .modal-hist-metric {
  height: 100%;
  min-height: 6.5rem;
}
.modal-hist-dashboard__editorial {
  grid-column: 1 / -1;
  grid-row: 4;
}
.modal-hist-dashboard__chart--pending {
  grid-row: 1 / 3;
}
.modal-hist-chart-placeholder {
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.modal-section[data-collapse-key="historical"] .modal-hist-metric {
  padding: var(--space-3) var(--space-4);
  border: 1px solid var(--hist-tile-border);
  border-radius: 9px;
  background: var(--hist-tile-bg);
  box-shadow: inset 0 1px 0 color-mix(in srgb, var(--gold) 12%, transparent);
}
.modal-hist-metric {
  padding: var(--space-3) var(--space-4);
  border: 1px solid var(--hairline);
  border-radius: 8px;
  background: color-mix(in srgb, var(--text) 2%, transparent);
}
.modal-section[data-collapse-key="historical"] .modal-hist-metric--pending {
  border: 1px dashed color-mix(in srgb, var(--text-faint) 45%, transparent);
  background: color-mix(in srgb, var(--gold) 4%, var(--surface));
  box-shadow: none;
}
.modal-hist-metric--pending {
  border: 1px dashed color-mix(in srgb, var(--text-faint) 45%, transparent);
  background: transparent;
}

.modal-hist-metric-label {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.62rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--text-faint);
  margin-bottom: 6px;
}
.modal-hist-metric-value {
  /* Phase 28b: percentage deltas must read at a glance — bold sans, not the
     italic serif treatment used elsewhere in the modal. The +/-% itself is
     the most important number in the price comparison section. */
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 1.5rem;
  letter-spacing: 0.005em;
  color: var(--text);
  line-height: 1.1;
  margin-bottom: 4px;
  font-variant-numeric: tabular-nums;
}
.modal-hist-metric--pending .modal-hist-metric-value {
  font-family: var(--font-sans);
  font-size: 0.82rem;
  font-weight: 600;
  font-style: italic;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-faint);
}
.modal-hist-metric-sub {
  font-family: var(--font-sans);
  font-size: 0.76rem;
  color: var(--text-muted);
  line-height: 1.45;
}

/* Delta direction coloring — conspicuous red/green so the user understands
   the pricing situation at a glance. Dark mode and light mode each get a
   shade tuned for AA contrast against the metric tile background. */
:root[data-theme="dark"] .modal-hist-metric-value--above { color: #ff6b6b; }
:root[data-theme="dark"] .modal-hist-metric-value--below { color: #4ade80; }
:root[data-theme="light"] .modal-hist-metric-value--above { color: #d11f1f; }
:root[data-theme="light"] .modal-hist-metric-value--below { color: #138a3f; }
.modal-hist-metric-value--on    { color: var(--text-muted); }

/* Phase 18.1 / HIST-CHART-2026 — weekend trend sparkline chart cell. */
.modal-section[data-collapse-key="historical"] .modal-hist-spark {
  display: flex;
  flex-direction: column;
  flex: 1;
  padding: var(--space-3) var(--space-4);
  height: 100%;
  min-height: 260px;
  background: var(--hist-chart-bg);
  border: 1px solid var(--hist-chart-border);
  border-radius: 9px;
  color: var(--gold, #c9a14a);
  box-shadow:
    inset 0 0 0 1px color-mix(in srgb, var(--gold) 8%, transparent),
    0 2px 12px color-mix(in srgb, var(--text) 6%, transparent);
  position: relative;
}
.modal-section[data-collapse-key="historical"] .modal-hist-spark::before {
  content: "";
  position: absolute;
  top: 0;
  left: 12%;
  right: 12%;
  height: 1px;
  background: linear-gradient(
    90deg,
    transparent 0%,
    color-mix(in srgb, var(--gold) 55%, transparent) 50%,
    transparent 100%
  );
  pointer-events: none;
}
.modal-hist-spark {
  display: flex;
  flex-direction: column;
  flex: 1;
  padding: var(--space-2) var(--space-3);
  height: 100%;
  min-height: 260px;
  background: rgba(255, 255, 255, 0.02);
  border: 1px solid rgba(255, 255, 255, 0.06);
  border-radius: 8px;
  color: var(--gold, #c9a14a);
}
.modal-hist-chart {
  position: relative;
  flex: 1;
  display: flex;
  flex-direction: column;
  min-height: 0;
  width: 100%;
}
.modal-hist-chart-axis {
  font-family: var(--font-display);
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-faint);
  flex: none;
}
.modal-hist-chart-axis--x {
  text-align: center;
  font-size: 0.78rem;
  padding-top: var(--space-1);
}
.modal-hist-sparkline {
  flex: 1;
  width: 100%;
  height: 100%;
  min-height: 210px;
  display: block;
  overflow: visible;
}
.spark-axis-line {
  stroke: color-mix(in srgb, var(--gold) 35%, var(--text));
  stroke-width: 1;
}
.spark-grid-line {
  stroke: color-mix(in srgb, var(--gold) 12%, var(--text));
  stroke-width: 1;
  stroke-dasharray: 3 4;
}
.spark-plot-bg {
  fill: var(--hist-chart-inset, color-mix(in srgb, var(--gold) 4%, var(--surface)));
}
.spark-area-stop-top {
  stop-color: var(--gold, #c9a14a);
  stop-opacity: 0.22;
}
.spark-area-stop-bottom {
  stop-color: var(--gold, #c9a14a);
  stop-opacity: 0;
}
.spark-line-grad-start {
  stop-color: var(--gold-deep, var(--gold, #9b7f45));
}
.spark-line-grad-end {
  stop-color: var(--gold-bright, var(--gold, #d9bf82));
}
.spark-area-fill {
  fill: url(#spark-area-grad);
}
.spark-axis-tick {
  font-family: var(--font-body);
  fill: var(--text-muted);
}
.spark-axis-tick--y {
  font-size: 16px;
  font-weight: 600;
}
.spark-axis-tick--x {
  font-size: 15px;
  font-weight: 600;
}
.spark-line {
  stroke: url(#spark-line-grad);
  fill: none;
}
.spark-end-dot {
  fill: var(--gold-bright, var(--gold, #c9a14a));
  stroke: color-mix(in srgb, var(--gold) 40%, var(--surface));
  stroke-width: 2;
}
.spark-current-dot { fill: var(--gold-bright, #c9a14a); stroke: var(--surface, #14110c); stroke-width: 1.5; }
/* High/low extreme markers — large enough for low-vision readability. */
.spark-extreme-dot { stroke: var(--surface, #14110c); stroke-width: 1.2; }
.spark-extreme-dot.spark-extreme--hi { fill: var(--gold-bright, #c9a14a); }
.spark-extreme-dot.spark-extreme--lo { fill: var(--text-muted, #9a9384); }
.spark-extreme-label {
  font-family: var(--font-display);
  font-size: 20px;
  font-weight: 800;
  letter-spacing: 0.01em;
  paint-order: stroke;
  stroke: var(--surface, #14110c);
  stroke-width: 5px;
  stroke-linejoin: round;
}
.spark-extreme-label.spark-extreme--hi { fill: var(--gold-bright, #c9a14a); }
.spark-extreme-label.spark-extreme--lo { fill: var(--text-muted, #9a9384); }
:root[data-theme="light"] .spark-extreme-dot { stroke: var(--hist-chart-bg, var(--surface)); }
:root[data-theme="light"] .spark-extreme-label {
  stroke: var(--hist-chart-bg, #ffffff);
}
:root[data-theme="light"] .spark-extreme-label.spark-extreme--hi { fill: #9a7b2e; }
:root[data-theme="light"] .spark-extreme-label.spark-extreme--lo { fill: #6b6557; }

@media (max-width: 560px) {
  .modal-hist-dashboard {
    grid-template-columns: 1fr 1fr;
    grid-template-rows: auto auto auto auto auto;
  }
  .modal-hist-dashboard__median { grid-column: 1; grid-row: 1; }
  .modal-hist-dashboard__avg { grid-column: 2; grid-row: 1; }
  .modal-hist-dashboard__chart {
    grid-column: 1 / -1;
    grid-row: 2;
    min-height: 180px;
  }
  .modal-hist-dashboard__country { grid-column: 1; grid-row: 3; }
  .modal-hist-dashboard__brand { grid-column: 2; grid-row: 3; }
  .modal-hist-dashboard__delta { grid-column: 1 / -1; grid-row: 4; }
  .modal-hist-dashboard__editorial { grid-row: 5; }
  .modal-hist-sparkline { min-height: 170px; }
  .modal-hist-dashboard__country > .modal-hist-metric,
  .modal-hist-dashboard__brand > .modal-hist-metric,
  .modal-hist-dashboard__delta > .modal-hist-metric {
    min-height: 6.75rem;
  }
  .spark-extreme-label { font-size: 13px; }
  .modal-hist-grid { grid-template-columns: 1fr 1fr; gap: var(--space-2); }
  .modal-hist-metric { padding: var(--space-2) var(--space-3); }
  .modal-hist-metric-value { font-size: 1.25rem; }
  .modal-price-block--pending { padding: var(--space-4) var(--space-3); }
}

/* ============================================================
   PHASE 19 — Brand-change indicators (rebranded / unbranded)
   Hotels that left a covered luxury brand still appear in the
   atlas because the building (and often the experience) is the
   same — and the published rate may be lower without the brand
   premium. Card gets a small refresh icon; modal gets a full banner.
   ============================================================ */

.card-brand-change {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  vertical-align: middle;
  margin-left: 6px;
  color: var(--gold);
  opacity: 0.85;
  cursor: help;
  transform: translateY(-1px);
}
.card-brand-change:hover { opacity: 1; }

/* ============================================================
   Phase 47: Luxury-standard CAUTION banners (card + modal).
   Deliberately red and high-contrast for extreme prominence,
   rendered directly under the hotel name.
   ============================================================ */
:root {
  --caution-red: #e03b3b;
  --caution-red-bg: rgba(224, 59, 59, 0.12);
  --caution-red-border: rgba(224, 59, 59, 0.55);
}

/* Card: compact red pill under the name. */
.card-caution {
  display: flex;
  align-items: center;
  gap: 6px;
  margin: 6px 0 2px 0;
  padding: 5px 9px;
  background: var(--caution-red-bg);
  border: 1px solid var(--caution-red-border);
  border-left: 3px solid var(--caution-red);
  border-radius: var(--radius-md);
  color: var(--caution-red);
  font-size: 0.72rem;
  font-weight: 700;
  line-height: 1.25;
  letter-spacing: 0.01em;
}
.card-caution svg { flex: 0 0 auto; }

/* Modal: larger, alarm-style red banner directly under the title. */
.modal-caution {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin: var(--space-3) 0;
  padding: var(--space-3) var(--space-4);
  background: var(--caution-red-bg);
  border: 1.5px solid var(--caution-red-border);
  border-left: 4px solid var(--caution-red);
  border-radius: 12px;
  color: var(--caution-red);
}
.modal-caution svg { flex: 0 0 auto; }
.modal-caution__text {
  font-size: 1rem;
  font-weight: 700;
  line-height: 1.4;
  letter-spacing: 0.01em;
}

/* ============================================================
   Operating-status banners (closed / renovation). Neutral/amber
   informational notice — distinct from the red luxury-caution
   banner. Driven by h.status + h.status_note.
   ============================================================ */
:root {
  --status-closed: #8a8577;        /* muted slate-taupe for permanently closed */
  --status-closed-bg: rgba(138, 133, 119, 0.14);
  --status-closed-border: rgba(138, 133, 119, 0.5);
  --status-reno: #c6952f;          /* amber for temporary renovation */
  --status-reno-bg: rgba(198, 149, 47, 0.14);
  --status-reno-border: rgba(198, 149, 47, 0.5);
}

/* Card: compact pill under the name. */
.card-status {
  display: flex;
  align-items: center;
  gap: 6px;
  margin: 6px 0 2px 0;
  padding: 5px 9px;
  border-radius: var(--radius-md);
  font-size: 0.72rem;
  font-weight: 700;
  line-height: 1.25;
  letter-spacing: 0.01em;
}
.card-status svg { flex: 0 0 auto; }
.card-status--closed {
  background: var(--status-closed-bg);
  border: 1px solid var(--status-closed-border);
  border-left: 3px solid var(--status-closed);
  color: var(--status-closed);
}
.card-status--renovation {
  background: var(--status-reno-bg);
  border: 1px solid var(--status-reno-border);
  border-left: 3px solid var(--status-reno);
  color: var(--status-reno);
}

/* Modal: larger banner under the title with optional explanatory note. */
.modal-status {
  margin: var(--space-3) 0;
  padding: var(--space-3) var(--space-4);
  border-radius: 12px;
}
.modal-status__head {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  font-size: 1rem;
  font-weight: 700;
  line-height: 1.4;
  letter-spacing: 0.01em;
}
.modal-status__head svg { flex: 0 0 auto; }
.modal-status__note {
  margin: 8px 0 0 0;
  padding-left: calc(20px + var(--space-3));
  font-size: 0.9rem;
  font-weight: 500;
  line-height: 1.5;
  color: var(--text-muted);
}
.modal-status--closed {
  background: var(--status-closed-bg);
  border: 1.5px solid var(--status-closed-border);
  border-left: 4px solid var(--status-closed);
  color: var(--status-closed);
}
.modal-status--renovation {
  background: var(--status-reno-bg);
  border: 1.5px solid var(--status-reno-border);
  border-left: 4px solid var(--status-reno);
  color: var(--status-reno);
}

/* ============================================================
   Phase 47: Badge-history timeline (modal). Current badge on top,
   prior brand tenures below, each with a year range + note.
   ============================================================ */
.badge-timeline {
  margin: var(--space-3) 0 var(--space-4) 0;
  padding: var(--space-3) var(--space-4);
  background: color-mix(in srgb, var(--gold) 5%, transparent);
  border: 1px solid color-mix(in srgb, var(--gold) 24%, transparent);
  border-left: 3px solid var(--gold);
  border-radius: 14px;
}
.badge-timeline__label {
  display: flex;
  align-items: center;
  gap: 7px;
  font-size: 0.82rem;
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: var(--space-3);
}
.badge-timeline__list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.badge-timeline__item {
  position: relative;
  display: flex;
  gap: 12px;
  padding: 0 0 var(--space-3) 4px;
}
.badge-timeline__item:last-child { padding-bottom: 0; }
/* Vertical connector line through the dots. */
.badge-timeline__item::before {
  content: "";
  position: absolute;
  left: 9px;
  top: 14px;
  bottom: -2px;
  width: 2px;
  background: color-mix(in srgb, var(--gold) 30%, transparent);
}
.badge-timeline__item:last-child::before { display: none; }
.badge-timeline__dot {
  position: relative;
  z-index: 1;
  flex: 0 0 auto;
  width: 12px;
  height: 12px;
  margin-top: 4px;
  border-radius: 50%;
  background: var(--surface);
  border: 2px solid color-mix(in srgb, var(--gold) 55%, transparent);
}
.badge-timeline__item--current .badge-timeline__dot {
  background: var(--gold);
  border-color: var(--gold);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--gold) 22%, transparent);
}
.badge-timeline__content { flex: 1 1 auto; min-width: 0; }
.badge-timeline__head {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 8px;
}
.badge-timeline__brand {
  font-size: 0.98rem;
  font-weight: 600;
  color: var(--text);
}
.badge-timeline__item--current .badge-timeline__brand { color: var(--gold); }
.badge-timeline__now {
  font-size: 0.66rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--bg);
  background: var(--gold);
  padding: 2px 7px;
  border-radius: 999px;
}
.badge-timeline__years {
  font-size: 0.82rem;
  font-weight: 500;
  color: var(--text-muted);
  font-variant-numeric: tabular-nums;
}
.badge-timeline__note {
  margin: 3px 0 0 0;
  font-size: 0.85rem;
  line-height: 1.5;
  color: var(--text-muted);
}
.badge-timeline__src {
  color: var(--gold);
  text-decoration: none;
  font-weight: 600;
  margin-left: 2px;
}
.badge-timeline__src:hover { text-decoration: underline; }

/* Inline renovation marker on a badge-history tenure. */
.badge-timeline__reno {
  margin: 5px 0 0 0;
  font-size: 0.82rem;
  line-height: 1.45;
  color: var(--text-muted);
}
.badge-timeline__reno-amt {
  font-weight: 700;
  color: var(--gold);
  font-variant-numeric: tabular-nums;
}

/* ------------------------------------------------------------------
   Renovations section (modal) — owner directive: capital-spend amounts
   are a headline feature. Dollar figure leads each row in gold.
   ------------------------------------------------------------------ */
.reno-list-wrap { margin-top: 2px; }
.reno-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}
.reno-item {
  padding-left: var(--space-3);
  border-left: 2px solid var(--gold);
}
.reno-item__head {
  display: flex;
  align-items: baseline;
  gap: var(--space-2);
  flex-wrap: wrap;
}
.reno-item__amt {
  font-size: 1.12rem;
  font-weight: 800;
  color: var(--gold);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.01em;
}
.reno-item__amt--unknown {
  font-size: 0.95rem;
  font-weight: 700;
  color: var(--text);
}
.reno-item__year {
  font-size: 0.82rem;
  font-weight: 600;
  color: var(--text-muted);
  font-variant-numeric: tabular-nums;
}
.reno-item__desc {
  margin: 3px 0 0 0;
  font-size: 0.85rem;
  line-height: 1.5;
  color: var(--text-muted);
}
.reno-item__src {
  color: var(--gold);
  text-decoration: none;
  font-weight: 600;
  margin-left: 2px;
}
.reno-item__src:hover { text-decoration: underline; }

/* ------------------------------------------------------------------
   Phase 50 — Re-badge prestige callout (modal) + succession note.
   A compact, high-signal box near the top of the modal. Three flavors:
   --value  (green)  price-confirmed downgrade = potential value find
   --down   (amber)  prestige downgrade, no price evidence yet
   --up     (blue)   prestige upgrade / repositioning
   ------------------------------------------------------------------ */
.rebadge-callout {
  margin: var(--space-3) 0;
  padding: var(--space-3) var(--space-4);
  border: 1px solid color-mix(in srgb, var(--text) 14%, transparent);
  border-left: 3px solid var(--text-muted);
  border-radius: 14px;
  background: color-mix(in srgb, var(--text) 4%, transparent);
}
.rebadge-callout__head {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 0.9rem;
  font-weight: 700;
  letter-spacing: 0.01em;
}
.rebadge-callout__body {
  margin: 6px 0 0 0;
  font-size: 0.88rem;
  line-height: 1.55;
  color: var(--text-muted);
}
.rebadge-callout--value {
  border-color: color-mix(in srgb, #1f9d57 38%, transparent);
  border-left-color: #1f9d57;
  background: color-mix(in srgb, #1f9d57 9%, transparent);
}
.rebadge-callout--value .rebadge-callout__head { color: #1f9d57; }
:root[data-theme="light"] .rebadge-callout--value .rebadge-callout__head { color: #157a42; }
.rebadge-callout--down {
  border-color: color-mix(in srgb, var(--gold) 34%, transparent);
  border-left-color: var(--gold);
  background: color-mix(in srgb, var(--gold) 7%, transparent);
}
.rebadge-callout--down .rebadge-callout__head { color: var(--gold); }
.rebadge-callout--up {
  border-color: color-mix(in srgb, #3b82c4 36%, transparent);
  border-left-color: #3b82c4;
  background: color-mix(in srgb, #3b82c4 8%, transparent);
}
.rebadge-callout--up .rebadge-callout__head { color: #3b82c4; }
:root[data-theme="light"] .rebadge-callout--up .rebadge-callout__head { color: #2c6699; }

/* Forward "now operates as" link for a closed predecessor record. */
.succession-note {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  margin: var(--space-3) 0;
  padding: 10px var(--space-3);
  font-size: 0.88rem;
  line-height: 1.5;
  color: var(--text-muted);
  border: 1px dashed color-mix(in srgb, var(--text) 22%, transparent);
  border-radius: 12px;
}
.succession-note svg { flex: 0 0 auto; margin-top: 2px; color: var(--text-muted); }
.succession-note__link {
  background: none;
  border: none;
  padding: 0;
  font: inherit;
  font-weight: 600;
  color: var(--gold);
  cursor: pointer;
  text-decoration: underline;
  text-underline-offset: 2px;
}
.succession-note__link:hover { opacity: 0.82; }

/* Reserved card chip for the strongest re-badge signals. */
.card-rebadge {
  display: inline-flex;
  align-items: center;
  align-self: flex-start;
  max-width: 100%;
  margin: 2px 0 0 0;
  padding: 2px 9px;
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  border-radius: 999px;
  white-space: nowrap;
}
.card-rebadge--value {
  color: #157a42;
  background: color-mix(in srgb, #1f9d57 16%, transparent);
  border: 1px solid color-mix(in srgb, #1f9d57 40%, transparent);
}
:root[data-theme="dark"] .card-rebadge--value { color: #34c172; }
.card-rebadge--up {
  color: #2c6699;
  background: color-mix(in srgb, #3b82c4 15%, transparent);
  border: 1px solid color-mix(in srgb, #3b82c4 40%, transparent);
}
:root[data-theme="dark"] .card-rebadge--up { color: #6db0e6; }

/* Movie Mode — card chip + modal badge (The Screening Room). */
.card-on-screen-chip {
  display: inline-flex;
  align-items: center;
  align-self: flex-start;
  max-width: 100%;
  margin: 2px 0 0 0;
  padding: 2px 9px;
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  border-radius: 999px;
  white-space: nowrap;
  color: #8a6d2b;
  background: color-mix(in srgb, #c8a84b 14%, transparent);
  border: 1px solid color-mix(in srgb, #c8a84b 38%, transparent);
  cursor: pointer;
  font-family: inherit;
  line-height: 1.3;
}
.card-on-screen-chip:hover {
  background: color-mix(in srgb, #c8a84b 24%, transparent);
}
:root[data-theme="dark"] .card-on-screen-chip,
body[data-theme="dark"] .card-on-screen-chip {
  color: #e6c489;
  background: color-mix(in srgb, #d4af6e 16%, transparent);
  border-color: color-mix(in srgb, #d4af6e 42%, transparent);
}
.modal-on-screen {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px var(--space-3);
  margin: var(--space-4) 0;
  padding: var(--space-4) var(--space-5);
  width: fit-content;
  max-width: calc(100% - var(--space-6));
  border-radius: 12px;
  font-size: 0.88rem;
  line-height: 1.45;
  color: var(--text-muted, #6b6560);
  background: color-mix(in srgb, #c8a84b 10%, transparent);
  border: 1px solid color-mix(in srgb, #c8a84b 28%, transparent);
}
.modal-on-screen svg { flex: none; color: #a8842e; }
.modal-on-screen strong { color: var(--text, inherit); }
.modal-on-screen em { font-style: normal; font-weight: 600; color: #8a6d2b; }
.modal-on-screen__link {
  margin-left: auto;
  padding: 7px 14px;
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  border-radius: 999px;
  border: 1px solid color-mix(in srgb, #c8a84b 45%, transparent);
  background: color-mix(in srgb, #c8a84b 18%, transparent);
  color: #7a5a10;
  cursor: pointer;
}
.modal-on-screen__link:hover {
  background: color-mix(in srgb, #c8a84b 28%, transparent);
}
:root[data-theme="dark"] .modal-on-screen,
body[data-theme="dark"] .modal-on-screen {
  color: #b8ab97;
  background: color-mix(in srgb, #d4af6e 10%, transparent);
  border-color: color-mix(in srgb, #d4af6e 24%, transparent);
}
:root[data-theme="dark"] .modal-on-screen em,
body[data-theme="dark"] .modal-on-screen em { color: #e6c489; }
:root[data-theme="dark"] .modal-on-screen__link,
body[data-theme="dark"] .modal-on-screen__link {
  color: #f0e2c8;
  border-color: color-mix(in srgb, #d4af6e 45%, transparent);
  background: color-mix(in srgb, #d4af6e 14%, transparent);
}

/* ------------------------------------------------------------------
   News Mode: per-hotel "Recent changes" section in the modal.
   The modal-side companion to The Atlas Gazette. Styled as a compact
   dated timeline; each row's glyph is tinted by event type. Uses the
   same theme tokens as the rest of the modal so it shifts per era.
   ------------------------------------------------------------------ */
.recent-changes {
  margin: var(--space-3) 0 var(--space-4) 0;
  padding: var(--space-3) var(--space-4);
  background: color-mix(in srgb, var(--gold) 4%, transparent);
  border: 1px solid color-mix(in srgb, var(--gold) 20%, transparent);
  border-left: 3px solid var(--gold);
  border-radius: 14px;
}
.recent-changes__label {
  display: flex;
  align-items: center;
  gap: 7px;
  font-size: 0.82rem;
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: var(--space-3);
}
.recent-changes__more {
  margin-left: auto;
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: none;
  color: var(--text-muted);
  text-decoration: none;
  white-space: nowrap;
}
.recent-changes__more:hover { color: var(--gold); }
.recent-changes__list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.recent-change__item {
  position: relative;
  display: flex;
  gap: 11px;
  padding: 0 0 var(--space-3) 0;
}
.recent-change__item:last-child { padding-bottom: 0; }

/* From the press room — property-linked corporate release excerpts */
.press-releases {
  margin: 0 0 var(--space-4) 0;
  padding: var(--space-3) var(--space-4);
  background: color-mix(in srgb, var(--text-muted) 4%, transparent);
  border: 1px solid color-mix(in srgb, var(--text-muted) 18%, transparent);
  border-left: 3px solid color-mix(in srgb, var(--gold) 55%, var(--text-muted));
  border-radius: 14px;
}
.press-releases__label {
  display: flex;
  align-items: center;
  gap: 7px;
  font-size: 0.82rem;
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin-bottom: var(--space-3);
}
.press-releases__list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.press-release__item {
  padding: 0 0 var(--space-3) 0;
  border-bottom: 1px solid color-mix(in srgb, var(--text-muted) 12%, transparent);
}
.press-release__item:last-child {
  padding-bottom: 0;
  border-bottom: none;
}
.press-release__head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 8px;
  margin-bottom: 6px;
}
.press-release__headline {
  font-size: 0.92rem;
  font-weight: 600;
  color: var(--text);
  line-height: 1.35;
}
.press-release__when {
  font-size: 0.72rem;
  color: var(--text-muted);
  letter-spacing: 0.03em;
}
.press-release__excerpt {
  margin: 0 0 8px 0;
  font-size: 0.84rem;
  line-height: 1.55;
  color: var(--text-muted);
}
.press-release__link {
  font-size: 0.72rem;
  font-weight: 600;
  color: var(--gold);
  text-decoration: none;
}
.press-release__link:hover { text-decoration: underline; }

/* History → In The News — virtual Grey Lady newspaper clipping.
   Intentionally breaks from modal cream/gold language: newsprint grey,
   dense black ink, blackletter nameplate, hairline rules. */
.nyt-in-the-news {
  --nyt-ink: #1a1a1a;
  --nyt-ink-soft: #2e2e2e;
  --nyt-muted: #5c5c5c;
  --nyt-paper: #e4e2db;
  --nyt-paper-deep: #d8d5cc;
  --nyt-edge: #a8a49a;
  --nyt-rule: #1f1f1f;
  --nyt-font-body: "Libre Baskerville", "Times New Roman", Times, serif;
  --nyt-font-blackletter: "UnifrakturMaguntia", "Old English Text MT", "Times New Roman", serif;

  position: relative;
  margin: var(--space-5) 2px 4px 2px;
  padding: 14px 16px 12px;
  color: var(--nyt-ink);
  font-family: var(--nyt-font-body);
  background-color: var(--nyt-paper);
  background-image:
    linear-gradient(165deg, rgba(255, 255, 255, 0.35) 0%, transparent 42%),
    linear-gradient(0deg, rgba(0, 0, 0, 0.03), rgba(0, 0, 0, 0.03)),
    repeating-linear-gradient(
      180deg,
      transparent 0,
      transparent 3px,
      rgba(0, 0, 0, 0.018) 3px,
      rgba(0, 0, 0, 0.018) 4px
    );
  border: 1px solid var(--nyt-edge);
  border-radius: 1px;
  box-shadow:
    1px 1px 0 rgba(255, 255, 255, 0.35) inset,
    -1px -1px 0 rgba(0, 0, 0, 0.04) inset,
    2px 3px 0 rgba(0, 0, 0, 0.05),
    5px 10px 22px rgba(0, 0, 0, 0.14);
  transform: rotate(-0.4deg);
  isolation: isolate;
}
@media (max-width: 700px) {
  .nyt-in-the-news {
    margin-left: 0;
    margin-right: 0;
    transform: rotate(-0.2deg);
    padding: 12px 12px 10px;
  }
  .nyt-in-the-news__nameplate {
    font-size: 1.4rem;
  }
}
/* Soft clipped-corner / aged-edge cue without literal scissors art */
.nyt-in-the-news::before {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  box-shadow:
    inset 0 0 0 1px rgba(255, 255, 255, 0.2),
    inset 0 0 28px rgba(0, 0, 0, 0.04);
  mix-blend-mode: multiply;
}
.nyt-in-the-news__masthead {
  text-align: center;
  margin: 0 0 10px 0;
  padding: 0 0 8px 0;
  border-bottom: 3px double var(--nyt-rule);
}
.nyt-in-the-news__nameplate {
  font-family: var(--nyt-font-blackletter);
  font-size: clamp(1.35rem, 3.6vw, 1.75rem);
  font-weight: 400;
  line-height: 1.05;
  letter-spacing: 0.01em;
  color: var(--nyt-ink);
  margin: 0 0 6px 0;
}
.nyt-in-the-news__kicker {
  display: flex;
  align-items: center;
  gap: 10px;
  justify-content: center;
}
.nyt-in-the-news__kicker-rule {
  flex: 0 0 40px;
  height: 1px;
  background: var(--nyt-rule);
  opacity: 0.85;
}
.nyt-in-the-news__label {
  flex: 0 0 auto;
  font-family: var(--nyt-font-body);
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--nyt-ink);
}
.nyt-in-the-news__list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.nyt-news__item {
  padding: 10px 0 11px 0;
  border-bottom: 1px solid rgba(26, 26, 26, 0.22);
  column-rule: 1px solid rgba(26, 26, 26, 0.15);
}
.nyt-news__item:first-child {
  padding-top: 2px;
}
.nyt-news__item:last-child {
  border-bottom: none;
  padding-bottom: 2px;
}
.nyt-news__dateline {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 6px 10px;
  margin: 0 0 4px 0;
}
.nyt-news__when {
  font-family: var(--nyt-font-body);
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--nyt-muted);
}
.nyt-news__badges {
  display: inline-flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0 6px;
}
.nyt-news__badge {
  font-family: var(--nyt-font-body);
  font-size: 0.62rem;
  font-weight: 400;
  font-style: italic;
  letter-spacing: 0.03em;
  text-transform: none;
  color: var(--nyt-muted);
  border: none;
  border-radius: 0;
  padding: 0;
}
.nyt-news__sep {
  font-style: normal;
  color: var(--nyt-muted);
  opacity: 0.75;
}
.nyt-news__headline {
  margin: 0 0 2px 0;
  font-family: var(--nyt-font-body);
  font-size: 1.05rem;
  font-weight: 700;
  font-style: normal;
  color: var(--nyt-ink);
  line-height: 1.22;
  letter-spacing: -0.01em;
}
.nyt-news__byline {
  margin: 0 0 6px 0;
  font-family: var(--nyt-font-body);
  font-size: 0.68rem;
  font-weight: 400;
  font-style: italic;
  line-height: 1.3;
  letter-spacing: 0.01em;
  color: var(--nyt-ink-soft);
}
.nyt-news__headline + .nyt-news__quote {
  margin-top: 4px;
}
.nyt-news__quote {
  margin: 0 0 8px 0;
  padding: 0;
  border: none;
}
.nyt-news__quote p {
  margin: 0;
  font-family: var(--nyt-font-body);
  font-size: 0.78rem;
  font-weight: 400;
  font-style: normal;
  line-height: 1.45;
  color: var(--nyt-ink-soft);
  text-align: left;
  hyphens: auto;
}
.nyt-news__link {
  display: inline-block;
  font-family: var(--nyt-font-body);
  font-size: 0.68rem;
  font-weight: 700;
  font-style: italic;
  letter-spacing: 0.01em;
  color: var(--nyt-ink);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 2px;
}
.nyt-news__link:hover {
  color: #000;
  text-decoration-thickness: 2px;
}
.nyt-in-the-news__attr {
  margin: 10px 0 0 0;
  padding-top: 8px;
  border-top: 1px solid rgba(26, 26, 26, 0.28);
  font-family: var(--nyt-font-body);
  font-size: 0.62rem;
  font-style: italic;
  line-height: 1.35;
  color: var(--nyt-muted);
  text-align: center;
}
.nyt-in-the-news__attr a {
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 2px;
}

/* W20 — Wikipedia cite chip (links only; never article body) */
.modal-wiki-cite {
  margin: 12px 0 0 0;
  padding-top: 10px;
  border-top: 1px solid color-mix(in srgb, var(--ink, #1a1a1a) 14%, transparent);
  font-size: 0.72rem;
  line-height: 1.4;
  letter-spacing: 0.02em;
  color: color-mix(in srgb, var(--ink, #1a1a1a) 62%, transparent);
}
.modal-wiki-cite a {
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 2px;
}

/* Keep the physical clipping look in dark theme — Grey Lady paper on dark modal */
:root[data-theme="dark"] .nyt-in-the-news,
body[data-theme="dark"] .nyt-in-the-news {
  --nyt-ink: #141414;
  --nyt-ink-soft: #242424;
  --nyt-muted: #555;
  --nyt-paper: #ddd9d0;
  --nyt-paper-deep: #d0ccc2;
  --nyt-edge: #8f8b80;
  box-shadow:
    1px 1px 0 rgba(255, 255, 255, 0.28) inset,
    2px 3px 0 rgba(0, 0, 0, 0.2),
    6px 14px 28px rgba(0, 0, 0, 0.45);
}

/* History → In The News — Chronicling America / Library of Congress clipping.
   Distinct from Grey Lady: warmer foxed newsprint, slab masthead, no blackletter. */
.loc-in-the-news {
  --loc-ink: #1c1914;
  --loc-ink-soft: #2f2a22;
  --loc-muted: #5a5348;
  --loc-paper: #e8dfc8;
  --loc-edge: #9a8f78;
  --loc-rule: #2a241c;
  --loc-font: "Libre Baskerville", "Times New Roman", Times, serif;

  position: relative;
  margin: var(--space-4) 2px 4px 2px;
  padding: 14px 16px 12px;
  color: var(--loc-ink);
  font-family: var(--loc-font);
  background-color: var(--loc-paper);
  background-image:
    linear-gradient(155deg, rgba(255, 248, 230, 0.45) 0%, transparent 50%),
    repeating-linear-gradient(
      180deg,
      transparent 0,
      transparent 3px,
      rgba(60, 40, 10, 0.025) 3px,
      rgba(60, 40, 10, 0.025) 4px
    );
  border: 1px solid var(--loc-edge);
  border-radius: 1px;
  box-shadow:
    1px 1px 0 rgba(255, 255, 255, 0.3) inset,
    2px 3px 0 rgba(0, 0, 0, 0.05),
    5px 10px 20px rgba(0, 0, 0, 0.12);
  transform: rotate(0.35deg);
}
@media (max-width: 700px) {
  .loc-in-the-news {
    margin-left: 0;
    margin-right: 0;
    transform: rotate(0.15deg);
  }
}
.loc-in-the-news__masthead {
  text-align: center;
  margin: 0 0 10px 0;
  padding: 0 0 8px 0;
  border-bottom: 3px double var(--loc-rule);
}
.loc-in-the-news__nameplate {
  font-family: var(--loc-font);
  font-size: clamp(1.15rem, 3.2vw, 1.45rem);
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  line-height: 1.1;
  color: var(--loc-ink);
}
.loc-in-the-news__sub {
  font-size: 0.68rem;
  font-style: italic;
  letter-spacing: 0.06em;
  color: var(--loc-muted);
  margin: 2px 0 6px 0;
}
.loc-in-the-news__kicker {
  display: flex;
  align-items: center;
  gap: 10px;
  justify-content: center;
}
.loc-in-the-news__kicker-rule {
  flex: 0 0 40px;
  height: 1px;
  background: var(--loc-rule);
  opacity: 0.85;
}
.loc-in-the-news__label {
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--loc-ink);
}
.loc-in-the-news__list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.loc-news__item {
  padding: 10px 0 11px 0;
  border-bottom: 1px solid rgba(42, 36, 28, 0.22);
}
.loc-news__item:last-child {
  border-bottom: none;
  padding-bottom: 2px;
}
.loc-news__dateline {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 6px 10px;
  margin: 0 0 4px 0;
}
.loc-news__when {
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--loc-muted);
}
.loc-news__badges {
  display: inline-flex;
  flex-wrap: wrap;
  gap: 0 6px;
}
.loc-news__badge {
  font-size: 0.62rem;
  font-style: italic;
  color: var(--loc-muted);
}
.loc-news__sep { color: var(--loc-muted); opacity: 0.75; }
.loc-news__paper {
  font-size: 0.72rem;
  font-style: italic;
  color: var(--loc-muted);
  margin: 0 0 3px 0;
}
.loc-news__headline {
  margin: 0 0 2px 0;
  font-size: 1.02rem;
  font-weight: 700;
  line-height: 1.22;
  color: var(--loc-ink);
}
.loc-news__byline {
  margin: 0 0 6px 0;
  font-size: 0.68rem;
  font-weight: 400;
  font-style: italic;
  line-height: 1.3;
  letter-spacing: 0.01em;
  color: var(--loc-muted);
}
.loc-news__headline + .loc-news__quote {
  margin-top: 4px;
}
.loc-news__quote {
  margin: 0 0 8px 0;
  padding: 0;
  border: none;
}
.loc-news__quote p {
  margin: 0;
  font-size: 0.78rem;
  line-height: 1.45;
  color: var(--loc-ink-soft);
}
.loc-news__link {
  display: inline-block;
  font-size: 0.68rem;
  font-weight: 700;
  font-style: italic;
  color: var(--loc-ink);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.loc-news__link:hover { color: #000; }
.loc-in-the-news__attr {
  margin: 10px 0 0 0;
  padding-top: 8px;
  border-top: 1px solid rgba(42, 36, 28, 0.28);
  font-size: 0.62rem;
  font-style: italic;
  color: var(--loc-muted);
  text-align: center;
}
.loc-in-the-news__attr a {
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 2px;
}
:root[data-theme="dark"] .loc-in-the-news,
body[data-theme="dark"] .loc-in-the-news {
  --loc-ink: #1a1610;
  --loc-ink-soft: #2a241c;
  --loc-muted: #5c5346;
  --loc-paper: #e0d5b8;
  --loc-edge: #8a7f68;
  box-shadow:
    1px 1px 0 rgba(255, 255, 255, 0.22) inset,
    2px 3px 0 rgba(0, 0, 0, 0.2),
    6px 14px 28px rgba(0, 0, 0, 0.45);
}

/* History → In The News — The Guardian (UK Open Platform).
   Cool newsprint + Guardian blue accent; distinct from NYT Grey Lady / LOC foxed. */
.guardian-in-the-news {
  --gu-ink: #121212;
  --gu-ink-soft: #1a1a1a;
  --gu-muted: #525252;
  --gu-paper: #f6f5f1;
  --gu-edge: #767676;
  --gu-blue: #052962;
  --gu-font: "Guardian Text Egyptian", "Libre Baskerville", "Georgia", serif;

  position: relative;
  margin: var(--space-4) 2px 4px 2px;
  padding: 14px 16px 12px;
  color: var(--gu-ink);
  font-family: var(--gu-font);
  background-color: var(--gu-paper);
  background-image:
    linear-gradient(180deg, rgba(5, 41, 98, 0.04) 0%, transparent 28%),
    repeating-linear-gradient(
      180deg,
      transparent 0,
      transparent 3px,
      rgba(5, 41, 98, 0.02) 3px,
      rgba(5, 41, 98, 0.02) 4px
    );
  border: 1px solid var(--gu-edge);
  box-shadow:
    1px 1px 0 rgba(255, 255, 255, 0.55) inset,
    2px 3px 0 rgba(0, 0, 0, 0.08),
    5px 12px 24px rgba(0, 0, 0, 0.12);
}
.guardian-in-the-news__masthead { margin: 0 0 10px 0; text-align: center; }
.guardian-in-the-news__nameplate {
  font-family: var(--gu-font);
  font-size: 1.35rem;
  font-weight: 700;
  letter-spacing: 0.02em;
  color: var(--gu-blue);
  line-height: 1.1;
}
.guardian-in-the-news__kicker {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 6px;
}
.guardian-in-the-news__kicker-rule {
  flex: 1 1 auto;
  height: 1px;
  background: rgba(5, 41, 98, 0.35);
}
.guardian-in-the-news__label {
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--gu-muted);
}
.guardian-in-the-news__list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.guardian-news__item {
  margin: 0 0 12px 0;
  padding: 0 0 10px 0;
  border-bottom: 1px solid rgba(5, 41, 98, 0.15);
}
.guardian-news__item:last-child {
  margin-bottom: 0;
  padding-bottom: 0;
  border-bottom: none;
}
.guardian-news__dateline {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 6px 8px;
  margin: 0 0 4px 0;
}
.guardian-news__when {
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--gu-muted);
}
.guardian-news__badges { font-size: 0.62rem; color: var(--gu-muted); }
.guardian-news__badge { font-style: italic; }
.guardian-news__sep { opacity: 0.7; }
.guardian-news__headline {
  margin: 0 0 2px 0;
  font-size: 1.05rem;
  font-weight: 700;
  line-height: 1.22;
  color: var(--gu-ink);
}
.guardian-news__byline {
  margin: 0 0 6px 0;
  font-size: 0.68rem;
  font-style: italic;
  color: var(--gu-muted);
}
.guardian-news__quote {
  margin: 0 0 8px 0;
  padding: 0;
  border: none;
}
.guardian-news__quote p {
  margin: 0;
  font-size: 0.78rem;
  line-height: 1.45;
  color: var(--gu-ink-soft);
}
.guardian-news__link {
  display: inline-block;
  font-size: 0.68rem;
  font-weight: 700;
  font-style: italic;
  color: var(--gu-blue);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.guardian-news__link:hover { color: #000; }
.guardian-in-the-news__attr {
  margin: 10px 0 0 0;
  padding-top: 10px;
  border-top: 1px solid rgba(5, 41, 98, 0.22);
  text-align: center;
}
.guardian-in-the-news__powered {
  display: inline-block;
  line-height: 0;
}
.guardian-in-the-news__powered img {
  display: block;
  max-width: 140px;
  height: auto;
}
:root[data-theme="dark"] .guardian-in-the-news,
body[data-theme="dark"] .guardian-in-the-news {
  --gu-ink: #121212;
  --gu-ink-soft: #1a1a1a;
  --gu-muted: #4a4a4a;
  --gu-paper: #ebe8e0;
  --gu-edge: #6a6a6a;
  box-shadow:
    1px 1px 0 rgba(255, 255, 255, 0.28) inset,
    2px 3px 0 rgba(0, 0, 0, 0.2),
    6px 14px 28px rgba(0, 0, 0, 0.45);
}

.recent-change__glyph {
  flex: 0 0 auto;
  width: 22px;
  height: 22px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  margin-top: 1px;
  border-radius: 50%;
  font-size: 0.78rem;
  line-height: 1;
  color: var(--gold-bright, var(--gold));
  background: color-mix(in srgb, var(--gold) 12%, transparent);
  border: 1px solid color-mix(in srgb, var(--gold) 34%, transparent);
}
.recent-change__item--closing .recent-change__glyph {
  color: var(--news-closing, #c0563f);
  background: color-mix(in srgb, #c0563f 12%, transparent);
  border-color: color-mix(in srgb, #c0563f 34%, transparent);
}
.recent-change__item--badge_change .recent-change__glyph {
  color: var(--contrast-green-strong, var(--gold-deep, #97b07f));
  background: color-mix(in srgb, var(--contrast-green-strong, #97b07f) 12%, transparent);
  border-color: color-mix(in srgb, var(--contrast-green-strong, #97b07f) 34%, transparent);
}
.recent-change__content { flex: 1 1 auto; min-width: 0; }
.recent-change__head {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 3px;
}
.recent-change__type {
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--text);
}
.recent-change__when {
  font-size: 0.8rem;
  font-weight: 500;
  color: var(--text-muted);
  font-variant-numeric: tabular-nums;
}
.recent-change__headline {
  display: block;
  font-size: 0.92rem;
  line-height: 1.45;
  color: var(--text);
}
/* Brand-modal "In the news": property label prefix on each portfolio row. */
.recent-change__prop {
  display: block;
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.02em;
  color: var(--brand-hue, var(--gold));
  margin-bottom: 2px;
}
.recent-changes--brand {
  margin-top: 4px;
}
.recent-change__fromto {
  display: inline-flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 7px;
}
.recent-change__pill {
  font-size: 0.82rem;
  font-weight: 600;
  color: var(--text-muted);
  background: var(--bg-elevated, var(--surface));
  border: 1px solid color-mix(in srgb, var(--text) 14%, transparent);
  padding: 2px 10px;
  border-radius: 999px;
}
.recent-change__pill--to {
  color: var(--text);
  border-color: color-mix(in srgb, var(--gold) 45%, transparent);
}
.recent-change__arrow {
  color: var(--text-muted);
  font-weight: 600;
}
.recent-change__srcs {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 5px;
}
.recent-change__src {
  font-size: 0.76rem;
  font-weight: 600;
  color: var(--gold);
  text-decoration: none;
}
.recent-change__src:hover { text-decoration: underline; }

@media (max-width: 640px) {
  .modal-caution { gap: var(--space-2); padding: var(--space-3); }
  .modal-caution__text { font-size: 0.92rem; }
  .badge-timeline { padding: var(--space-3); }
  .recent-changes { padding: var(--space-3); }
}

/* ============================================================
   Phase 28: Enrichment-driven modal sections.
   Chips row, sentiment bars, nearest-atlas-hotels list.
   ============================================================ */

/* Chips row sits right under .modal-pitch / .modal-meta-row, above the
   price block. Compact pills that summarize hotel class, check-in/out
   times, typical rate, eco status — derived from SerpAPI enrichment. */
.modal-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: var(--space-3) 0 var(--space-5) 0;
}
.modal-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  font-family: var(--font-body);
  font-size: 0.78rem;
  color: var(--text);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 999px;
  white-space: nowrap;
}
.modal-chip strong {
  font-weight: 600;
  font-size: 0.7rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin-right: 2px;
}
.modal-chip--class {
  color: var(--gold);
  border-color: var(--border-strong);
  font-weight: 500;
  letter-spacing: 0.04em;
}
.modal-chip--eco {
  color: #2f8a52;
  border-color: rgba(47, 138, 82, 0.32);
  background: rgba(47, 138, 82, 0.08);
  font-weight: 500;
}
:root[data-theme="dark"] .modal-chip--eco { color: #6fcf97; }

/* Nearest LHA hotels list inside the Neighborhood section. */
.modal-nearest {
  margin-top: var(--space-4);
  padding-top: var(--space-3);
  border-top: 1px dashed var(--border);
}
.modal-nearest-label {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 0.68rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin-bottom: var(--space-2);
}
.modal-nearest-list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.modal-nearest-item {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-3);
  font-family: var(--font-body);
  font-size: 0.92rem;
  padding: 6px 0;
  border-bottom: 1px solid var(--border);
}
.modal-nearest-item:last-child { border-bottom: none; }
.modal-nearest-name {
  color: var(--text);
  font-weight: 500;
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.modal-nearest-meta {
  color: var(--text-muted);
  font-size: 0.8rem;
  flex-shrink: 0;
  text-align: right;
}

/* Guest Sentiment bars from reviews_breakdown. Stacked pos / neu / neg. */
.modal-sentiment {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}
.modal-sentiment-row {
  font-family: var(--font-body);
}
.modal-sentiment-head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  margin-bottom: 4px;
}
.modal-sentiment-name {
  font-size: 0.92rem;
  font-weight: 500;
  color: var(--text);
}
.modal-sentiment-count {
  font-size: 0.75rem;
  color: var(--text-muted);
}
.modal-sentiment-bar {
  display: flex;
  width: 100%;
  height: 6px;
  border-radius: 999px;
  overflow: hidden;
  background: var(--border);
}
.modal-sentiment-bar span { display: block; height: 100%; }
.modal-sentiment-pos { background: #4caf76; }
.modal-sentiment-neu { background: rgba(160, 160, 160, 0.5); }
.modal-sentiment-neg { background: #d2756a; }
:root[data-theme="dark"] .modal-sentiment-pos { background: #5fbe87; }
:root[data-theme="dark"] .modal-sentiment-neg { background: #de8a7e; }

/* ============================================================
   Red Flag / Green Flag system (v1)
   Data-driven flags computed at build time. Green = strength,
   Red = concern. Palette reuses the existing sentiment greens
   and reds so the bars and pills read as one visual language.
   ============================================================ */
:root {
  --flag-green: #3f9e6b;
  --flag-green-bg: rgba(76, 175, 118, 0.12);
  --flag-green-border: rgba(76, 175, 118, 0.4);
  --flag-red: #c4574b;
  --flag-red-bg: rgba(210, 117, 106, 0.12);
  --flag-red-border: rgba(210, 117, 106, 0.42);
  --flag-neu: rgba(160, 160, 160, 0.5);
}
:root[data-theme="dark"] {
  --flag-green: #5fbe87;
  --flag-green-bg: rgba(95, 190, 135, 0.14);
  --flag-green-border: rgba(95, 190, 135, 0.36);
  --flag-red: #de8a7e;
  --flag-red-bg: rgba(222, 138, 126, 0.14);
  --flag-red-border: rgba(222, 138, 126, 0.38);
}

/* --- Card flag pills ---------------------------------------------------- */
.card-flags {
  display: flex;
  flex-wrap: wrap;
  gap: 5px;
  margin: 8px 0 2px;
  max-width: 100%;
  min-width: 0;
  align-items: center;
}
/* Green/red flag wash lives on this inner wrap only — never on the LHA Tier chip. */
.card-flags-signals {
  display: flex;
  flex-wrap: wrap;
  gap: 5px;
  flex: 1 1 auto;
  min-width: 0;
  align-items: center;
}
/* CARD-TIER-CHIP-2026 — Map Size 3 / Directory peacock fills on the card
   flags row. T1 quiet bronze, T3 gold, T4 emerald, T5 sapphire, T6 royal
   purple. Ungated is muted gray and must not read as T1.
   Isolation + higher specificity keep peacock fills off the flag-highlight
   overlay (row wash, sibling red/pink glow, later .flag-pill border shorthand). */
.flag-pill.flag-pill--lha-tier {
  flex-shrink: 0;
  isolation: isolate;
  position: relative;
  z-index: 1;
  gap: 4px;
  font-family: var(--font-display);
  font-weight: 700;
  letter-spacing: 0.03em;
}
.flag-pill-lha-label {
  font-size: 0.6rem;
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  opacity: 0.88;
}
.flag-pill-lha-roman {
  font-family: var(--font-display);
  font-size: 0.84rem;
  font-weight: 800;
  letter-spacing: 0.02em;
  line-height: 1;
}
.flag-pill.flag-pill--lha-tier--t1 {
  border-color: color-mix(in srgb, #6a4f17 40%, transparent);
  background: color-mix(in srgb, #6a4f17 7%, transparent);
  color: #6a4f17;
}
.flag-pill.flag-pill--lha-tier--t2 {
  border-color: color-mix(in srgb, #c6a766 50%, transparent);
  background: color-mix(in srgb, #c6a766 16%, transparent);
  color: #6a4f17;
}
.flag-pill.flag-pill--lha-tier--t3 {
  border-color: #9b7f45;
  background: linear-gradient(135deg, #e7cf8f, #c9a94f);
  color: #3a2a08;
  box-shadow: 0 1px 4px rgba(155, 127, 69, 0.35);
}
.flag-pill.flag-pill--lha-tier--t4 {
  border-color: #0b5049;
  background: linear-gradient(135deg, #0f6e63 0%, #12897a 55%, #1aa891 100%);
  color: #f4efe0;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35);
  box-shadow: 0 1px 5px rgba(15, 110, 99, 0.4);
}
.flag-pill.flag-pill--lha-tier--t5 {
  border-color: #d6bd82;
  background: linear-gradient(135deg, #1b2c6b 0%, #2a3f9e 50%, #3f5fd6 100%);
  color: #f6f1e4;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
  box-shadow: 0 1px 6px rgba(27, 44, 107, 0.45);
}
.flag-pill.flag-pill--lha-tier--t6 {
  border-color: #d6bd82;
  background: linear-gradient(135deg, #3c1a5c 0%, #5a2d8a 45%, #8a4ec8 100%);
  color: #f6f1e4;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
  box-shadow: 0 1px 7px rgba(60, 26, 92, 0.5);
}
.flag-pill.flag-pill--lha-tier--ungated {
  border-color: color-mix(in srgb, var(--text-faint) 50%, transparent);
  background: color-mix(in srgb, var(--text-faint) 8%, transparent);
  color: var(--text-faint);
  font-weight: 600;
}
:root[data-theme="dark"] .flag-pill.flag-pill--lha-tier--t1 {
  border-color: color-mix(in srgb, #d9bf82 34%, transparent);
  background: color-mix(in srgb, #d9bf82 8%, transparent);
  color: #d4c4a0;
}
:root[data-theme="dark"] .flag-pill.flag-pill--lha-tier--t2 {
  border-color: color-mix(in srgb, #d9bf82 46%, transparent);
  background: color-mix(in srgb, #d9bf82 14%, transparent);
  color: #d9bf82;
}
:root[data-theme="dark"] .flag-pill.flag-pill--lha-tier--ungated {
  border-color: color-mix(in srgb, #aab4c8 28%, transparent);
  background: color-mix(in srgb, #aab4c8 8%, transparent);
  color: #8b95a8;
}
.card-flags--green-tier-2 {
  padding: 3px 4px;
  margin-left: -4px;
  margin-right: -4px;
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--flag-green) 6%, transparent);
}
.card-flags--green-tier-3 {
  padding: 4px 5px;
  margin-left: -5px;
  margin-right: -5px;
  border-radius: var(--radius-sm);
  background: linear-gradient(135deg,
    color-mix(in srgb, var(--flag-green) 14%, transparent),
    color-mix(in srgb, var(--flag-green) 6%, transparent));
  box-shadow: 0 0 14px color-mix(in srgb, var(--flag-green) 22%, transparent);
}
.flag-pill {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-family: var(--font-body);
  font-size: 0.74rem;
  font-weight: 500;
  font-style: normal;
  letter-spacing: 0.02em;
  text-transform: none;
  line-height: 1;
  padding: 4px 8px;
  border-radius: 999px;
  border: 1px solid transparent;
  white-space: nowrap;
}
/* Flag glyph inside each pill. Inherits the pill's text color via
   currentColor, so the green pill shows a green flag and the red pill a
   red flag. Replaces the previous generic colored dot. */
.flag-pill-icon {
  flex-shrink: 0;
  display: block;
}
.flag-pill--green {
  color: var(--flag-green);
  background: var(--flag-green-bg);
  border-color: var(--flag-green-border);
}
/* Green-flag count tiers — card pills (2 = 3–4 flags … 3 = 5+ standout cluster). */
.flag-pill--green.flag-pill--green-tier-2 {
  color: #1f8f55;
  background: rgba(34, 197, 94, 0.16);
  border-color: rgba(34, 197, 94, 0.42);
  box-shadow: 0 0 8px rgba(34, 197, 94, 0.22);
}
.flag-pill--green.flag-pill--green-tier-3,
.flag-pill--green.flag-pill--green-cluster {
  color: #fff;
  background: linear-gradient(135deg, #047857 0%, #10b981 55%, #34d399 100%);
  border-color: #065f46;
  font-weight: 600;
  box-shadow:
    0 0 10px rgba(16, 185, 129, 0.45),
    0 0 0 1px rgba(5, 150, 105, 0.35);
}
.flag-pill--green-cluster .flag-pill-label {
  white-space: nowrap;
}
:root[data-theme="light"] .flag-pill--green.flag-pill--green-tier-2 {
  color: #157a42;
  background: rgba(34, 197, 94, 0.14);
  border-color: rgba(34, 197, 94, 0.48);
  box-shadow: 0 0 10px rgba(34, 197, 94, 0.28);
}
:root[data-theme="light"] .flag-pill--green.flag-pill--green-tier-3,
:root[data-theme="light"] .flag-pill--green.flag-pill--green-cluster {
  color: #fff;
  background: linear-gradient(135deg, #047857 0%, #059669 50%, #10b981 100%);
  border-color: #065f46;
  box-shadow:
    0 0 12px rgba(16, 185, 129, 0.5),
    0 0 0 1px rgba(5, 150, 105, 0.4);
}
.flag-pill--red {
  color: var(--flag-red);
  background: var(--flag-red-bg);
  border-color: var(--flag-red-border);
}

/* Red-flag count tiers — card pills (1 = mildest solid brick … 7 = orange alarm).
   Tiers 1–3 use white type on opaque reds (never red-on-red wash). */
.flag-pill--red.flag-pill--red-tier-1 {
  color: #fff;
  background: #8a4840;
  border-color: #744038;
  font-weight: 600;
}
.flag-pill--red.flag-pill--red-tier-2 {
  color: #fff;
  background: #a03028;
  border-color: #882820;
  font-weight: 600;
}
.flag-pill--red.flag-pill--red-tier-3 {
  color: #fff;
  background: #b02820;
  border-color: #962018;
  font-weight: 700;
}
.flag-pill--red.flag-pill--red-tier-4 {
  color: #fff;
  background: color-mix(in srgb, #b83228 82%, transparent);
  border-color: rgba(184, 50, 40, 0.62);
  font-weight: 700;
}
.flag-pill--red.flag-pill--red-tier-5 {
  color: #fff;
  background: #b02820;
  border-color: #801810;
  font-weight: 700;
  box-shadow:
    0 0 7px rgba(255, 120, 150, 0.28),
    0 0 14px rgba(255, 100, 130, 0.12);
}
.flag-pill--red.flag-pill--red-tier-6 {
  color: #fff;
  background: linear-gradient(135deg, #9a1830 0%, #c02848 100%);
  border-color: #7a1028;
  font-weight: 700;
  box-shadow:
    0 0 10px rgba(255, 90, 140, 0.52),
    0 0 22px rgba(255, 70, 120, 0.32),
    0 0 0 1px rgba(255, 150, 180, 0.22);
}
.flag-pill--red.flag-pill--red-tier-7 {
  color: #fff;
  background: linear-gradient(135deg, #b83018 0%, #d04820 55%, #e85828 100%);
  border-color: #a02810;
  font-weight: 700;
  box-shadow:
    0 0 12px rgba(255, 120, 50, 0.52),
    0 0 26px rgba(255, 80, 30, 0.36),
    0 0 0 1px rgba(255, 160, 80, 0.28);
}
:root[data-theme="light"] .flag-pill--red.flag-pill--red-tier-1 {
  color: #fff;
  background: #883830;
  border-color: #702c28;
}
:root[data-theme="light"] .flag-pill--red.flag-pill--red-tier-2 {
  color: #fff;
  background: #962820;
  border-color: #7e2018;
}
:root[data-theme="light"] .flag-pill--red.flag-pill--red-tier-3 {
  color: #fff;
  background: #a82820;
  border-color: #902018;
}
:root[data-theme="light"] .flag-pill--red.flag-pill--red-tier-4 {
  color: #fff;
  background: color-mix(in srgb, #a82818 80%, transparent);
  border-color: rgba(168, 40, 30, 0.58);
}
:root[data-theme="light"] .flag-pill--red.flag-pill--red-tier-5 {
  color: #fff;
  background: #962018;
  border-color: #701410;
  box-shadow:
    0 0 8px rgba(255, 110, 140, 0.32),
    0 0 16px rgba(255, 90, 120, 0.16);
}
:root[data-theme="light"] .flag-pill--red.flag-pill--red-tier-6 {
  background: linear-gradient(135deg, #8a1428 0%, #b02040 100%);
  border-color: #6a0e20;
  box-shadow:
    0 0 11px rgba(255, 80, 130, 0.55),
    0 0 24px rgba(255, 60, 110, 0.34);
}
:root[data-theme="light"] .flag-pill--red.flag-pill--red-tier-7 {
  background: linear-gradient(135deg, #a82814 0%, #c84018 55%, #e05020 100%);
  border-color: #902008;
  box-shadow:
    0 0 13px rgba(255, 110, 45, 0.55),
    0 0 28px rgba(255, 75, 25, 0.38);
}

/* --- Severity pill (#2) — concern / serious variants ------------------- */
/* Card chips: white on opaque reds (serious) or dark on warm peach (concern).
   Intensity still ramps via is-red-tier-N; contrast meets WCAG AA.          */
.flag-pill--severity {
  /* Slightly larger font-weight + padding to stand out from the regular pills */
  font-size: 0.69rem;
  font-weight: 700;
  padding: 4px 9px;
  gap: 5px;
  white-space: nowrap;              /* must never wrap — spec requirement */
}
.flag-pill--severity .flag-severity-label {
  white-space: nowrap;
}
.flag-pill--severity .flag-severity-count {
  white-space: nowrap;
  opacity: 0.85;
  font-weight: 600;
  font-size: 0.63rem;
  letter-spacing: 0.02em;
}

/* SERIOUS — intensity scales with is-red-tier-N (flag count). Tier 1 = mildest
   opaque brick; 2–3 ramp saturation; 4+ solid red + glow. */
.flag-pill--severity.is-serious.is-red-tier-1 {
  color: #fff;
  background: #8a4840;
  border-color: #744038;
  font-weight: 600;
}
.flag-pill--severity.is-serious.is-red-tier-2 {
  color: #fff;
  background: #a03028;
  border-color: #882820;
  font-weight: 600;
}
.flag-pill--severity.is-serious.is-red-tier-3 {
  color: #fff;
  background: #b02820;
  border-color: #962018;
  font-weight: 700;
}
.flag-pill--severity.is-serious.is-red-tier-4 {
  color: #fff;
  background: color-mix(in srgb, #b83228 86%, transparent);
  border-color: rgba(184, 50, 40, 0.68);
}
.flag-pill--severity.is-serious.is-red-tier-5 {
  color: #fff;
  background: #b02820;
  border-color: #801810;
  box-shadow:
    0 0 8px rgba(255, 120, 150, 0.34),
    0 0 16px rgba(255, 100, 130, 0.16);
}
.flag-pill--severity.is-serious.is-red-tier-6 {
  color: #fff;
  background: linear-gradient(135deg, #9a1830 0%, #c02848 100%);
  border-color: #7a1028;
  box-shadow:
    0 0 10px rgba(255, 90, 140, 0.58),
    0 0 22px rgba(255, 70, 120, 0.36),
    0 0 0 1px rgba(255, 150, 180, 0.24);
}
.flag-pill--severity.is-serious.is-red-tier-7 {
  color: #fff;
  background: linear-gradient(135deg, #b83018 0%, #d04820 55%, #e85828 100%);
  border-color: #a02810;
  box-shadow:
    0 0 12px rgba(255, 120, 50, 0.58),
    0 0 26px rgba(255, 80, 30, 0.4),
    0 0 0 1px rgba(255, 160, 80, 0.3);
}
:root[data-theme="light"] .flag-pill--severity.is-serious.is-red-tier-1 {
  color: #fff;
  background: #883830;
  border-color: #702c28;
}
:root[data-theme="light"] .flag-pill--severity.is-serious.is-red-tier-2 {
  color: #fff;
  background: #962820;
  border-color: #7e2018;
}
:root[data-theme="light"] .flag-pill--severity.is-serious.is-red-tier-3 {
  color: #fff;
  background: #a82820;
  border-color: #902018;
}
:root[data-theme="light"] .flag-pill--severity.is-serious.is-red-tier-4 {
  color: #fff;
  background: color-mix(in srgb, #a82818 84%, transparent);
  border-color: rgba(168, 40, 30, 0.65);
}
:root[data-theme="light"] .flag-pill--severity.is-serious.is-red-tier-5 {
  color: #fff;
  background: #962018;
  border-color: #701410;
  box-shadow:
    0 0 9px rgba(255, 110, 140, 0.36),
    0 0 18px rgba(255, 90, 120, 0.18);
}
:root[data-theme="light"] .flag-pill--severity.is-serious.is-red-tier-6 {
  background: linear-gradient(135deg, #8a1428 0%, #b02040 100%);
  border-color: #6a0e20;
  box-shadow:
    0 0 11px rgba(255, 80, 130, 0.58),
    0 0 24px rgba(255, 60, 110, 0.36);
}
:root[data-theme="light"] .flag-pill--severity.is-serious.is-red-tier-7 {
  background: linear-gradient(135deg, #a82814 0%, #c84018 55%, #e05020 100%);
  border-color: #902008;
  box-shadow:
    0 0 13px rgba(255, 110, 45, 0.58),
    0 0 28px rgba(255, 75, 25, 0.4);
}

/* CONCERN — warm peach chip; softer than serious, still in the red family */
.flag-pill--severity.is-concern {
  color: #2a0e08;
  background: #d88068;
  border-color: #b85848;
}
:root[data-theme="light"] .flag-pill--severity.is-concern {
  color: #2a0e08;
  background: #d07860;
  border-color: #b05040;
}

/* --- Data-confidence pills (#3) --------------------------------------- */
/* Rendered on no-flag cards instead of silence: "No concerns found"       */
/* (verified) and "Limited review data" / "Not enough data yet" (other).  */
/* Both pills are SUBORDINATE to real flag pills: lighter weight, muted    */
/* palette so they never compete with genuine red/green signals.           */
/* WCAG contrast verified:                                                  */
/*   verified:     #1a2e1a on #d4edda -> 7.2:1 (AAA)                      */
/*   insufficient: #2a2a2e on #e8e8ee -> 7.8:1 (AAA)                      */
/* white-space:nowrap prevents mid-word wrapping (spec requirement).       */
.flag-pill--confidence {
  font-size: 0.67rem;           /* slightly smaller than flag pills */
  font-weight: 500;             /* lighter than 600 flag pills — subordinate */
  white-space: nowrap;          /* never wraps — spec requirement */
  letter-spacing: 0.01em;
}
.flag-pill--confidence .flag-pill-label {
  white-space: nowrap;
}

/* VERIFIED-CLEAN — soft teal/green tint, calm check icon.                */
/* Reads as "we vetted this, it's fine" — NOT loud like GF excellence.    */
.flag-pill--confidence.is-verified {
  color: #1a3d2b;               /* dark green text, high contrast on tint */
  background: #d6f0e0;          /* soft muted green tint */
  border-color: #a8d8b8;        /* muted green border */
}
:root[data-theme="light"] .flag-pill--confidence.is-verified {
  color: #1a3d2b;
  background: #ccebd8;          /* slightly deeper for light card bg */
  border-color: #96c9aa;
}

/* INSUFFICIENT/LIMITED — muted neutral grey, info icon.                  */
/* Reads as "we don't know yet" — clearly NON-judgmental.                 */
.flag-pill--confidence.is-insufficient {
  color: #3a3a44;               /* dark neutral text */
  background: #e8e8ef;          /* very light grey/blue tint */
  border-color: #c8c8d4;        /* soft grey border */
}
:root[data-theme="light"] .flag-pill--confidence.is-insufficient {
  color: #2e2e38;
  background: #e0e0e8;          /* slightly deeper for light card bg */
  border-color: #bbbbc8;
}

/* --- Overflow pill (DECLUTTER-CARDS-2026 / QA Fix #7) ------------------- */
/* Calm "+N" pill shown when green (or, on severity-free cards, red) pills  */
/* are capped. Deliberately neutral and subordinate so it never competes    */
/* with a real colored signal — it just whispers "there's more inside".      */
.flag-pill--overflow {
  color: var(--text-secondary, #8a8a92);
  background: color-mix(in srgb, var(--text-secondary, #8a8a92) 12%, transparent);
  border-color: color-mix(in srgb, var(--text-secondary, #8a8a92) 26%, transparent);
  font-size: 0.64rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  padding: 4px 7px;
  white-space: nowrap;
}
:root[data-theme="light"] .flag-pill--overflow {
  color: #6a6a74;
  background: #ececf1;
  border-color: #d4d4dc;
}
.flag-pill--overflow.flag-pill--overflow-green {
  color: #157a42;
  background: rgba(34, 197, 94, 0.12);
  border-color: rgba(34, 197, 94, 0.38);
  font-weight: 700;
}
.flag-pill--overflow.flag-pill--overflow-green.flag-pill--green-tier-2 {
  box-shadow: 0 0 6px rgba(34, 197, 94, 0.25);
}
.flag-pill--overflow.flag-pill--overflow-green.flag-pill--green-tier-3 {
  color: #fff;
  background: linear-gradient(135deg, #059669, #10b981);
  border-color: #047857;
  box-shadow: 0 0 8px rgba(16, 185, 129, 0.4);
}

/* --- Modal flags summary ----------------------------------------------- */
/* Empty-state note (Item #3: shown when a hotel has no flags) */
.modal-flags-empty-note {
  font-size: 0.82rem;
  color: var(--text-secondary, #aaa);
  margin: var(--space-2) 0 0;
  line-height: 1.5;
}
.modal-flags-section { margin-top: var(--space-4); }
.modal-flags-group { margin-top: var(--space-3); }
.modal-flags-group:first-child { margin-top: 0; }
.modal-flags-group-label {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.68rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin-bottom: 4px;
}
.modal-flags-group--standout .modal-flags-group-label { color: color-mix(in srgb, var(--flag-green-border, #3a7) 80%, var(--text)); }
.modal-flags-group--alerts .modal-flags-group-label { color: color-mix(in srgb, var(--flag-red-border, #c44) 85%, var(--text)); }
.modal-flags-group-intro {
  margin: 0 0 var(--space-2);
  font-size: 0.78rem;
  color: var(--text-muted);
  line-height: 1.45;
}
.modal-aqs-summary {
  margin: 0 0 var(--space-3);
  padding: 10px 12px;
  border-radius: var(--radius-sm);
  font-family: var(--font-serif);
  font-size: 0.92rem;
  font-weight: 600;
  line-height: 1.4;
  background: color-mix(in srgb, var(--accent-blue, #4a7c9b) 8%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--accent-blue, #4a7c9b) 28%, var(--border));
  cursor: help;
}
.modal-flags-severity-note {
  margin: 0 0 var(--space-2);
  font-size: 0.8rem;
  line-height: 1.45;
  padding: 8px 10px;
  border-radius: var(--radius-sm);
}
.modal-flags-severity-note--concern {
  color: #8a5a10;
  background: color-mix(in srgb, #e88a1a 12%, var(--surface));
  border: 1px solid color-mix(in srgb, #e88a1a 35%, transparent);
}
.modal-flags-severity-note--serious {
  color: color-mix(in srgb, var(--flag-red) 88%, var(--text));
  background: color-mix(in srgb, var(--flag-red) 14%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--flag-red-border) 48%, transparent);
}
:root[data-theme="light"] .modal-flags-severity-note--serious {
  color: #7a2818;
  background: color-mix(in srgb, var(--flag-red) 10%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--flag-red-border) 42%, transparent);
}
.modal-flag--lead {
  border-width: 2px;
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--flag-green-border) 25%, transparent);
}
.modal-flag--supporting { opacity: 0.92; }
.modal-flag-support-tag {
  display: inline-block;
  margin-left: 8px;
  font-family: var(--font-display);
  font-size: 0.52rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  padding: 2px 7px;
  border-radius: 999px;
  color: var(--text-muted);
  background: color-mix(in srgb, var(--border) 40%, transparent);
  vertical-align: middle;
}
.modal-flag-cat-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin: 8px 0 4px;
}
.modal-flag-cat-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 3px 9px;
  border-radius: 999px;
  font-family: var(--font-body);
  font-size: 0.72rem;
  line-height: 1.2;
  color: var(--text);
  background: color-mix(in srgb, var(--flag-green-bg) 85%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--flag-green-border) 40%, transparent);
}
.modal-flag-cat-chip-pct {
  font-family: var(--font-serif);
  font-size: 0.68rem;
  font-weight: 600;
  color: var(--text-muted);
}
.modal-flag-catbars {
  display: flex;
  flex-direction: column;
  gap: 5px;
  margin: 8px 0 6px;
}
.modal-flag-catbar-row {
  display: grid;
  grid-template-columns: minmax(5.5em, 7.5em) 1fr 2.4em;
  align-items: center;
  gap: 8px;
}
.modal-flag-catbar-name {
  font-size: 0.72rem;
  color: var(--text-muted);
  line-height: 1.2;
}
.modal-flag-catbar-track {
  height: 6px;
  border-radius: 3px;
  background: rgba(160, 160, 160, 0.18);
  overflow: hidden;
}
.modal-flag-catbar-fill {
  display: block;
  height: 100%;
  border-radius: 3px;
}
.modal-flag-catbar-fill--green {
  background: linear-gradient(90deg, rgba(60, 140, 90, 0.45), var(--flag-green-border, #3a7));
}
.modal-flag-catbar-val {
  font-family: var(--font-serif);
  font-size: 0.72rem;
  font-weight: 600;
  text-align: right;
}
.modal-review-themes {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin: 8px 0 6px;
}
.modal-review-theme {
  padding: 8px 10px;
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--flag-green-bg) 70%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--flag-green-border) 35%, transparent);
}
.modal-review-theme-label {
  display: block;
  font-family: var(--font-display);
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin-bottom: 4px;
}
.modal-review-theme-quote {
  display: block;
  font-size: 0.78rem;
  font-style: italic;
  line-height: 1.4;
  color: var(--text);
}
.flag-pill--supporting {
  opacity: 0.88;
  border-style: dashed;
}
.flag-pill-label { /* wraps long card_short text cleanly */ }
.modal-flags {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}
.modal-flag {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 10px 12px;
  border-radius: var(--radius-md);
  border: 1px solid var(--border);
}
.modal-flag--green { background: var(--flag-green-bg); border-color: var(--flag-green-border); }
.modal-flag--red { background: var(--flag-red-bg); border-color: var(--flag-red-border); }
.modal-flags-red-summary {
  display: inline-flex;
  align-items: center;
  font-family: var(--font-body);
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  padding: 3px 8px;
  border-radius: 999px;
  border: 1px solid transparent;
  margin-bottom: 8px;
}
.modal-flags-red-summary.is-red-tier-1 {
  color: #fff;
  background: #8a4840;
  border-color: #744038;
}
.modal-flags-red-summary.is-red-tier-2 {
  color: #fff;
  background: #a03028;
  border-color: #882820;
}
.modal-flags-red-summary.is-red-tier-3 {
  color: #fff;
  background: #b02820;
  border-color: #962018;
}
.modal-flags-red-summary.is-red-tier-4 {
  color: #fff;
  background: color-mix(in srgb, #b83228 82%, transparent);
  border-color: rgba(184, 50, 40, 0.62);
}
.modal-flags-red-summary.is-red-tier-5 {
  color: #fff;
  background: #b02820;
  border-color: #801810;
  box-shadow: 0 0 8px rgba(255, 120, 150, 0.28);
}
.modal-flags-red-summary.is-red-tier-6 {
  color: #fff;
  background: linear-gradient(135deg, #9a1830 0%, #c02848 100%);
  border-color: #7a1028;
  box-shadow:
    0 0 10px rgba(255, 90, 140, 0.5),
    0 0 20px rgba(255, 70, 120, 0.3);
}
.modal-flags-red-summary.is-red-tier-7 {
  color: #fff;
  background: linear-gradient(135deg, #b83018 0%, #d04820 55%, #e85828 100%);
  border-color: #a02810;
  box-shadow:
    0 0 12px rgba(255, 120, 50, 0.5),
    0 0 24px rgba(255, 80, 30, 0.34);
}
/* Modal red flag rows — subtle tint at every count tier (card/map pills keep solid is-red-tier ramps). */
.modal-flags.has-red-flags .modal-flag--red {
  --flag-red-bg: color-mix(in srgb, var(--flag-red) 14%, transparent);
  --flag-red-border: color-mix(in srgb, var(--flag-red) 38%, transparent);
}
.modal-flags.has-red-flags.is-red-tier-4 .modal-flag--red,
.modal-flags.has-red-flags.is-red-tier-5 .modal-flag--red,
.modal-flags.has-red-flags.is-red-tier-6 .modal-flag--red,
.modal-flags.has-red-flags.is-red-tier-7 .modal-flag--red {
  --flag-red-bg: color-mix(in srgb, var(--flag-red) 20%, transparent);
  --flag-red-border: color-mix(in srgb, var(--flag-red) 48%, transparent);
}
.modal-flags.has-red-flags .modal-flag--red.modal-flag--lead {
  border-width: 2px;
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--flag-red-border) 28%, transparent);
}
:root[data-theme="light"] .modal-flags.has-red-flags .modal-flag--red {
  --flag-red-bg: color-mix(in srgb, var(--flag-red) 12%, var(--surface));
  --flag-red-border: color-mix(in srgb, var(--flag-red) 34%, transparent);
}
:root[data-theme="light"] .modal-flags.has-red-flags.is-red-tier-4 .modal-flag--red,
:root[data-theme="light"] .modal-flags.has-red-flags.is-red-tier-5 .modal-flag--red,
:root[data-theme="light"] .modal-flags.has-red-flags.is-red-tier-6 .modal-flag--red,
:root[data-theme="light"] .modal-flags.has-red-flags.is-red-tier-7 .modal-flag--red {
  --flag-red-bg: color-mix(in srgb, var(--flag-red) 18%, var(--surface));
  --flag-red-border: color-mix(in srgb, var(--flag-red) 44%, transparent);
}
:root[data-theme="light"] .modal-flags-red-summary.is-red-tier-1 {
  color: #fff;
  background: #883830;
  border-color: #702c28;
}
:root[data-theme="light"] .modal-flags-red-summary.is-red-tier-2 {
  color: #fff;
  background: #962820;
  border-color: #7e2018;
}
:root[data-theme="light"] .modal-flags-red-summary.is-red-tier-3 {
  color: #fff;
  background: #a82820;
  border-color: #902018;
}
.modal-flag-dot {
  width: 9px;
  height: 9px;
  border-radius: 50%;
  flex-shrink: 0;
  margin-top: 4px;
}
.modal-flag--green .modal-flag-dot { background: var(--flag-green); }
.modal-flag--red .modal-flag-dot { background: var(--flag-red); }
.modal-flag-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.modal-flag-label {
  font-family: var(--font-body);
  font-size: 0.92rem;
  font-weight: 500;
  font-style: normal;
  letter-spacing: 0.01em;
  text-transform: none;
  color: var(--text);
}
.modal-flag--green .modal-flag-label { color: var(--flag-green); }
.modal-flag--red .modal-flag-label { color: var(--flag-red); }
.modal-flag-detail {
  font-size: 0.8rem;
  color: var(--text-muted);
  line-height: 1.4;
}
/* RF-SENT: a warm intro line followed by one row per problem category, so
   the red box grows taller the more areas guests complain about. */
.modal-flag-sent-intro {
  display: block;
  margin-bottom: 8px;
}
.modal-flag-cats {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.modal-flag-cat {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 10px;
  padding: 4px 9px;
  border-radius: var(--radius-sm, 6px);
  background: var(--flag-red-bg);
  border: 1px solid var(--flag-red-border);
}
.modal-flag-cat-name {
  font-weight: 600;
  color: var(--flag-red);
}
.modal-flag-cat-stat {
  font-size: 0.74rem;
  color: var(--text-muted);
  white-space: nowrap;
}
/* The worst offenders (>=50% of guests complaining) read a little louder. */
.modal-flag-cat--egregious {
  background: var(--flag-red-bg);
  border-color: var(--flag-red);
  box-shadow: inset 3px 0 0 0 var(--flag-red);
}
.modal-flag-cat--egregious .modal-flag-cat-stat {
  color: var(--flag-red);
  font-weight: 600;
}
.modal-flag-cat--more {
  background: transparent;
  border: none;
  padding: 2px 9px 0;
  font-style: italic;
  color: var(--text-muted);
  justify-content: flex-start;
}

/* --- RF-COND: condition/upkeep representative quote list (#5) ----------- */
.modal-flag-cond-quotes {
  list-style: none;
  padding: 0;
  margin: 6px 0 0;
  display: flex;
  flex-direction: column;
  gap: 5px;
}
.modal-flag-cond-quote {
  padding: 6px 10px;
  border-radius: var(--radius-sm, 6px);
  background: var(--flag-red-bg);
  border: 1px solid var(--flag-red-border);
  font-size: 0.78rem;
  line-height: 1.5;
  color: var(--text-body, var(--text));
  font-style: italic;
}
.modal-flag-cond-quote .rev-snip-kw { font-weight: 700; font-style: normal; }

/* --- Phase 3: verbatim TripAdvisor review snippets behind the flags ----- */
.rev-snip-section { margin-top: var(--space-4, 16px); }
.rev-snip-note {
  font-family: var(--font-body);
  font-size: 0.8rem;
  color: var(--text-muted);
  line-height: 1.45;
  margin: 0 0 12px;
}
.rev-snip-group { margin-bottom: 14px; }
.rev-snip-group:last-child { margin-bottom: 0; }
.rev-snip-group-title {
  font-family: var(--font-body);
  font-size: 0.74rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  margin: 0 0 8px;
}
.rev-snip-group--green .rev-snip-group-title { color: var(--flag-green); }
.rev-snip-group--red .rev-snip-group-title { color: var(--flag-red); }
.rev-snip-list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.rev-snip {
  padding: 10px 12px;
  border-radius: var(--radius-sm, 6px);
  border: 1px solid var(--border, rgba(0,0,0,0.1));
  background: var(--surface-2, rgba(0,0,0,0.02));
}
.rev-snip--green {
  background: var(--flag-green-bg);
  border-color: var(--flag-green-border);
  box-shadow: inset 3px 0 0 0 var(--flag-green);
}
.rev-snip--red {
  background: var(--flag-red-bg);
  border-color: var(--flag-red-border);
  box-shadow: inset 3px 0 0 0 var(--flag-red);
}
.rev-snip-head {
  display: flex;
  align-items: baseline;
  gap: 8px;
  margin-bottom: 5px;
  flex-wrap: wrap;
}
.rev-snip-stars {
  font-size: 0.78rem;
  letter-spacing: 1px;
  flex-shrink: 0;
}
.rev-snip-stars--green { color: var(--flag-green); }
.rev-snip-stars--red { color: var(--flag-red); }
.rev-snip-title {
  font-family: var(--font-body);
  font-size: 0.86rem;
  font-weight: 600;
  color: var(--text);
  min-width: 0;
}
.rev-snip-body {
  font-family: var(--font-body);
  font-size: 0.84rem;
  line-height: 1.5;
  color: var(--text);
  font-style: italic;
}
.rev-snip-kw { font-weight: 700; font-style: normal; }
.rev-snip-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-top: 7px;
  flex-wrap: wrap;
}
.rev-snip-cats {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  min-width: 0;
}
.rev-snip-cat {
  font-family: var(--font-body);
  font-size: 0.68rem;
  font-weight: 600;
  padding: 1px 7px;
  border-radius: 999px;
  background: color-mix(in srgb, currentColor 8%, transparent);
  border: 1px solid var(--border, rgba(0,0,0,0.12));
  color: var(--text-muted);
  white-space: nowrap;
}
.rev-snip-meta {
  font-size: 0.72rem;
  color: var(--text-muted);
  white-space: nowrap;
}
.rev-snip-link {
  color: #00a680;
  font-weight: 600;
  text-decoration: none;
}
.rev-snip-link:hover { text-decoration: underline; }

/* --- Per-flag verbatim evidence (2026-06-03) --------------------------- */
/* Real TripAdvisor quotes tucked directly under the flag they explain, so the
   number and the words sit together. Indented a touch and tone-tinted so the
   eye reads them as "the proof behind this specific flag." */
.modal-flags-evidence-note {
  font-family: var(--font-body);
  font-size: 0.8rem;
  color: var(--text-muted);
  line-height: 1.45;
  margin: 0 0 12px;
}
.modal-flag-evidence {
  margin-top: 10px;
  padding-left: 10px;
  border-left: 2px solid var(--border, rgba(0,0,0,0.12));
}
.modal-flag-evidence--red { border-left-color: var(--flag-red-border); }
.modal-flag-evidence--green { border-left-color: var(--flag-green-border); }
.modal-flag-evidence-lead {
  display: flex;
  align-items: center;
  gap: 6px;
  font-family: var(--font-body);
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin-bottom: 7px;
}
.rev-snip-list--tight { gap: 7px; }
.rev-snip-list--tight .rev-snip { padding: 9px 11px; }
/* Phase 47: horizontal compression of the flag evidence. The verbatim quote
   cards are the widest, most dominant element in a HUGE flags section; capping
   the evidence column to ~85% of the flag width (and indenting it a touch from
   the left rule) trims ~15% off the horizontal footprint without shrinking the
   small flags' single short detail line. The cap is a max-width so it never
   stretches a card on a narrow viewport. */
.modal-flag-evidence {
  max-width: 85%;
}
@media (max-width: 640px) {
  /* On phones the modal is already narrow — let evidence use the full width. */
  .modal-flag-evidence { max-width: 100%; }
}
/* Phase 47: "+N more guest quotes" expander on HUGE-flag modals. Folds the
   2nd/3rd verbatim quote behind a quiet inline toggle so a 6-flag hotel no
   longer opens with a ~2000px wall of quotes. */
.modal-flag-evidence-more { margin-top: 7px; }
.modal-flag-evidence-more > summary {
  list-style: none;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-family: var(--font-body);
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  color: var(--text-muted);
  padding: 3px 9px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: color-mix(in srgb, var(--text-muted) 5%, transparent);
  transition: color 0.15s ease, border-color 0.15s ease;
  user-select: none;
}
.modal-flag-evidence-more > summary::-webkit-details-marker { display: none; }
.modal-flag-evidence-more > summary::before {
  content: "";
  width: 0;
  height: 0;
  border-left: 4px solid currentColor;
  border-top: 3px solid transparent;
  border-bottom: 3px solid transparent;
  transition: transform 0.15s ease;
}
.modal-flag-evidence-more[open] > summary::before { transform: rotate(90deg); }
.modal-flag-evidence--red .modal-flag-evidence-more > summary:hover { color: var(--flag-red); border-color: var(--flag-red-border); }
.modal-flag-evidence--green .modal-flag-evidence-more > summary:hover { color: var(--flag-green); border-color: var(--flag-green-border); }
.modal-flag-evidence-more .mfe-more-hide { display: none; }
.modal-flag-evidence-more[open] .mfe-more-show { display: none; }
.modal-flag-evidence-more[open] .mfe-more-hide { display: inline; }
.modal-flag-evidence-more > .rev-snip-list { margin-top: 7px; }
/* The category chip that matches THIS flag's concern gets a tone-colored
   highlight, so the link between the flag and the quote is unmistakable. */
.modal-flag-evidence--red .rev-snip-cat--on {
  color: var(--flag-red);
  border-color: var(--flag-red);
  background: color-mix(in srgb, var(--flag-red) 10%, transparent);
}
.modal-flag-evidence--green .rev-snip-cat--on {
  color: var(--flag-green);
  border-color: var(--flag-green);
  background: color-mix(in srgb, var(--flag-green) 10%, transparent);
}

/* --- Enhanced Guest Sentiment ------------------------------------------ */
.sent-intro {
  font-family: var(--font-body);
  font-size: 0.82rem;
  color: var(--text-muted);
  line-height: 1.5;
  margin: 0 0 var(--space-4);
}
.sent-key { font-weight: 600; }
.sent-key--pos { color: var(--flag-green); }
.sent-key--neg { color: var(--flag-red); }
.sent-key--neu { color: var(--text-muted); }
.sent-group { margin-bottom: var(--space-4); }
.sent-group:last-child { margin-bottom: 0; }
.sent-group-label {
  font-family: var(--font-body);
  font-size: 0.74rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  margin-bottom: var(--space-3);
}
.sent-group--worst .sent-group-label { color: var(--flag-red); }
.sent-group--best .sent-group-label { color: var(--flag-green); }
.sent-list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}
.sent-row { font-family: var(--font-body); }
.sent-head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--space-3);
  margin-bottom: 5px;
}
.sent-name {
  font-size: 0.92rem;
  font-weight: 500;
  color: var(--text);
}
.sent-egregious-tag {
  font-size: 0.68rem;
  font-weight: 700;
  color: var(--flag-red);
  background: var(--flag-red-bg);
  border: 1px solid var(--flag-red-border);
  border-radius: 999px;
  padding: 2px 7px;
  margin-left: 6px;
  white-space: nowrap;
}
.sent-count {
  font-size: 0.75rem;
  color: var(--text-muted);
  white-space: nowrap;
}
.sent-bar {
  display: flex;
  width: 100%;
  height: 8px;
  border-radius: 999px;
  overflow: hidden;
  background: var(--border);
}
.sent-bar span { display: block; height: 100%; }
.sent-pos { background: var(--flag-green); }
.sent-neu { background: var(--flag-neu); }
.sent-neg { background: var(--flag-red); }
.sent-row--egregious .sent-bar { box-shadow: 0 0 0 1px var(--flag-red-border); }

/* Mobile: tighten chip & nearest spacing */
@media (max-width: 640px) {
  .modal-chips { gap: 6px; }
  .modal-chip { font-size: 0.74rem; padding: 5px 10px; }
  .modal-nearest-item { flex-direction: column; gap: 2px; align-items: flex-start; }
  .modal-nearest-meta { text-align: left; }
}

/* ============================================================
   PHASE 28e/28f — Award chips (Forbes 5-Star, MICHELIN Keys)
   Squared chip with star + uppercase wordmark. Modal header + .modal-award
   rows only (not cards). Each award has its own variant for color (gold for Forbes,
   Michelin red for Two/Three Keys), so multiple chips can coexist
   on a single card without color clashes. Tooltip carries the year.
   ============================================================ */

/* Shared visual shell. */
.award-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 3px 8px 3px 6px;
  border: 1px solid transparent;
  border-radius: 4px;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 0.6rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  white-space: nowrap;
  vertical-align: middle;
  line-height: 1;
  cursor: help;
}
.award-chip svg { flex: none; }

/* When several chips appear side-by-side on a card brand row, give them a
   tiny breathing room so the brand label, brand-change icon, and award
   chips don't crash together. */
.card-brand .award-chip { margin-left: 2px; }
.modal-brand .award-chip {
  flex: none;
  margin-left: 2px;
  text-transform: none;
}
.card-memberships {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  margin: 0;
}
.membership-badge {
  display: inline-flex;
  align-items: center;
  padding: 1px 6px;
  border-radius: 3px;
  font-size: 0.58rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--text-muted, #94a3b8);
  border: 1px solid color-mix(in srgb, var(--text-muted, #94a3b8) 35%, transparent);
  background: color-mix(in srgb, var(--text-muted, #94a3b8) 8%, transparent);
  cursor: help;
}
.membership-badge--overflow {
  font-variant-numeric: tabular-nums;
  opacity: 0.85;
}
:root[data-theme="light"] .membership-badge,
body[data-theme="light"] .membership-badge {
  color: #64748b;
  border-color: color-mix(in srgb, #64748b 40%, transparent);
}
.modal-award .award-chip {
  flex: 1 1 auto;
  min-width: 0;
  max-width: calc(100% - 2.5rem);
  white-space: normal;
  text-transform: none;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 0.82rem;
  letter-spacing: 0.01em;
  line-height: 1.35;
  padding: 4px 10px 4px 8px;
}

.award-chip--overflow {
  border-color: color-mix(in srgb, var(--gold) 30%, transparent);
  background: color-mix(in srgb, var(--gold) 6%, transparent);
  color: var(--text-muted, #cbd5e1);
  font-variant-numeric: tabular-nums;
  cursor: help;
}

/* --- Forbes Five-Star variant (warm antique gold) ---------------------- */
.award-chip--forbes {
  --forbes-gold: #c9a227;
  --forbes-gold-deep: #8b6914;
  border-color: color-mix(in srgb, var(--forbes-gold) 58%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--forbes-gold) 20%, transparent),
    color-mix(in srgb, var(--forbes-gold-deep) 8%, transparent));
  color: #f2e4bc;
}
.award-chip--forbes svg { color: #f2e4bc; }
:root[data-theme="light"] .award-chip--forbes,
body[data-theme="light"] .award-chip--forbes {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--forbes-gold) 28%, transparent),
    color-mix(in srgb, var(--forbes-gold-deep) 12%, transparent));
  border-color: color-mix(in srgb, var(--forbes-gold) 72%, transparent);
  color: color-mix(in srgb, var(--forbes-gold-deep) 55%, #3d2e08);
}
:root[data-theme="light"] .award-chip--forbes svg,
body[data-theme="light"] .award-chip--forbes svg {
  color: color-mix(in srgb, var(--forbes-gold-deep) 55%, #3d2e08);
}

/* --- Forbes Four-Star variant (lighter gold, outline star) -------------- */
/* Strong independent inspection — tier below Five-Star; parallels AAA 4-Diamond
   and MICHELIN 2 Keys in the "solid secondary honor" band. Outline star glyph
   reads clearly subordinate to the filled Five-Star chip. */
.award-chip--forbes4 {
  border-color: color-mix(in srgb, var(--gold) 42%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--gold) 10%, transparent),
    color-mix(in srgb, var(--gold) 3%, transparent));
  color: #e8d5a3;
}
.award-chip--forbes4 svg { color: #e8d5a3; }
:root[data-theme="light"] .award-chip--forbes4,
body[data-theme="light"] .award-chip--forbes4 {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--gold) 16%, transparent),
    color-mix(in srgb, var(--gold) 6%, transparent));
  border-color: color-mix(in srgb, var(--gold) 55%, transparent);
  color: color-mix(in srgb, var(--gold) 72%, #5c4a1a);
}
:root[data-theme="light"] .award-chip--forbes4 svg,
body[data-theme="light"] .award-chip--forbes4 svg {
  color: color-mix(in srgb, var(--gold) 72%, #5c4a1a);
}

/* --- MICHELIN Three Keys variant (deep burgundy red, filled) ------------- */
.award-chip--mk3 {
  --mk-red: #8b1530;
  --mk-red-bright: #c41e3a;
  border-color: color-mix(in srgb, var(--mk-red-bright) 70%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--mk-red-bright) 32%, transparent),
    color-mix(in srgb, var(--mk-red) 16%, transparent));
  color: #f8d4da;
}
.award-chip--mk3 svg { color: #f8d4da; }
:root[data-theme="light"] .award-chip--mk3,
body[data-theme="light"] .award-chip--mk3 {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--mk-red-bright) 22%, transparent),
    color-mix(in srgb, var(--mk-red) 10%, transparent));
  border-color: color-mix(in srgb, var(--mk-red) 78%, transparent);
  color: var(--mk-red);
}
:root[data-theme="light"] .award-chip--mk3 svg,
body[data-theme="light"] .award-chip--mk3 svg { color: var(--mk-red); }

/* --- MICHELIN Two Keys variant (lighter, outline-only red) ------------- */
/* Two Keys is a major honor but secondary to Three Keys; we use a quieter
   outlined treatment so a Two-Key chip is clearly less loud than Three. */
.award-chip--mk2 {
  --mk-red: #8b1530;
  --mk-red-bright: #c41e3a;
  border-color: color-mix(in srgb, var(--mk-red-bright) 52%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--mk-red-bright) 14%, transparent),
    color-mix(in srgb, var(--mk-red) 5%, transparent));
  color: #efb1b5;
}
.award-chip--mk2 svg { color: #efb1b5; }
:root[data-theme="light"] .award-chip--mk2,
body[data-theme="light"] .award-chip--mk2 {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--mk-red) 10%, transparent),
    color-mix(in srgb, var(--mk-red) 4%, transparent));
  border-color: color-mix(in srgb, var(--mk-red) 60%, transparent);
  color: var(--mk-red);
}
:root[data-theme="light"] .award-chip--mk2 svg,
body[data-theme="light"] .award-chip--mk2 svg { color: var(--mk-red); }

.award-chip--mk1 {
  --mk-red: #c1272d;
  border-color: color-mix(in srgb, var(--mk-red) 38%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--mk-red) 8%, transparent),
    color-mix(in srgb, var(--mk-red) 2%, transparent));
  color: #d4a0a3;
}
.award-chip--mk1 svg { color: #d4a0a3; }
:root[data-theme="light"] .award-chip--mk1,
body[data-theme="light"] .award-chip--mk1 {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--mk-red) 12%, transparent),
    color-mix(in srgb, var(--mk-red) 5%, transparent));
  border-color: color-mix(in srgb, var(--mk-red) 55%, transparent);
  color: var(--mk-red);
}
:root[data-theme="light"] .award-chip--mk1 svg,
body[data-theme="light"] .award-chip--mk1 svg { color: var(--mk-red); }

/* --- AAA Five Diamond variant (deep navy blue, PILL shape) -------------- */
/* Phase 28n: AAA needs to be visually distinct from both the gold Forbes
   chip AND the red MICHELIN chips. We use a triple-axis distinction:
     1. Color   : deep navy blue (#1f3a8a) — AAA's own brand color
     2. Shape   : fully rounded pill (border-radius: 999px) instead of the
                  small 4px square the other chips use, so the silhouette
                  is immediately recognizable even before reading the text
     3. Glyph   : filled diamond ◆ (Forbes uses a star, MICHELIN a key)
   Dark-theme uses a saturated navy fill with white text; light-theme uses
   a tinted navy background with full-saturation navy text. */
.award-chip--aaa {
  --aaa-navy: #1f3a8a;
  --aaa-navy-bright: #2b4eb8;
  border-radius: 999px;
  border-color: color-mix(in srgb, var(--aaa-navy-bright) 70%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--aaa-navy-bright) 32%, transparent),
    color-mix(in srgb, var(--aaa-navy) 18%, transparent));
  color: #cfd9f4;
}
.award-chip--aaa svg { color: #cfd9f4; }
:root[data-theme="light"] .award-chip--aaa,
body[data-theme="light"] .award-chip--aaa {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--aaa-navy) 18%, transparent),
    color-mix(in srgb, var(--aaa-navy) 8%, transparent));
  border-color: color-mix(in srgb, var(--aaa-navy) 72%, transparent);
  color: var(--aaa-navy);
}
:root[data-theme="light"] .award-chip--aaa svg,
body[data-theme="light"] .award-chip--aaa svg { color: var(--aaa-navy); }

/* --- AAA Four Diamond variant (slate-silver, PILL shape, OUTLINE diamond) -- */
/* Phase 29: AAA Four Diamond is the tier below Five Diamond, so it shares the
   pill shape and diamond glyph of Five Diamond — but uses a cooler, more
   muted slate-silver palette and an OUTLINE-only diamond (instead of filled)
   to clearly read as the lower tier. The two chips never appear together on
   the same hotel (we suppress 4-Diamond when 5-Diamond is present). */
.award-chip--aaa4 {
  --aaa4-slate: #475569;       /* slate-600 — base tone */
  --aaa4-slate-bright: #64748b; /* slate-500 — hover/border */
  border-radius: 999px;
  border-color: color-mix(in srgb, var(--aaa4-slate-bright) 60%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--aaa4-slate-bright) 22%, transparent),
    color-mix(in srgb, var(--aaa4-slate) 12%, transparent));
  color: #cbd5e1;              /* slate-300 — readable on dark fill */
}
.award-chip--aaa4 svg { color: #cbd5e1; }
:root[data-theme="light"] .award-chip--aaa4,
body[data-theme="light"] .award-chip--aaa4 {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--aaa4-slate) 12%, transparent),
    color-mix(in srgb, var(--aaa4-slate) 5%, transparent));
  border-color: color-mix(in srgb, var(--aaa4-slate) 60%, transparent);
  color: var(--aaa4-slate);
}
:root[data-theme="light"] .award-chip--aaa4 svg,
body[data-theme="light"] .award-chip--aaa4 svg { color: var(--aaa4-slate); }

/* --- AHEAD Hotel of the Year (bronze/copper — design trade top honor) ---- */
.award-chip--ahead {
  --ahead-bronze: #a8642a;
  --ahead-copper: #c9854a;
  border-color: color-mix(in srgb, var(--ahead-copper) 58%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--ahead-copper) 22%, transparent),
    color-mix(in srgb, var(--ahead-bronze) 8%, transparent));
  color: #f3dcc8;
}
.award-chip--ahead svg { color: #f3dcc8; }
:root[data-theme="light"] .award-chip--ahead,
body[data-theme="light"] .award-chip--ahead {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--ahead-copper) 26%, transparent),
    color-mix(in srgb, var(--ahead-bronze) 10%, transparent));
  border-color: color-mix(in srgb, var(--ahead-bronze) 68%, transparent);
  color: var(--ahead-bronze);
}
:root[data-theme="light"] .award-chip--ahead svg,
body[data-theme="light"] .award-chip--ahead svg { color: var(--ahead-bronze); }

/* --- World's 50 Best Hotels variant (emerald, laurel glyph) ------------- */
/* Phase 45: The single most prestigious signal in the atlas — a top-50
   global ranking. It must be instantly distinct from Forbes (gold star),
   MICHELIN (red key) and AAA (navy/slate diamond pill), so we give it its
   own emerald palette + laurel-wreath glyph, and render it FIRST in the
   chip rail. The chip carries the hotel's numeric rank ("World's 50 Best
   #N"), so it is intrinsically more text than the other chips. */
.award-chip--w50 {
  --w50-emerald: #0f7a5a;        /* deep jade-emerald base */
  --w50-emerald-bright: #16a374; /* brighter emerald for border/fill */
  border-color: color-mix(in srgb, var(--w50-emerald-bright) 68%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--w50-emerald-bright) 30%, transparent),
    color-mix(in srgb, var(--w50-emerald) 16%, transparent));
  color: #c8f1e0;
}
.award-chip--w50 svg { color: #c8f1e0; }
:root[data-theme="light"] .award-chip--w50,
body[data-theme="light"] .award-chip--w50 {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--w50-emerald) 16%, transparent),
    color-mix(in srgb, var(--w50-emerald) 7%, transparent));
  border-color: color-mix(in srgb, var(--w50-emerald) 70%, transparent);
  color: var(--w50-emerald);
}
:root[data-theme="light"] .award-chip--w50 svg,
body[data-theme="light"] .award-chip--w50 svg { color: var(--w50-emerald); }

/* --- World's 50 Best Hotels EXTENDED list variant (ranks 51-100) -------- */
/* Phase 46: Same laurel-wreath family as the top-50 chip, but a cooler,
   more muted teal/slate palette so it reads as a sibling tier that is
   clearly subordinate to the headline top-50 emerald chip. */
.award-chip--w51 {
  --w51-teal: #2a6f6a;          /* muted deep teal base */
  --w51-teal-bright: #3f9c93;   /* brighter teal for border/fill */
  border-color: color-mix(in srgb, var(--w51-teal-bright) 60%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--w51-teal-bright) 24%, transparent),
    color-mix(in srgb, var(--w51-teal) 13%, transparent));
  color: #cfeae6;
}
.award-chip--w51 svg { color: #cfeae6; }
:root[data-theme="light"] .award-chip--w51,
body[data-theme="light"] .award-chip--w51 {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--w51-teal) 14%, transparent),
    color-mix(in srgb, var(--w51-teal) 6%, transparent));
  border-color: color-mix(in srgb, var(--w51-teal) 64%, transparent);
  color: var(--w51-teal);
}
:root[data-theme="light"] .award-chip--w51 svg,
body[data-theme="light"] .award-chip--w51 svg { color: var(--w51-teal); }


/* --- Condé Nast Traveler Gold List variant (editorial champagne/gold) ------- */
/* Phase CNT: CNT Gold List is Condé Nast's most prestigious annual hotel
   endorsement — editor-curated, not reader-voted. We use a warm
   champagne-gold palette to signal editorial prestige, deliberately lighter
   and warmer than the Forbes gold chip so the two are instantly distinct:
     - Forbes: deep antique gold (#b8860b range), star glyph
     - CNT:    pale champagne (#c8a84b range), magazine icon glyph
   Both chips are square (border-radius: 4px), but the different hue and
   glyph make them immediately distinguishable even in peripheral vision. */
.award-chip--cnt {
  --cnt-champagne: #b89a3a;
  --cnt-champagne-bright: #d4b84a;
  --cnt-text-dark: #eddfa0;
  border-color: color-mix(in srgb, var(--cnt-champagne-bright) 60%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--cnt-champagne-bright) 22%, transparent),
    color-mix(in srgb, var(--cnt-champagne) 10%, transparent));
  color: var(--cnt-text-dark);
}
.award-chip--cnt svg { color: var(--cnt-text-dark); }
:root[data-theme="light"] .award-chip--cnt,
body[data-theme="light"] .award-chip--cnt {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--cnt-champagne) 20%, transparent),
    color-mix(in srgb, var(--cnt-champagne) 9%, transparent));
  border-color: color-mix(in srgb, var(--cnt-champagne) 68%, transparent);
  color: var(--cnt-champagne);
}
:root[data-theme="light"] .award-chip--cnt svg,
body[data-theme="light"] .award-chip--cnt svg { color: var(--cnt-champagne); }

/* --- CNT Hot List (coral editorial — new-opening counterpart to Gold List) --- */
.award-chip--cnt-hotlist {
  --cnt-hot-coral: #c85848;
  --cnt-hot-deep: #8a3828;
  border-color: color-mix(in srgb, var(--cnt-hot-coral) 62%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--cnt-hot-coral) 24%, transparent),
    color-mix(in srgb, var(--cnt-hot-deep) 10%, transparent));
  color: #f8dcd6;
}
.award-chip--cnt-hotlist svg { color: #f8dcd6; }
:root[data-theme="light"] .award-chip--cnt-hotlist,
body[data-theme="light"] .award-chip--cnt-hotlist {
  border-color: color-mix(in srgb, var(--cnt-hot-deep) 70%, transparent);
  color: var(--cnt-hot-deep);
}
:root[data-theme="light"] .award-chip--cnt-hotlist svg,
body[data-theme="light"] .award-chip--cnt-hotlist svg { color: var(--cnt-hot-deep); }

/* --- Robb Report Best of the Best (charcoal / platinum) --- */
.award-chip--robb {
  border-color: color-mix(in srgb, #8a8a8a 55%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, #6a6a6a 18%, transparent),
    color-mix(in srgb, #3a3a3a 8%, transparent));
  color: #e8e8e8;
}
.award-chip--robb svg { color: #d0d0d0; }
:root[data-theme="light"] .award-chip--robb,
body[data-theme="light"] .award-chip--robb {
  background: linear-gradient(180deg,
    color-mix(in srgb, #6a6a6a 14%, transparent),
    color-mix(in srgb, #3a3a3a 6%, transparent));
  border-color: color-mix(in srgb, #5a5a5a 55%, transparent);
  color: #2a2a2a;
}
:root[data-theme="light"] .award-chip--robb svg,
body[data-theme="light"] .award-chip--robb svg { color: #4a4a4a; }

/* --- Virtuoso Best of the Best (deep teal) --- */
.award-chip--virtuoso {
  --virt-teal: #006d77;
  border-color: color-mix(in srgb, var(--virt-teal) 65%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--virt-teal) 26%, transparent),
    color-mix(in srgb, var(--virt-teal) 10%, transparent));
  color: #b8e8ec;
}
.award-chip--virtuoso svg { color: #b8e8ec; }
:root[data-theme="light"] .award-chip--virtuoso,
body[data-theme="light"] .award-chip--virtuoso {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--virt-teal) 16%, transparent),
    color-mix(in srgb, var(--virt-teal) 7%, transparent));
  border-color: color-mix(in srgb, var(--virt-teal) 62%, transparent);
  color: var(--virt-teal);
}
:root[data-theme="light"] .award-chip--virtuoso svg,
body[data-theme="light"] .award-chip--virtuoso svg { color: var(--virt-teal); }

/* --- The AA Five Red Stars (yellow star on dark) --- */
.award-chip--aa {
  border-color: color-mix(in srgb, #f5c400 58%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, #2a2a2a 40%, transparent),
    color-mix(in srgb, #f5c400 12%, transparent));
  color: #f5e6a0;
}
.award-chip--aa svg { color: #f5c400; }
:root[data-theme="light"] .award-chip--aa,
body[data-theme="light"] .award-chip--aa {
  background: linear-gradient(180deg,
    color-mix(in srgb, #f5c400 18%, transparent),
    color-mix(in srgb, #f5c400 8%, transparent));
  border-color: color-mix(in srgb, #c9a000 58%, transparent);
  color: #5a4800;
}
:root[data-theme="light"] .award-chip--aa svg,
body[data-theme="light"] .award-chip--aa svg { color: #8a7000; }

/* --- Palace Distinction France (royal blue) --- */
.award-chip--palace {
  --palace-blue: #2d4a8a;
  border-color: color-mix(in srgb, var(--palace-blue) 68%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--palace-blue) 28%, transparent),
    color-mix(in srgb, #1a3060 12%, transparent));
  color: #c8d8f8;
}
.award-chip--palace svg { color: #c8d8f8; }
:root[data-theme="light"] .award-chip--palace,
body[data-theme="light"] .award-chip--palace {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--palace-blue) 16%, transparent),
    color-mix(in srgb, var(--palace-blue) 7%, transparent));
  border-color: color-mix(in srgb, var(--palace-blue) 65%, transparent);
  color: var(--palace-blue);
}
:root[data-theme="light"] .award-chip--palace svg,
body[data-theme="light"] .award-chip--palace svg { color: var(--palace-blue); }

/* --- Andrew Harper Grand Award (forest green) --- */
.award-chip--harper {
  --harper-green: #3a6a2a;
  border-color: color-mix(in srgb, var(--harper-green) 65%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--harper-green) 24%, transparent),
    color-mix(in srgb, #1e3a18 10%, transparent));
  color: #d8f0c8;
}
.award-chip--harper svg { color: #d8f0c8; }
:root[data-theme="light"] .award-chip--harper,
body[data-theme="light"] .award-chip--harper {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--harper-green) 16%, transparent),
    color-mix(in srgb, var(--harper-green) 7%, transparent));
  border-color: color-mix(in srgb, var(--harper-green) 62%, transparent);
  color: var(--harper-green);
}
:root[data-theme="light"] .award-chip--harper svg,
body[data-theme="light"] .award-chip--harper svg { color: var(--harper-green); }

/* --- World Travel Awards (gala ruby) --- */
.award-chip--wta {
  --wta-ruby: #8a1828;
  border-color: color-mix(in srgb, var(--wta-ruby) 68%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--wta-ruby) 28%, transparent),
    color-mix(in srgb, #5a1020 12%, transparent));
  color: #f8d0d8;
}
.award-chip--wta svg { color: #f8d0d8; }
:root[data-theme="light"] .award-chip--wta,
body[data-theme="light"] .award-chip--wta {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--wta-ruby) 16%, transparent),
    color-mix(in srgb, var(--wta-ruby) 7%, transparent));
  border-color: color-mix(in srgb, var(--wta-ruby) 62%, transparent);
  color: var(--wta-ruby);
}
:root[data-theme="light"] .award-chip--wta svg,
body[data-theme="light"] .award-chip--wta svg { color: var(--wta-ruby); }

/* --- Travel + Leisure World's Best Hotels variant (reader blue/teal) -------- */
/* Phase CNT: T+L is reader-voted, mass-validated prestige. We use an electric
   blue/cyan palette to signal its reader-voted, aspirational character:
     - Distinct from AAA navy (#1f3a8a): T+L is brighter electric blue/cyan
     - Distinct from W50 emerald (#0f7a5a): T+L is blue-leaning, not green
   T+L chip is square (not pill). Glyph: compass rose (reader-adventure).
   Shows "#N" rank when known (T+L 2025 Top 100). */
.award-chip--tl {
  --tl-blue: #1565b8;
  --tl-blue-bright: #2279d4;
  --tl-text-dark: #a0c8f4;
  border-color: color-mix(in srgb, var(--tl-blue-bright) 62%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--tl-blue-bright) 26%, transparent),
    color-mix(in srgb, var(--tl-blue) 14%, transparent));
  color: var(--tl-text-dark);
}
.award-chip--tl svg { color: var(--tl-text-dark); }
:root[data-theme="light"] .award-chip--tl,
body[data-theme="light"] .award-chip--tl {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--tl-blue) 16%, transparent),
    color-mix(in srgb, var(--tl-blue) 7%, transparent));
  border-color: color-mix(in srgb, var(--tl-blue) 70%, transparent);
  color: var(--tl-blue);
}
:root[data-theme="light"] .award-chip--tl svg,
body[data-theme="light"] .award-chip--tl svg { color: var(--tl-blue); }

/* --- T+L It List (bright cyan — new-opening counterpart to World's Best) --- */
.award-chip--tl-itlist {
  --tl-it-cyan: #22a8c8;
  border-color: color-mix(in srgb, var(--tl-it-cyan) 62%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--tl-it-cyan) 22%, transparent),
    color-mix(in srgb, #0878a0 10%, transparent));
  color: #c8f0fc;
}
.award-chip--tl-itlist svg { color: #c8f0fc; }
:root[data-theme="light"] .award-chip--tl-itlist,
body[data-theme="light"] .award-chip--tl-itlist {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--tl-it-cyan) 16%, transparent),
    color-mix(in srgb, var(--tl-it-cyan) 7%, transparent));
  border-color: color-mix(in srgb, #0878a0 62%, transparent);
  color: #0878a0;
}
:root[data-theme="light"] .award-chip--tl-itlist svg,
body[data-theme="light"] .award-chip--tl-itlist svg { color: #0878a0; }

/* --- Registry-recognized award variant (neutral pewter) -------------------- */
/* Phase 49: MODAL-ONLY. Awards the strict card recognizers don't claim a
   dedicated chip for (Relais & Châteaux, Leading Hotels of the World, Historic
   Hotels, Palace de France, World Travel Awards, Tatler, TIME World's Greatest
   Places, Andrew Harper, Wallpaper*, Tripadvisor Travelers' Choice, World Spa
   Awards, Green Key, MICHELIN One Key / Guide-Selected, lower CNT/T+L tiers,
   etc.) still get a tidy chip in the modal Awards section so a recognized honor
   never silently degrades to plain text. Neutral pewter/slate so it reads as a
   secondary, body-agnostic recognition — never competing visually with the
   signature Forbes / MICHELIN / AAA / W50 / CNT / T+L chips. NOT used on cards. */
.award-chip--registry {
  --reg-pewter: #6b7280;
  --reg-pewter-bright: #9aa3af;
  --reg-text-dark: #d6dbe2;
  border-color: color-mix(in srgb, var(--reg-pewter-bright) 52%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--reg-pewter-bright) 18%, transparent),
    color-mix(in srgb, var(--reg-pewter) 8%, transparent));
  color: var(--reg-text-dark);
}
.award-chip--registry svg { color: var(--reg-text-dark); }
:root[data-theme="light"] .award-chip--registry,
body[data-theme="light"] .award-chip--registry {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--reg-pewter) 14%, transparent),
    color-mix(in srgb, var(--reg-pewter) 6%, transparent));
  border-color: color-mix(in srgb, var(--reg-pewter) 58%, transparent);
  color: #4b5563;
}
:root[data-theme="light"] .award-chip--registry svg,
body[data-theme="light"] .award-chip--registry svg { color: #4b5563; }

/* --- Awards section sub-rows (Recent awards, Memberships) ---------------- */
.modal-awards-sub {
  margin-top: 10px;
  padding-top: 9px;
  border-top: 1px dashed color-mix(in srgb, var(--hairline, #888) 55%, transparent);
}
.modal-awards-sub-label {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 0.58rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  opacity: 0.72;
  margin-bottom: 6px;
}
.modal-awards-recent-list { display: flex; flex-wrap: wrap; gap: 6px; }
.modal-awards-group { display: flex; flex-direction: column; gap: 6px; }
.modal-awards-recent-item {
  display: inline-flex;
  align-items: baseline;
  gap: 5px;
  padding: 3px 8px;
  border-radius: 4px;
  border: 1px solid color-mix(in srgb, var(--hairline, #888) 45%, transparent);
  font-family: var(--font-body);
  font-size: 0.82rem;
  line-height: 1.35;
}
.modal-awards-recent-item .mar-year {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 0.6rem;
  letter-spacing: 0.08em;
  opacity: 0.75;
}
/* Memberships sub-row — association recognition, not earned awards */
.modal-memberships {
  display: flex;
  flex-direction: column;
  gap: 0;
}
.modal-membership {
  display: flex;
  padding: 8px 0;
  border-bottom: 1px dashed var(--border);
}
.modal-membership:last-child { border-bottom: none; }
.modal-membership-body {
  display: flex;
  flex-direction: column;
  gap: 3px;
  min-width: 0;
}
.modal-membership-name {
  font-family: var(--font-body);
  font-size: 0.93rem;
  font-weight: 600;
  color: var(--text);
  line-height: 1.25;
}
.modal-membership-note {
  font-family: var(--font-body);
  font-size: 0.78rem;
  line-height: 1.35;
  color: var(--text-muted);
  font-weight: 400;
}

/* Legacy alias: .fs5-icon was the original Phase 28e selector.
   Keep it working so older inline markup that uses it still renders
   the Forbes look. New code should write .award-chip.award-chip--forbes. */
.fs5-icon {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 3px 8px 3px 6px;
  border: 1px solid color-mix(in srgb, var(--gold) 50%, transparent);
  border-radius: 4px;
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--gold) 14%, transparent),
    color-mix(in srgb, var(--gold) 4%, transparent));
  color: var(--brand-badge-text);
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 0.6rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  white-space: nowrap;
  vertical-align: middle;
  line-height: 1;
  cursor: help;
}
.fs5-icon svg { color: var(--brand-badge-text); flex: none; }
:root[data-theme="light"] .fs5-icon,
body[data-theme="light"] .fs5-icon {
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--gold) 22%, transparent),
    color-mix(in srgb, var(--gold) 10%, transparent));
  border-color: color-mix(in srgb, var(--gold) 65%, transparent);
}

/* ─────────────────────────────────────────────────────────────────────────
   Phase 28m — Prototype Modal v2 (gated on h._modal_proto === 'v2').
   Currently applied only to the JW Marriott portfolio so we can review the
   richer enrichment layout before rolling out to other brands.
   ───────────────────────────────────────────────────────────────────────── */

.proto-section { margin-bottom: var(--space-6); }

/* Phase 30: Collapsible Amenities + Green Practices sections.
   Uses native <details>/<summary> so keyboard + a11y come for free.
   Closed by default — click summary to expand. */
.proto-collapsible {
  border: 1px solid var(--border);
  border-radius: 10px;
  background: color-mix(in srgb, var(--surface) 92%, transparent);
  padding: 0;
}
.proto-collapsible-summary {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-3) var(--space-4);
  cursor: pointer;
  list-style: none;
  user-select: none;
  border-radius: 10px;
  transition: background-color 120ms ease, box-shadow 120ms ease;
  /* Distinct "section bar": a warm gold-tinted band derived from theme tokens
     so it adapts across every era/theme (8 combos) automatically. Clearly
     marks the start of a new collapsible section without being garish.
     A subtle gold hairline on the left reinforces the section boundary. */
  background:
    linear-gradient(to right, var(--gold, #c6a766) 0 3px, transparent 3px),
    color-mix(in srgb, var(--gold, #c6a766) 15%, var(--surface));
  background-repeat: no-repeat;
}
.proto-collapsible-summary::-webkit-details-marker { display: none; }
.proto-collapsible-summary:hover {
  background:
    linear-gradient(to right, var(--gold, #c6a766) 0 3px, transparent 3px),
    color-mix(in srgb, var(--gold, #c6a766) 24%, var(--surface));
  background-repeat: no-repeat;
}
.proto-collapsible-label {
  margin: 0 !important;
  flex: 1;
  /* On the tinted band, render the section name in full-strength ink/cream
     (not gold) so contrast stays high in every theme. Slightly larger than
     the default section label for prominence. */
  color: var(--text) !important;
  font-size: 0.82rem !important;
  letter-spacing: 0.2em;
}
/* The little leading rule on .modal-section-label::before would clash with the
   new left gold bar inside the band — drop it here only. */
.proto-collapsible-label::before { display: none; }
.proto-collapsible-count {
  font-size: 0.8rem;
  color: var(--text-muted);
  font-weight: 500;
}
.proto-collapsible-chevron {
  font-size: 1.3rem;
  color: var(--gold);
  transition: transform 200ms ease;
  line-height: 1;
  display: inline-block;
}
.proto-collapsible[open] > .proto-collapsible-summary .proto-collapsible-chevron {
  transform: rotate(90deg);
}
.proto-collapsible[open] > .proto-collapsible-summary {
  border-bottom: 1px solid var(--border);
  border-radius: 10px 10px 0 0;
}
.proto-collapsible > .proto-amen-grid,
.proto-collapsible > .proto-sus-grid {
  padding: var(--space-4);
}
/* Phase 42: generic collapsible body wrapper. Every section routed through
   wrapCollapsible() puts its content inside .proto-collapsible-body, which
   supplies the same inner padding the amenities grid used to get directly. */
.proto-collapsible-body {
  padding: var(--space-4);
}
/* The amenities/sustainability grids already carry their own padding via the
   rule above when they're a direct child; inside .proto-collapsible-body we
   must not double it. */
.proto-collapsible-body > .proto-amen-grid,
.proto-collapsible-body > .proto-sus-grid {
  padding: 0;
}
/* Count pill may carry a confidence badge (Historical Pricing) instead of
   plain text — keep it vertically centered and from forcing the row taller. */
.proto-collapsible-count { display: inline-flex; align-items: center; }

/* 1) Guest Rating hero */
.proto-rating {
  display: grid;
  grid-template-columns: minmax(180px, 220px) 1fr;
  gap: var(--space-5);
  align-items: center;
  padding: var(--space-4);
  border: 1px solid var(--border);
  border-radius: 10px;
  background: color-mix(in srgb, var(--surface) 92%, transparent);
}
.proto-rating-hero {
  display: flex; align-items: center; gap: var(--space-3);
}
.proto-rating-num {
  font-family: var(--font-display, Georgia, serif);
  font-size: 3rem;
  line-height: 1;
  color: var(--gold, #c6a766);
  font-weight: 500;
}
.proto-rating-meta { display: flex; flex-direction: column; gap: 2px; font-size: 0.85rem; color: var(--text-muted); }
.proto-rating-stars { color: var(--gold, #c6a766); letter-spacing: 1px; font-size: 0.95rem; }
.proto-star { opacity: 0.35; }
.proto-star--full, .proto-star--half { opacity: 1; }
.proto-star--half { opacity: 0.6; }
.proto-rating-count { font-weight: 500; }
.proto-rating-sub { font-size: 0.8rem; opacity: 0.85; }
.proto-rating-sub strong { color: var(--ink, currentColor); }
/* Data-source attribution for the Guest Rating section. Future TripAdvisor
   scores will get their own badge variant so the two are never confused. */
.proto-rating-source {
  display: flex;
  align-items: center;
  gap: 7px;
  margin: var(--space-3) 0 0;
  font-size: 0.74rem;
  color: var(--text-muted);
  line-height: 1.3;
}
.proto-source-badge {
  display: inline-flex;
  align-items: center;
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.02em;
  padding: 2px 8px;
  border-radius: 999px;
  white-space: nowrap;
  flex-shrink: 0;
}
.proto-source-badge--google {
  color: #1a73e8;
  background: color-mix(in srgb, #1a73e8 12%, transparent);
  border: 1px solid color-mix(in srgb, #1a73e8 35%, transparent);
}
/* Reserved for the upcoming SerpAPI TripAdvisor feed — distinct green badge. */
.proto-source-badge--tripadvisor {
  color: #00a680;
  background: color-mix(in srgb, #00a680 12%, transparent);
  border: 1px solid color-mix(in srgb, #00a680 35%, transparent);
}
.proto-source-badge--naver {
  color: #03c75a;
  background: color-mix(in srgb, #03c75a 12%, transparent);
  border: 1px solid color-mix(in srgb, #03c75a 35%, transparent);
}
.proto-rating-bars { display: flex; flex-direction: column; gap: 4px; }
.proto-rating-row {
  display: grid;
  grid-template-columns: 30px 1fr 40px;
  gap: var(--space-2);
  align-items: center;
  font-size: 0.75rem;
}
.proto-rating-star { color: var(--gold, #c6a766); font-weight: 600; }
.proto-rating-track {
  height: 6px; border-radius: 3px;
  background: color-mix(in srgb, var(--text-muted) 18%, transparent);
  overflow: hidden;
}
.proto-rating-fill {
  display: block; height: 100%;
  background: linear-gradient(90deg, var(--gold, #c6a766), color-mix(in srgb, var(--gold, #c6a766) 70%, white));
  border-radius: 3px;
}
.proto-rating-pct { color: var(--text-muted); text-align: right; font-variant-numeric: tabular-nums; }
@media (max-width: 640px) {
  .proto-rating:not(.proto-rating--stacked) { grid-template-columns: 1fr; }
}

/* Merged Guest Ratings — Google left, TripAdvisor right; score then chart stacked per column. */
.proto-ratings-split {
  display: grid;
  gap: var(--space-4);
}
.proto-ratings-split--dual {
  grid-template-columns: 1fr 1fr;
}
.proto-ratings-split--triple {
  grid-template-columns: 1fr 1fr 1fr;
}
.proto-ratings-split--single {
  grid-template-columns: minmax(0, 420px);
}
.proto-ratings-col {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  align-items: stretch;
}
.proto-ratings-col .proto-rating {
  flex: 1 1 auto;
}
.proto-ratings-col .proto-rating-source--col {
  margin: 0;
  margin-top: auto;
  flex: 0 0 auto;
}
.proto-rating--stacked {
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
  align-items: stretch;
  grid-template-columns: unset;
}
@media (max-width: 700px) {
  .proto-ratings-split--dual { grid-template-columns: 1fr; }
  .proto-ratings-split--triple { grid-template-columns: 1fr; }
  .proto-ratings-split--single { grid-template-columns: 1fr; }
}

/* ── TripAdvisor Guest Rating window (Phase 4) ─────────────────────────── */
/* Second guest-rating modal section. Mirrors the Google rating hero but uses */
/* the reserved TripAdvisor green for the number + ranking, and a six-row     */
/* subrating block where below-3.5 categories are flagged amber as concerns.  */
.proto-rating--ta .proto-rating-num,
.proto-rating--ta .proto-rating-stars { color: #00a680; }
.proto-ta-ranking {
  margin-top: var(--space-3);
  font-size: 0.9rem;
  color: var(--text);
  font-weight: 500;
}
.proto-ta-ranking strong { color: #00a680; font-weight: 700; }
.proto-ta-subs {
  margin-top: var(--space-3);
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.proto-ta-sub-row {
  display: grid;
  grid-template-columns: 96px 1fr 32px;
  gap: var(--space-2);
  align-items: center;
  font-size: 0.78rem;
}
.proto-ta-sub-label { color: var(--text-muted); white-space: nowrap; }
.proto-ta-sub-track {
  height: 6px; border-radius: 3px;
  background: color-mix(in srgb, var(--text-muted) 18%, transparent);
  overflow: hidden;
}
.proto-ta-sub-fill {
  display: block; height: 100%;
  background: linear-gradient(90deg, #00a680, color-mix(in srgb, #00a680 65%, white));
  border-radius: 3px;
}
.proto-ta-sub-val {
  color: var(--text);
  text-align: right;
  font-variant-numeric: tabular-nums;
  font-weight: 600;
}
/* A subrating below 3.5 is a concern — amber bar + label + warning glyph. */
.proto-ta-sub-row--concern .proto-ta-sub-label { color: var(--flag-red, #c0392b); font-weight: 600; }
.proto-ta-sub-fill--concern {
  background: linear-gradient(90deg, #d2756a, color-mix(in srgb, #d2756a 60%, white));
}
.proto-ta-sub-warn { color: var(--flag-red, #c0392b); font-size: 0.8em; }
.proto-ta-concern-note {
  margin: var(--space-3) 0 0;
  font-size: 0.8rem;
  color: var(--text-muted);
  line-height: 1.4;
}
.proto-ta-concern-note strong { color: var(--flag-red, #c0392b); }
.proto-ta-link {
  color: #00a680;
  text-decoration: none;
  font-weight: 600;
  white-space: nowrap;
}
.proto-ta-link:hover { text-decoration: underline; }
@media (max-width: 640px) {
  .proto-ta-sub-row { grid-template-columns: 84px 1fr 30px; }
}

/* Card-level TripAdvisor rating line — second guest-rating row, green owl. */
.card-guest-rating--ta { margin-top: 3px; }
.card-guest-rating--ta svg { color: #00a680; }
.card-guest-rating--naver { margin-top: 3px; }
.card-guest-rating--naver svg { color: #03c75a; }

/* TA-RANK-GLOW-2026: percentile glow on "#N of M" when M ≥ 20 and rank is
   in the top 20% / 10% / 5% of that city's TripAdvisor list. */
.card-ta-rank {
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.card-ta-rank--glow-light,
.card-ta-rank--glow-medium,
.card-ta-rank--glow-heavy {
  color: #00a680;
  font-weight: 700;
  border-radius: 4px;
  padding: 0 3px;
  margin: 0 -1px;
}
.card-ta-rank--glow-light {
  background: color-mix(in srgb, #00a680 10%, transparent);
  box-shadow:
    0 0 6px color-mix(in srgb, #00a680 28%, transparent),
    0 0 1px color-mix(in srgb, #00a680 40%, transparent);
  text-shadow: 0 0 5px color-mix(in srgb, #00a680 35%, transparent);
}
.card-ta-rank--glow-medium {
  background: color-mix(in srgb, #00a680 16%, transparent);
  box-shadow:
    0 0 8px color-mix(in srgb, #00a680 42%, transparent),
    0 0 16px color-mix(in srgb, #00a680 22%, transparent),
    0 0 1px color-mix(in srgb, #00a680 55%, transparent);
  text-shadow: 0 0 7px color-mix(in srgb, #00a680 50%, transparent);
}
.card-ta-rank--glow-heavy {
  background: color-mix(in srgb, #00a680 22%, transparent);
  box-shadow:
    0 0 10px color-mix(in srgb, #00a680 58%, transparent),
    0 0 22px color-mix(in srgb, #00a680 34%, transparent),
    0 0 2px color-mix(in srgb, #00a680 70%, transparent);
  text-shadow:
    0 0 8px color-mix(in srgb, #00a680 65%, transparent),
    0 0 14px color-mix(in srgb, #00a680 40%, transparent);
}
:root[data-theme="light"] .card-ta-rank--glow-light {
  background: color-mix(in srgb, #00a680 12%, transparent);
  box-shadow:
    0 0 7px color-mix(in srgb, #00a680 32%, transparent),
    0 0 1px color-mix(in srgb, #00a680 45%, transparent);
}
:root[data-theme="light"] .card-ta-rank--glow-medium {
  background: color-mix(in srgb, #00a680 18%, transparent);
  box-shadow:
    0 0 9px color-mix(in srgb, #00a680 48%, transparent),
    0 0 18px color-mix(in srgb, #00a680 26%, transparent);
}
:root[data-theme="light"] .card-ta-rank--glow-heavy {
  background: color-mix(in srgb, #00a680 26%, transparent);
  box-shadow:
    0 0 11px color-mix(in srgb, #00a680 62%, transparent),
    0 0 24px color-mix(in srgb, #00a680 38%, transparent);
}

/* 3) Nearby Attractions */
/* Phase 34: compact single-row layout on PC/iPad to bring vertical footprint */
/* close to .modal-nearest-list. Each .proto-poi is now a one-line row with */
/* the POI name on the left and a metadata cluster immediately to its right */
/* (rating ★, walk/transit time, category). No more bordered cards on wide  */
/* screens — a thin bottom rule per row mirrors .modal-nearest-item.        */
.proto-poi-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0; }
.proto-poi {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  /* Phase 34: only 12px gap between name and metadata, so they sit close   */
  /* together rather than being pushed to opposite edges by space-between.  */
  gap: 12px;
  padding: 6px 0;
  border-bottom: 1px solid var(--border);
  font-family: var(--font-body);
  font-size: 0.92rem;
}
.proto-poi:last-child { border-bottom: none; }
.proto-poi-name {
  font-weight: 500;
  color: var(--text);
  /* min-width:0 lets very long POI names truncate cleanly inside flex */
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 100%;
}
/* Metadata cluster groups rating + duration/mode + category into a single */
/* unit that sits just to the right of the name. margin-left:auto would    */
/* push it to the far right (the old behavior) — we want the opposite, so  */
/* we omit margin-left:auto and rely on the 12px gap from the parent.      */
.proto-poi-meta {
  display: flex;
  align-items: baseline;
  gap: 10px;
  flex-shrink: 0;
  font-size: 0.8rem;
  color: var(--text-muted);
}
.proto-poi-rating { color: var(--gold, #c6a766); font-variant-numeric: tabular-nums; font-weight: 600; display: inline-flex; align-items: baseline; gap: 4px; }
/* Phase 42: per-POI review count, e.g. "112k". Muted + smaller so the star  */
/* rating stays dominant; the full count is in the element's title tooltip.  */
.proto-poi-reviews { color: var(--text-muted); font-weight: 500; font-size: 0.72rem; font-variant-numeric: tabular-nums; }
.proto-poi-cat { text-transform: lowercase; letter-spacing: 0.04em; }
.proto-poi-dur { font-variant-numeric: tabular-nums; white-space: nowrap; }

/* Phase 41: two-column POI layout. LEFT column = walkable POIs (the POI    */
/* carries a Walking transport option); RIGHT column = everything reachable */
/* by a short ride (Taxi / Public transport). Each column has its own header */
/* (mode icon + label + count) and an independent .proto-poi-list. On phones */
/* the grid collapses to a single column so rows never get cramped.         */
.proto-poi-cols {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-5, 24px);
  align-items: start;
}
.proto-poi-col { min-width: 0; }
.proto-poi-col-head {
  display: flex;
  align-items: center;
  gap: 8px;
  padding-bottom: 6px;
  margin-bottom: 4px;
  border-bottom: 2px solid var(--border);
  font-family: var(--font-body);
  font-size: 0.82rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--text-muted);
}
.proto-poi-col-icon { font-size: 0.95rem; line-height: 1; }
.proto-poi-col-count {
  margin-left: auto;
  min-width: 20px;
  padding: 1px 7px;
  border-radius: 999px;
  background: color-mix(in srgb, var(--gold, #c6a766) 18%, transparent);
  color: var(--gold, #c6a766);
  font-size: 0.72rem;
  font-weight: 700;
  text-align: center;
  font-variant-numeric: tabular-nums;
}
.proto-poi-empty {
  padding: 10px 0;
  font-family: var(--font-body);
  font-size: 0.84rem;
  font-style: italic;
  color: var(--text-muted);
}
@media (max-width: 699.98px) {
  .proto-poi-cols { grid-template-columns: 1fr; gap: var(--space-4, 16px); }
}

/* Phone view: restore the original card-style 2-line layout so the row     */
/* doesn't get cramped on narrow screens (where wrapping would force the    */
/* metadata onto a new line anyway, but without visual separation).        */
@media (max-width: 699.98px) {
  .proto-poi-list { gap: var(--space-2); }
  .proto-poi {
    flex-direction: column;
    align-items: stretch;
    gap: 4px;
    padding: var(--space-3);
    border: 1px solid var(--border);
    border-radius: 8px;
    background: color-mix(in srgb, var(--surface) 95%, transparent);
  }
  .proto-poi:last-child { border-bottom: 1px solid var(--border); }
  .proto-poi-name {
    font-weight: 600;
    white-space: normal;
    overflow: visible;
    text-overflow: clip;
  }
  .proto-poi-meta {
    justify-content: flex-start;
    flex-wrap: wrap;
    font-size: 0.78rem;
  }
}

/* 4) Grouped Amenities */
/* Phase 47: tightened the grid to make the single (now merged) Amenities
   section shorter length-wise — narrower min column so more categories pack
   per row, and smaller gaps/padding so the block is denser without feeling
   cramped. */
.proto-amen-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  gap: var(--space-2) var(--space-3);
}
.proto-amen-group {
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: var(--space-2) var(--space-3);
  background: color-mix(in srgb, var(--surface) 95%, transparent);
}
/* SIGNATURE-AMENITIES-2026: Signature Amenities plus optional Services Menu.
   Same chrome on both boxes. Spa | Beach | Pool are true columns (not a
   row-major item grid). A faint subbox wraps a family only when it still
   has a schedule. Priced rows sit in Services Menu directly underneath,
   regular weight. Both boxes span the grid and repeat under Quick Brief. */
.proto-amen-group--signature,
.proto-amen-group--services {
  grid-column: 1 / -1;
  background: color-mix(in srgb, var(--gold, #c6a766) 7%, var(--surface));
  border-color: color-mix(in srgb, var(--gold, #c6a766) 35%, var(--border));
}
.proto-amen-signature-body {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.proto-amen-subbox {
  border: 1px solid color-mix(in srgb, var(--gold, #c6a766) 22%, var(--border));
  background: color-mix(in srgb, var(--gold, #c6a766) 4%, transparent);
  border-radius: 6px;
  padding: 8px 10px 6px;
}
.proto-amen-subbox-title {
  font-size: 0.68rem;
  letter-spacing: 0.07em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--gold, #c6a766) 72%, var(--text-muted));
  font-weight: 600;
  margin-bottom: 6px;
}
.proto-amen-group--missing {
  grid-column: 1 / -1;
  padding-block: var(--space-2);
  background: color-mix(in srgb, var(--text-muted) 4%, var(--surface));
  border-color: color-mix(in srgb, var(--text-muted) 18%, var(--border));
}
.proto-amen-group--missing .proto-amen-group-title {
  color: var(--text-muted);
}
/* Placement 2 (standalone, under Quick Brief/pitch, above prices): reuse the
   same .proto-amen-grid → .proto-amen-group--signature chain outside the
   Amenities collapsible so spacing/gold accent match exactly, then add the
   same top/bottom rhythm the pitch/Quick Brief block uses so it reads as one
   more editorial block in that sequence rather than a stray fragment. */
.proto-amen-grid--standalone {
  margin: 0 0 var(--space-6) 0;
  padding-bottom: var(--space-5);
  border-bottom: 1px solid var(--border);
}
.proto-amen-group--signature .proto-amen-items {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.proto-amen-sig-cols {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: var(--space-3) var(--space-5);
  align-items: start;
}
.proto-amen-sig-col-title {
  font-size: 0.68rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--gold, #c6a766);
  font-weight: 600;
  margin-bottom: 6px;
}
.proto-amen-group--signature .proto-amen-sig-rest {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 4px var(--space-4);
  margin-top: var(--space-3);
}
.proto-amen-item--signature {
  font-size: 0.86rem;
  line-height: 1.4;
  font-weight: 400;
  display: block;
  list-style: none;
  position: relative;
  padding-left: 14px;
}
.proto-amen-item--signature .proto-amen-name,
.proto-amen-item--signature .proto-amen-tail {
  font-weight: 400;
}
.proto-amen-item--signature .proto-amen-tail {
  color: var(--text-muted);
}
.proto-amen-hours {
  display: block;
  font-weight: 400;
  color: var(--text-muted);
  font-size: 0.8rem;
  line-height: 1.35;
  margin-top: 2px;
}
.proto-amen-sig-name {
  min-width: 0;
  flex: 1 1 auto;
}
.proto-amen-sig-meta {
  flex: 0 1 46%;
  text-align: right;
  color: var(--text-muted);
  font-size: 0.82rem;
}
.proto-amen-item--signature.proto-amen-item--cadence {
  display: list-item;
}
.proto-amen-item--signature.proto-amen-item--cadence strong {
  font-weight: 700;
}
@media (max-width: 640px) {
  .proto-amen-sig-cols {
    grid-template-columns: 1fr;
  }
  .proto-amen-sig-meta {
    flex-basis: 40%;
  }
}
.proto-amen-item--signature::before {
  content: "";
  position: absolute;
  left: 2px;
  top: 0.55em;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--gold, #c6a766);
}
.proto-amen-group-title {
  font-size: 0.72rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--gold, #c6a766);
  margin-bottom: var(--space-2);
  font-weight: 600;
}
.proto-amen-items { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.proto-amen-item { font-size: 0.85rem; display: flex; justify-content: space-between; align-items: baseline; gap: var(--space-2); }
.proto-amen-item.proto-amen-item--signature {
  display: block;
  justify-content: unset;
  align-items: unset;
  font-weight: 400;
}
.proto-amen-group--services .proto-amen-items {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.proto-amen-label {
  font-size: 0.65rem;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--text-muted);
  background: color-mix(in srgb, var(--text-muted) 12%, transparent);
  padding: 1px 6px;
  border-radius: 3px;
  white-space: nowrap;
}

/* 4b) What's Missing — excluded_amenities. Muted, low-key styling that reads
   clearly as "absence": desaturated pills with a strike-through ✕ cue, set
   apart from the gold present-amenities styling above it. */
.proto-missing-intro {
  font-size: 0.85rem;
  color: var(--text-muted);
  margin: 0 0 var(--space-3) 0;
  line-height: 1.45;
}
.proto-missing-grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2);
}
.proto-missing-item {
  font-size: 0.82rem;
  color: var(--text-muted);
  background: color-mix(in srgb, var(--text-muted) 8%, transparent);
  border: 1px solid color-mix(in srgb, var(--text-muted) 22%, transparent);
  padding: 4px 10px 4px 24px;
  border-radius: 999px;
  position: relative;
  white-space: nowrap;
}
.proto-missing-item::before {
  content: "\00d7"; /* × */
  position: absolute;
  left: 9px;
  top: 50%;
  transform: translateY(-50%);
  font-weight: 700;
  font-size: 0.9rem;
  line-height: 1;
  color: color-mix(in srgb, #c0524b 80%, var(--text-muted));
}

/* 5) Green Practices */
.proto-sus-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: var(--space-3);
}
.proto-sus-group {
  border-left: 2px solid color-mix(in srgb, #5fbe87 60%, transparent);
  padding-left: var(--space-3);
}
.proto-sus-group-title {
  font-size: 0.72rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: color-mix(in srgb, #5fbe87 85%, var(--ink, currentColor));
  font-weight: 600;
  margin-bottom: 4px;
}
.proto-sus-items { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }
.proto-sus-item { font-size: 0.82rem; color: var(--text-muted); }

/* 6) Contact strip */
.proto-contact {
  border-top: 1px solid var(--border);
  padding-top: var(--space-4);
  margin-top: var(--space-6);
}
.proto-contact-row {
  display: flex;
  justify-content: space-between;
  gap: var(--space-4);
  flex-wrap: wrap;
  font-size: 0.85rem;
  color: var(--text-muted);
}
.proto-contact-addr { max-width: 60ch; }
.proto-contact-phone { color: var(--gold, #c6a766); text-decoration: none; font-weight: 500; font-variant-numeric: tabular-nums; }
.proto-contact-phone:hover { text-decoration: underline; }

/* Phase 31: lazy-load sentinel — invisible 1px row beneath the grid that the
   IntersectionObserver watches to trigger the next batch of cards. */
.grid-lazy-sentinel {
  width: 100%;
  height: 1px;
  pointer-events: none;
}

/* ===================================================================== */
/* ===== REDESIGN-2026: jewel theme system + editorial hero — START ===== */
/* ===================================================================== */
/* Everything below is additive + reversible. It (a) defines 8 era×theme   */
/* token sets, (b) styles the new jewel cycler + sparkle, (c) styles the   */
/* Card/Map/Country mode dropdown to mirror the region pill, (d) builds the */
/* 2-column editorial hero, (e) sets per-era display fonts, (f) the toast,  */
/* and (g) overrides the old hero so the cards peek above the fold.        */
/* To revert: delete from this banner to the matching END banner, and      */
/* restore the REDESIGN-2026-removed rules noted inline above (none were    */
/* deleted — old hero rules are simply overridden here).                   */

/* ---- 0. Legacy control hidden: the old 2-state #viewToggle is kept in the
   DOM (its id/label power existing Map-mode wiring) but must stay invisible.
   The base `.view-toggle{display:inline-flex}` rule overrode the HTML `hidden`
   attribute, so force it off here. ---------------------------------------- */
#viewToggle[hidden] { display: none !important; }

/* ---- 0b. Shared fallbacks for tokens the rail/teaser reference --------- */
:root {
  --hairline: var(--border);
  --hairline-soft: var(--border);
  /* --font-sans was referenced but never defined; alias to the body face. */
  --font-sans: var(--font-body);
  /* New era tokens (overridden per era below). */
  --font-wordmark: var(--font-display);
  --rule-gold: var(--gold);
  --eyebrow-spacing: 0.34em;
}

/* ============================================================ */
/* 1. ERA × THEME TOKEN SETS  (4 eras × {light,dark} = 8)        */
/*    Each block only nudges palette + display type so the      */
/*    Editorial layout reads era-appropriate. The LAYOUT never  */
/*    changes — only color, ornament accent, and display font.  */
/* ============================================================ */

/* ---- EDITORIAL (the neutral Swiss reference) ---- */
:root[data-era="editorial"] {
  /* EDITORIAL-ELEVATE-2026 — was 'Cabinet Grotesk' sans (same clean-modern
     register as the eyebrow/body faces, which read as "quiet" rather than
     distinct). Bodoni Moda is a real Didone headline face — see the full
     EDITORIAL-ELEVATE-2026 block below (search marker) for the rest of the
     Editorial-only typography/background/chrome/imagery overrides. */
  --font-wordmark: 'Bodoni Moda', 'Didot', Georgia, serif;
  --eyebrow-spacing: 0.34em;
  /* CARD-NAME-ERA-2026 — clean modern display sans: a true editorial masthead
     voice that reads completely differently from the three serif/geo eras. */
  --font-card-name: 'Cabinet Grotesk', 'Satoshi', system-ui, sans-serif;
  --card-name-weight: 700;
  /* CARD-NAME-SIZE-BUMP-2026 — slightly bigger (1.4rem -> 1.5rem). */
  --card-name-size: 1.5rem;
  --card-name-leading: 1.18;
  --card-name-tracking: -0.012em;
  --card-name-case: none;
}
/* EDITORIAL-ELEVATE-2026: editorial light/dark no longer inherit the base
   light/dark --bg/--surface/--border palette verbatim — see the dedicated
   background override in the EDITORIAL-ELEVATE-2026 block (search marker)
   below, which pushes editorial to stark white / near-black instead of the
   warm ivory/charcoal the other three eras share. */
/* GREEN-CONTRAST-2026 — Editorial muted eucalyptus/sage, minimalist. Scoped
   to light theme so dark mode editorial keeps its base palette. */
:root[data-era="editorial"][data-theme="light"] {
  /* GREEN-DIFFERENTIATION-2026 (QA fix #2) — Editorial is the quietest of the
     four: a desaturated grey-sage so the Swiss-neutral era reads restrained and
     clearly NOT the same green as the other three. Lowest chroma of the set. */
  --contrast-green: #b0c0a9;        /* muted grey-sage band */
  --contrast-green-strong: #98ab90;
  --contrast-green-ink: #283026;
  --contrast-green-rule: #4d6043;
}

/* ---- BELLE ÉPOQUE (default) — warm Art-Nouveau romance ---- */
:root[data-era="belleepoque"] {
  --font-wordmark: 'Marcellus', 'Cormorant Garamond', Georgia, serif;
  --eyebrow-spacing: 0.30em;
  /* CARD-NAME-ERA-2026 — Gilda Display: a romantic high-contrast Didone serif.
     Distinct from the Cormorant body face yet stays in the warm Art-Nouveau
     register, so Belle Époque cards feel hand-set and editorial-luxe. */
  --font-card-name: 'Gilda Display', 'Cormorant Garamond', Georgia, serif;
  --card-name-weight: 700;
  /* CARD-NAME-SIZE-BUMP-2026 — slightly bigger (1.5rem -> 1.6rem). */
  --card-name-size: 1.6rem;
  --card-name-leading: 1.22;
  --card-name-tracking: 0.004em;
  --card-name-case: none;
}
:root[data-era="belleepoque"][data-theme="light"] {
  --bg: #f6f0e2;                 /* warmer ivory */
  --bg-sunken: #efe6d2;
  --surface: #fffdf7;
  --surface-hover: #f8f1e2;
  --text: #2a2417;               /* warm sepia-ink */
  --text-muted: #6e6045;
  --gold: #9c7d3f;               /* antique champagne-bronze */
  --gold-bright: #b89253;
  --gold-deep: #6f5a2c;
  --rule-gold: #b89253;
  /* GREEN-CONTRAST-2026 / GREEN-DIFFERENTIATION-2026 (QA fix #2) — Belle Époque
     is the WARM-OLIVE corner of the green family: a yellower moss/olive sage
     that echoes the Art-Nouveau foliage in the wordmark art and pulls clearly
     toward yellow-green, away from the cooler Deco/Mid jades. */
  --contrast-green: #b6c585;        /* warm olive-moss band */
  --contrast-green-strong: #9eb16b; /* hover / emphasis */
  --contrast-green-ink: #2f3a1c;    /* readable deep-olive ink on the green */
  --contrast-green-rule: #56682a;   /* accent hairline */
}
:root[data-era="belleepoque"][data-theme="dark"] {
  /* DARK-LIGHTEN-2026 — "dark, not black": lifted the warm near-black several
     steps so the page reads as a dim, candle-lit salon rather than lights-off.
     Old: bg #14110b / sunken #100d08 / surface #1d1810 / hover #261f14. */
  --bg: #221d14;                 /* warm low-lit brown-charcoal (was #14110b) */
  --bg-sunken: #1a1610;
  --surface: #2c2519;
  --surface-hover: #382f20;
  --text: #f3ead4;
  --text-muted: #bcae8e;
  --gold: #c2a35f;
  --gold-bright: #d8bd80;
  --gold-deep: #8f7740;
  --rule-gold: #c2a35f;
  /* DARK-CONTRAST-GREEN-2026 — dark counterpart of the Belle Époque warm-olive
     band. A desaturated, low-luminance moss that still sits a clear step ABOVE
     the dark bg so the header / sort toolbar read as distinct navigation bands
     (mirrors the light-mode green that makes the region + mode selectors pop).
     Light ink for AA contrast on the deep green. */
  --contrast-green: #3a4a2c;        /* deep warm-olive band (vs bg #221d14) */
  --contrast-green-strong: #475a36; /* hover / emphasis */
  --contrast-green-ink: #e8ecd2;    /* light olive-cream ink, AA on the band */
  --contrast-green-rule: #8aa253;   /* bright moss hairline accent */
}

/* ---- ART DECO — geometric, stepped gold linework ---- */
:root[data-era="artdeco"] {
  --font-wordmark: 'Poiret One', 'Cinzel', system-ui, sans-serif;
  --eyebrow-spacing: 0.42em;
  /* CARD-NAME-CASE-FIX-2026 — owner clarified the hotel-card name must be REGULAR
     mixed-case (not all-caps). The previous Cinzel inscriptional ALL-CAPS
     treatment was a misread of "make the name slightly bigger". Reverted to a
     normal mixed-case serif (Cormorant Garamond, matching the base/Belle-Époque
     register) with case:none. Size is brought in line with the other eras (and
     the global slight bump) since we no longer need to shrink to fit caps width;
     tracking reset to near-normal for mixed-case serif. */
  --font-card-name: 'Cormorant Garamond', 'Cormorant', Georgia, serif;
  --card-name-weight: 700;
  /* CARD-NAME-SIZE-BUMP-2026 — slightly bigger (1.5rem -> 1.6rem). */
  --card-name-size: 1.6rem;
  --card-name-leading: 1.22;
  --card-name-tracking: 0.003em;
  --card-name-case: none;
}
:root[data-era="artdeco"][data-theme="light"] {
  --bg: #f1efe9;                 /* cool pearl */
  --bg-sunken: #e7e4da;
  --surface: #ffffff;
  --surface-hover: #f4f2ea;
  --text: #1b1f24;               /* near-black graphite */
  --text-muted: #525a64;
  --gold: #8d7536;               /* deco brass */
  --gold-bright: #ad9148;
  --gold-deep: #6a5727;
  --rule-gold: #ad9148;
  /* GREEN-CONTRAST-2026 / GREEN-DIFFERENTIATION-2026 (QA fix #2) — Art Deco is
     the DEEP COOL EMERALD corner: a more saturated blue-green that reads jewel-
     toned and geometric, clearly cooler + greener than the warm BE olive and
     deeper than the airy Mid turquoise. */
  --contrast-green: #82bca0;        /* deep cool emerald band */
  --contrast-green-strong: #5fa685;
  --contrast-green-ink: #0f2a1f;
  --contrast-green-rule: #1f6e4f;
}
:root[data-era="artdeco"][data-theme="dark"] {
  /* DARK-LIGHTEN-2026 — lifted the obsidian to a deep slate-graphite so the
     Deco theme reads dim-luxe, not pitch black.
     Old: bg #0c0e12 / sunken #08090c / surface #14171d / hover #1c2029. */
  --bg: #181c23;                 /* deep slate-graphite (was #0c0e12) */
  --bg-sunken: #12151b;
  --surface: #222730;
  --surface-hover: #2b313c;
  --text: #eef0f3;
  --text-muted: #a4abb7;
  --gold: #c4a456;
  --gold-bright: #dcc07c;
  --gold-deep: #8f7637;
  --rule-gold: #c4a456;
  /* DARK-CONTRAST-GREEN-2026 — dark counterpart of the Deco cool-emerald band:
     a deep jewel-green that stays cooler/bluer than the BE olive and clearly
     separates the nav bands from the slate bg. Light mint ink for AA. */
  --contrast-green: #234a3a;        /* deep cool emerald band (vs bg #181c23) */
  --contrast-green-strong: #2c5c48;
  --contrast-green-ink: #d8efe3;
  --contrast-green-rule: #4fb38c;
}

/* ---- MID-CENTURY — friendly, warm, atomic ---- */
:root[data-era="midcentury"] {
  --font-wordmark: 'Poppins', 'Cabinet Grotesk', system-ui, sans-serif;
  --eyebrow-spacing: 0.28em;
  /* CARD-NAME-ERA-2026 — Poppins semibold: the warm geometric atomic-age sans
     the QA flagged as missing from the grid. Gives mid-century cards a friendly
     rounded bold-sans hero treatment, clearly NOT a serif era. */
  --font-card-name: 'Poppins', 'Cabinet Grotesk', system-ui, sans-serif;
  --card-name-weight: 700;
  /* CARD-NAME-SIZE-BUMP-2026 — slightly bigger (1.32rem -> 1.42rem). */
  --card-name-size: 1.42rem;
  --card-name-leading: 1.24;
  --card-name-tracking: -0.004em;
  --card-name-case: none;
}
:root[data-era="midcentury"][data-theme="light"] {
  --bg: #f5efe1;                 /* warm cream */
  --bg-sunken: #ece3cf;
  --surface: #fffaf0;
  --surface-hover: #f6eed9;
  --text: #2c2519;               /* walnut ink */
  --text-muted: #6c5f49;
  --gold: #a07c3c;               /* cognac-topaz gold */
  --gold-bright: #c0974e;
  --gold-deep: #74592a;
  --indie: #1f8f78;              /* keep jade tertiary */
  --rule-gold: #c0974e;
  /* GREEN-CONTRAST-2026 / GREEN-DIFFERENTIATION-2026 (QA fix #2) — Mid-century
     is the BRIGHT AQUA-TURQUOISE corner: the liveliest, most cyan of the four,
     matching the atomic-age turquoise in the era ornaments + --indie jade.
     Airy and friendly, clearly bluer than the Deco emerald. */
  --contrast-green: #84d0c0;        /* bright aqua-turquoise band */
  --contrast-green-strong: #63c2ae;
  --contrast-green-ink: #103029;
  --contrast-green-rule: #129683;
}
:root[data-era="midcentury"][data-theme="dark"] {
  /* DARK-LIGHTEN-2026 — lifted the espresso-black to a warm walnut-charcoal so
     the atomic-age theme stays inviting, not lights-off.
     Old: bg #16120b / sunken #110e08 / surface #211a10 / hover #2b2215. */
  --bg: #241d12;                 /* warm walnut-charcoal (was #16120b) */
  --bg-sunken: #1b1610;
  --surface: #2f2616;
  --surface-hover: #3a2f1c;
  --text: #f4ebd7;
  --text-muted: #c2b190;
  --gold: #c79f5a;
  --gold-bright: #ddbb7c;
  --gold-deep: #95773f;
  --rule-gold: #c79f5a;
  /* DARK-CONTRAST-GREEN-2026 — dark counterpart of the Mid-century aqua-
     turquoise band: a deep teal that keeps the era's cyan character while
     sitting a clear step above the walnut bg. Light aqua ink for AA. */
  --contrast-green: #1c4a44;        /* deep aqua-teal band (vs bg #241d12) */
  --contrast-green-strong: #245c54;
  --contrast-green-ink: #d6f0ea;
  --contrast-green-rule: #3fb4a2;
}

/* ============================================================ */
/* 2. JEWEL CYCLER BUTTON                                        */
/* ============================================================ */
.jewel-toggle {
  position: relative;
  box-sizing: border-box;
  width: var(--header-control-h);
  height: var(--header-control-h);
  flex: 0 0 var(--header-control-h);
  display: inline-flex; align-items: center; justify-content: center;
  padding: 0;
  border: 1.5px solid var(--gold);
  border-radius: 50%;
  background: var(--surface);
  box-shadow: 0 1px 0 rgba(198, 167, 102, 0.18) inset;
  overflow: visible;
  transition: border-color var(--dur-fast) var(--ease),
              background var(--dur-fast) var(--ease),
              transform var(--dur-fast) var(--ease),
              box-shadow var(--dur-fast) var(--ease);
}
.jewel-toggle:hover {
  border-color: var(--gold-bright);
  background: var(--surface-hover);
  transform: translateY(-1px) scale(1.04);
  box-shadow: 0 2px 8px rgba(198, 167, 102, 0.22);
}
.jewel-toggle:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 2px;
}
/* JEWEL-CROSSFADE-2026: stack two layers in one grid cell — perfect centering
   inside the circle — and crossfade opacity on era/theme change. */
.jewel-stage {
  position: relative;
  width: 34px;
  height: 34px;
  display: grid;
  place-items: center;
  flex-shrink: 0;
  transition: transform var(--dur-fast) var(--ease);
}
.jewel-img {
  grid-area: 1 / 1;
  width: 100%;
  height: 100%;
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  object-position: center center;
  display: block;
  pointer-events: none;
  filter: drop-shadow(0 1px 2px rgba(0,0,0,0.28));
  opacity: 0;
  transition: opacity 200ms var(--ease);
}
.jewel-img.is-visible {
  opacity: 1;
}
.jewel-toggle:hover .jewel-stage { transform: scale(1.06); }

/* Hover/focus sparkle — a small white star-glint that scales+fades.
   Driven by the .is-sparkling class JS toggles (removed on animationend). */
.jewel-sparkle {
  position: absolute;
  top: 6px; right: 6px;
  width: 10px; height: 10px;
  pointer-events: none;
  opacity: 0;
  background:
    radial-gradient(circle, #fff 0%, rgba(255,255,255,0.85) 30%, rgba(255,255,255,0) 65%);
  border-radius: 50%;
  transform: scale(0.2);
}
.jewel-toggle.is-sparkling .jewel-sparkle {
  animation: jewelSparkle 560ms var(--ease);
}
.jewel-toggle.is-sparkling::after {
  /* a brief soft radial glow behind the jewel */
  content: "";
  position: absolute; inset: -4px;
  border-radius: 50%;
  background: radial-gradient(circle, var(--gold-bright) 0%, rgba(0,0,0,0) 62%);
  opacity: 0;
  pointer-events: none;
  animation: jewelGlow 560ms var(--ease);
}
@keyframes jewelSparkle {
  0%   { opacity: 0;   transform: scale(0.2) rotate(0deg); }
  35%  { opacity: 0.95; transform: scale(1)   rotate(35deg); }
  100% { opacity: 0;   transform: scale(0.4) rotate(70deg); }
}
@keyframes jewelGlow {
  0%   { opacity: 0; }
  40%  { opacity: 0.45; }
  100% { opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .jewel-toggle.is-sparkling .jewel-sparkle,
  .jewel-toggle.is-sparkling::after { animation: none; opacity: 0; }
  .jewel-stage, .jewel-toggle:hover .jewel-stage { transition: none; transform: none; }
  .jewel-img { transition: none; }
}

/* ============================================================ */
/* 3. MODE DROPDOWN (Card / Map / Country) — mirrors region pill */
/*    #modeButton already carries .region-select so it inherits  */
/*    the pill shape; #modeMenu reuses .dropdown-menu. We only    */
/*    add the wrapper + a sensible width + the active-mode accent.*/
/* ============================================================ */
.mode-select-wrap {
  position: relative;
  display: inline-flex;
  align-items: center;
}
/* Mode pill — same footprint as region / Filters (HEADER-ALIGN-2026). */
#modeButton.mode-select {
  padding: 0 var(--header-control-pad-x);
  min-height: var(--header-control-h);
  height: var(--header-control-h);
  font-size: var(--header-control-fs);
  line-height: 1;
}
#modeButton.mode-select .mode-icon { color: var(--gold); flex-shrink: 0; }
#modeButton.mode-select .chev { opacity: 0.7; transition: transform var(--dur-fast) var(--ease); }
#modeButton.mode-select[aria-expanded="true"] .chev { transform: rotate(180deg); }

/* The mode menu is a short option list — give it a tidier min-width than
   the big region map menu and right-align it under the button. */
#modeMenu.dropdown-menu {
  min-width: 200px;
}
#modeMenu li.is-featured {
  margin: 6px 0;
  padding: 10px 14px;
  font-weight: 700;
  letter-spacing: 0.02em;
  color: var(--gold-bright);
  background: linear-gradient(90deg, rgba(198, 167, 102, 0.14) 0%, transparent 100%);
  border-top: 1px solid rgba(198, 167, 102, 0.22);
  border-bottom: 1px solid rgba(198, 167, 102, 0.22);
}
#modeMenu li.is-featured:hover {
  color: var(--gold-bright);
  background: linear-gradient(90deg, rgba(198, 167, 102, 0.22) 0%, rgba(198, 167, 102, 0.06) 100%);
}
#modeMenu li.is-featured[aria-selected="true"] {
  color: var(--gold-bright);
}
#modeMenu .rail-index { display: none; } /* guard: no stray index numerals */

/* ============================================================ */
/* 4. EDITORIAL HERO (2-column; default-skinned Belle Époque)    */
/*    Overrides the old centered hero so card tops peek above    */
/*    the fold. Old hero rules are left intact but neutralized.  */
/* ============================================================ */

/* Neutralize leftover old-hero decorations should any markup linger. */
.hero--editorial .art-frame,
.hero--editorial .hero-placeholders,
.hero--editorial .crest-divider,
.hero--editorial .hero-title,
.hero--editorial .region-title,
.hero--editorial .tagline { display: none !important; }

.hero.hero--editorial {
  position: relative;
  max-width: var(--max-w);
  margin: 0 auto;
  /* HERO-STATS-MASTHEAD-2026: stats moved under wordmark — tighter hero so
     card row starts higher on the page. */
  padding: clamp(0.55rem, 1.6vh, 1.25rem) var(--space-6) clamp(0.45rem, 1.2vh, 0.85rem);
  overflow: visible;
}
.hero--editorial .hero-inner.hero-grid {
  max-width: none;
  margin: 0;
  text-align: left;
  display: grid;
  grid-template-columns: minmax(0, 58fr) minmax(0, 42fr);
  align-items: stretch;
  gap: clamp(1rem, 2.8vw, 2.5rem);
}

/* ---- LEFT column: masthead ----
   HERO-FIX-2026: center the whole masthead column so the illustrated
   wordmark sits centered in its zone and the HOTELS | BRANDS | FROM stats
   row lines up directly beneath its optical center (was left-tilted before,
   which made the differently-shaped per-era emblems look off-axis). */
.hero-lead {
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: center;
  text-align: center;
  min-width: 0;
  min-height: 100%;
  height: 100%;
}
.hero-lead-brand {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  width: 100%;
  min-height: 0;
  padding: 0.15rem 0 0.25rem;
}
/* PERF-LCP-2026: softened vs HERO-LEAD-FILL-2026 — still fills the column,
   but without min-heights that forced a half-viewport LCP on mobile lab. */
.hero-lead-brand .hero-wordmark-art {
  flex: 0 1 auto;
  width: auto;
  max-width: 98%;
  height: var(--wordmark-art-h, clamp(200px, 32vw, 400px));
  max-height: min(48vh, 460px);
  min-height: 0;
  object-fit: contain;
  object-position: center center;
  margin: 0 auto;
}
/* HERO-FIX-2026: the 'THE FULL ATLAS' eyebrow is removed from the hero markup
   (it duplicated the results-eyebrow lower on the page and floated awkwardly
   above the wordmark). Rule kept inert in case any other view references it. */
.hero-eyebrow {
  display: none;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.72rem;
  letter-spacing: var(--eyebrow-spacing);
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: 0.6rem;
}
.hero-wordmark {
  font-family: var(--font-wordmark);
  /* Visible product name after illustrated art retirement (2026-08-16). */
  font-size: clamp(2.4rem, 5.5vw, 3.8rem);
  line-height: 1.04;
  font-weight: 600;
  letter-spacing: 0.04em;
  color: var(--text);
  margin: 0;
  text-transform: uppercase;
}
/* ===== REDESIGN-2026 WORDMARK-ART — retired 2026-08-16 ========================
   Illustrated emblems in art/wordmarks/ are kept on disk but no longer shown
   (old HOTEL lettering). Do not add .has-wordmark-art. The webfont h1 above is
   the live title. Rules below stay inert unless that class is reintroduced. */
.hero-wordmark-art {
  display: none;
  /* HERO-FIX-2026: size by HEIGHT, not width. The four era emblems have very
     different aspect ratios (BE ~1.10 near-square, Art Deco/Editorial ~1.50
     wide). Width-only sizing made the near-square BE emblem tower over the
     wide ones. A shared target HEIGHT makes every era occupy the same vertical
     zone so the LETTERING reads at a comparable scale. A max-width cap keeps
     the widest emblem from overflowing the column. */
  height: var(--wordmark-art-h, clamp(150px, 24vw, 280px));
  width: auto;
  max-width: 98%;   /* WORDMARK-FILL-2026.2: raised so the wide, now content-cropped Art Deco / Editorial emblems can grow to fill the column width */
  /* Center horizontally within the (now centered) hero-lead column. */
  margin: 0 auto 0.05rem;
  -webkit-user-select: none;
  user-select: none;
  pointer-events: none;
}
.hero--editorial.has-wordmark-art .hero-wordmark-art { display: block; }
/* Clip (don't remove) the webfont h1 so search engines + a11y still read it. */
.hero--editorial.has-wordmark-art .hero-wordmark {
  position: absolute;
  width: 1px; height: 1px;
  margin: -1px; padding: 0; border: 0;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  overflow: hidden;
  white-space: nowrap;
}
/* Per-era HEIGHT calibration: each emblem carries different internal
   transparent padding + ornament around the lettering, so equal raw heights
   don't yield equal LETTERING size. These per-era heights are tuned so the
   actual "LUXURY HOTELS ATLAS" type reads at a consistent visual weight across
   all four eras. All emblems are also capped by max-width:100% above so the
   wide Art Deco / Editorial pieces never overflow the centered column. */
/* ===== WORDMARK-FILL-2026 / PERF-LCP-2026 =================================
   Still fills the masthead column, but dialed back from the Jun 16 fill peak
   (PERF 45→17 cliff) toward a middle ground between HERO-FIX and full fill.
   Per-era ratios preserved (BE tallest; Editorial shortest). ============== */
:root[data-era="belleepoque"] .hero-wordmark-art { --wordmark-art-h: clamp(230px, 36vw, 420px); }
:root[data-era="belleepoque"][data-theme="light"] .hero-wordmark-art { --wordmark-art-h: clamp(250px, 40vw, 450px); }
:root[data-era="artdeco"]     .hero-wordmark-art { --wordmark-art-h: clamp(225px, 36vw, 420px); }
:root[data-era="midcentury"]  .hero-wordmark-art { --wordmark-art-h: clamp(215px, 34vw, 400px); }
:root[data-era="editorial"]   .hero-wordmark-art { --wordmark-art-h: clamp(200px, 29vw, 340px); }
/* ===== REDESIGN-2026 WORDMARK-ART — END ===================================== */

/* ===== FILIGREE-BANDS-2026 — START ==========================================
   Two full-width decorative filigree bands that frame the editorial hero (a
   TOP band above the masthead/weekend-rail row and a BOTTOM band below the
   stats row) to add tasteful color to the otherwise cream-dominant light mode.
   Each band is a tall strip; its illustrated filigree is supplied ENTIRELY via
   per-era/theme background-image rules below (art/filigree/<top|bottom>_<era>_
   <theme>.png), centered and scaled to `contain`. The bands' HEIGHT is roughly
   double the thin rule they replace, per the owner's annotation, to give the
   art room to breathe. Decorative only (aria-hidden in markup). ============= */
.hero-filigree {
  width: 100%;
  /* Match page bg in transparent PNG margins; image fill snaps with theme. */
  background-color: var(--bg);
  /* FILIGREE-REDRAW-2026: the ornament art is now a FLAT wide strip (AR ~7:1),
     so the band can be shorter. Height drives the art via `contain`. */
  height: clamp(52px, 7vw, 92px);
  background-repeat: no-repeat;
  background-position: center center;
  /* FILIGREE-REDRAW-2026: `contain` fits the WHOLE flat ornament inside the
     band at every viewport width — it can never be clipped top or bottom. The
     previous `auto 100%` + `100% auto` (>=900px) rules forced the art taller
     than the band on wide heroes, which chopped the flowers/leaves off. */
  background-size: contain;
  pointer-events: none;
  -webkit-user-select: none;
  user-select: none;
}
/* FILIGREE-MOVE-2026: the filigrees now live INSIDE the right-hand rail,
   bracketing the two stacked cheapest-stays lists. They span the rail's full
   width (background-size:contain fits the whole ornament) and hug the lists
   tightly — top just above list 01, bottom just below list 02. */
.hero-rail .hero-filigree        { width: 100%; }
.hero-filigree--top    { margin: 0 auto clamp(0.35rem, 1vw, 0.7rem); }
.hero-filigree--bottom { margin: clamp(0.35rem, 1vw, 0.7rem) auto 0; }
/* In the narrower rail the ornament reads smaller; give it a touch more band
   height so the detail (ruby / roses) stays legible.
   SCROLL-NUDGE-2026: trimmed the upper bound (was 76px) since the filigree art
   is now cropped tight to its ornament — it still reads clearly at a shorter
   band, and the saving helps the first card row peek above the fold. */
.hero-rail .hero-filigree { height: clamp(44px, 4.6vw, 62px); }

/* DIRECTORY-FILIGREE-SCALE-2026: `.hero-filigree` height (up to 92px) was
   winning over the earlier Directory trim (same specificity, later source).
   ~half the live hero band so the roses/ruby stay readable without dominating. */
.directory-frame .hero-filigree.directory-filigree-top {
  height: clamp(26px, 3.5vw, 46px);
  margin: 0 auto clamp(8px, 1.2vw, 14px);
}
.directory-frame .hero-filigree.directory-filigree-bottom {
  height: clamp(24px, 3.2vw, 42px);
  margin: clamp(10px, 1.6vw, 16px) auto 0;
}

/* ===== SCROLL-NUDGE-2026 CHEVRON ==========================================
   A gentle, softly-bouncing "scroll down" cue anchored to the hero's bottom
   center. Pairs with the now-peeking card tops to pull visitors past the
   masthead. Theme-aware gold, glassy pill, auto-hides after the first scroll
   (JS toggles .is-hidden), and respects prefers-reduced-motion. ============= */
.hero-scroll-nudge {
  position: absolute;
  left: 50%;
  bottom: clamp(0.35rem, 1.4vh, 0.9rem);
  transform: translateX(-50%);
  z-index: 3;
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
  padding: 6px 16px 4px;
  border: 1px solid color-mix(in srgb, var(--gold) 38%, transparent);
  border-radius: 999px;
  background: color-mix(in srgb, var(--bg) 55%, transparent);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
  color: var(--gold);
  cursor: pointer;
  opacity: 0.9;
  transition: opacity 0.4s ease, transform 0.4s ease, visibility 0.4s ease;
}
.hero-scroll-nudge:hover { opacity: 1; }
.hero-scroll-nudge:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 3px;
}
.hero-scroll-nudge-label {
  font-family: var(--font-display, var(--font-sans));
  font-weight: 700;
  font-size: 0.62rem;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  line-height: 1;
  white-space: nowrap;
}
.hero-scroll-nudge-chev {
  display: block;
  animation: heroScrollBounce 1.8s ease-in-out infinite;
}
@keyframes heroScrollBounce {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(5px); }
}
/* Auto-hidden once the visitor scrolls (JS adds .is-hidden). */
.hero-scroll-nudge.is-hidden {
  opacity: 0;
  visibility: hidden;
  transform: translateX(-50%) translateY(8px);
  pointer-events: none;
}
/* Accessibility: no bounce for users who prefer reduced motion. */
@media (prefers-reduced-motion: reduce) {
  .hero-scroll-nudge-chev { animation: none; }
  .hero-scroll-nudge { transition: opacity 0.2s ease; }
}
/* On short viewports the nudge would overlap the rail's bottom filigree; the
   peeking cards already cue the scroll there, so keep it but nudge it tighter. */
@media (max-height: 760px) {
  .hero-scroll-nudge { bottom: 0.25rem; padding: 4px 13px 3px; }
  .hero-scroll-nudge-label { font-size: 0.58rem; }
}

/* ===== SCROLL-NUDGE-2026 RAIL DENSITY =====================================
   The hero's HEIGHT is governed by the right-hand rail (the two stacked
   cheapest-stays lists + filigrees), not the wordmark. To get the first card
   row to "peek" above the fold without changing the layout, gently tighten the
   rail's section-head bottom margin here; the row padding + divider margins are
   trimmed at their authoritative rules further below (search SCROLL-NUDGE). */
.hero-rail .cheapest-teaser-head { margin-bottom: clamp(0.3rem, 0.7vh, 0.55rem); }

/* Per-era / per-theme filigree art. TOP and BOTTOM use two DIFFERENT designs.
   Belle Époque keeps its single light asset for both light variants (a/b). */
:root[data-era="belleepoque"][data-theme="light"] .hero-filigree--top    { background-image: url("art/filigree/filigree_top_belleepoque_light.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_top_belleepoque_light.avif") type("image/avif") 1x, url("art/filigree/filigree_top_belleepoque_light.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_top_belleepoque_light.avif") type("image/avif") 1x, url("art/filigree/filigree_top_belleepoque_light.png") type("image/png") 1x); }
:root[data-era="belleepoque"][data-theme="dark"]  .hero-filigree--top    { background-image: url("art/filigree/filigree_top_belleepoque_dark.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_top_belleepoque_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_top_belleepoque_dark.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_top_belleepoque_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_top_belleepoque_dark.png") type("image/png") 1x); }
:root[data-era="belleepoque"][data-theme="light"] .hero-filigree--bottom { background-image: url("art/filigree/filigree_bottom_belleepoque_light.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_bottom_belleepoque_light.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_belleepoque_light.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_bottom_belleepoque_light.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_belleepoque_light.png") type("image/png") 1x); }
:root[data-era="belleepoque"][data-theme="dark"]  .hero-filigree--bottom { background-image: url("art/filigree/filigree_bottom_belleepoque_dark.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_bottom_belleepoque_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_belleepoque_dark.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_bottom_belleepoque_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_belleepoque_dark.png") type("image/png") 1x); }

:root[data-era="artdeco"][data-theme="light"] .hero-filigree--top    { background-image: url("art/filigree/filigree_top_artdeco_light.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_top_artdeco_light.avif") type("image/avif") 1x, url("art/filigree/filigree_top_artdeco_light.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_top_artdeco_light.avif") type("image/avif") 1x, url("art/filigree/filigree_top_artdeco_light.png") type("image/png") 1x); }
:root[data-era="artdeco"][data-theme="dark"]  .hero-filigree--top    { background-image: url("art/filigree/filigree_top_artdeco_dark.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_top_artdeco_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_top_artdeco_dark.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_top_artdeco_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_top_artdeco_dark.png") type("image/png") 1x); }
:root[data-era="artdeco"][data-theme="light"] .hero-filigree--bottom { background-image: url("art/filigree/filigree_bottom_artdeco_light.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_bottom_artdeco_light.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_artdeco_light.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_bottom_artdeco_light.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_artdeco_light.png") type("image/png") 1x); }
:root[data-era="artdeco"][data-theme="dark"]  .hero-filigree--bottom { background-image: url("art/filigree/filigree_bottom_artdeco_dark.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_bottom_artdeco_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_artdeco_dark.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_bottom_artdeco_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_artdeco_dark.png") type("image/png") 1x); }

:root[data-era="midcentury"][data-theme="light"] .hero-filigree--top    { background-image: url("art/filigree/filigree_top_midcentury_light.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_top_midcentury_light.avif") type("image/avif") 1x, url("art/filigree/filigree_top_midcentury_light.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_top_midcentury_light.avif") type("image/avif") 1x, url("art/filigree/filigree_top_midcentury_light.png") type("image/png") 1x); }
:root[data-era="midcentury"][data-theme="dark"]  .hero-filigree--top    { background-image: url("art/filigree/filigree_top_midcentury_dark.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_top_midcentury_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_top_midcentury_dark.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_top_midcentury_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_top_midcentury_dark.png") type("image/png") 1x); }
:root[data-era="midcentury"][data-theme="light"] .hero-filigree--bottom { background-image: url("art/filigree/filigree_bottom_midcentury_light.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_bottom_midcentury_light.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_midcentury_light.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_bottom_midcentury_light.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_midcentury_light.png") type("image/png") 1x); }
:root[data-era="midcentury"][data-theme="dark"]  .hero-filigree--bottom { background-image: url("art/filigree/filigree_bottom_midcentury_dark.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_bottom_midcentury_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_midcentury_dark.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_bottom_midcentury_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_midcentury_dark.png") type("image/png") 1x); }

:root[data-era="editorial"][data-theme="light"] .hero-filigree--top    { background-image: url("art/filigree/filigree_top_editorial_light.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_top_editorial_light.avif") type("image/avif") 1x, url("art/filigree/filigree_top_editorial_light.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_top_editorial_light.avif") type("image/avif") 1x, url("art/filigree/filigree_top_editorial_light.png") type("image/png") 1x); }
:root[data-era="editorial"][data-theme="dark"]  .hero-filigree--top    { background-image: url("art/filigree/filigree_top_editorial_dark.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_top_editorial_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_top_editorial_dark.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_top_editorial_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_top_editorial_dark.png") type("image/png") 1x); }
:root[data-era="editorial"][data-theme="light"] .hero-filigree--bottom { background-image: url("art/filigree/filigree_bottom_editorial_light.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_bottom_editorial_light.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_editorial_light.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_bottom_editorial_light.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_editorial_light.png") type("image/png") 1x); }
:root[data-era="editorial"][data-theme="dark"]  .hero-filigree--bottom { background-image: url("art/filigree/filigree_bottom_editorial_dark.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_bottom_editorial_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_editorial_dark.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_bottom_editorial_dark.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_editorial_dark.png") type("image/png") 1x); }

/* Default (no data-era/theme yet, e.g. first paint): Belle Époque light. */
:root .hero-filigree--top    { background-image: url("art/filigree/filigree_top_belleepoque_light.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_top_belleepoque_light.avif") type("image/avif") 1x, url("art/filigree/filigree_top_belleepoque_light.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_top_belleepoque_light.avif") type("image/avif") 1x, url("art/filigree/filigree_top_belleepoque_light.png") type("image/png") 1x); }
:root .hero-filigree--bottom { background-image: url("art/filigree/filigree_bottom_belleepoque_light.png");
  background-image: -webkit-image-set(url("art/filigree/filigree_bottom_belleepoque_light.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_belleepoque_light.png") type("image/png") 1x);
  background-image: image-set(url("art/filigree/filigree_bottom_belleepoque_light.avif") type("image/avif") 1x, url("art/filigree/filigree_bottom_belleepoque_light.png") type("image/png") 1x); }
/* ===== FILIGREE-BANDS-2026 — END ============================================ */

/* ===== GREEN-CONTRAST-2026 — START ==========================================
   Item 6: a tasteful green contrast surface across all eras. Each era×theme
   palette defines its own --contrast-green family (warm-olive / cool-emerald /
   aqua-turquoise / grey-sage in light; deeper desaturated counterparts in dark)
   so the green harmonizes with that era's character instead of one flat green
   everywhere. We override only three surfaces — the front-page header (region
   selector), the sort/search toolbar, and the modal's collapsible section bars.

   DARK-CONTRAST-GREEN-2026 (scope change): previously scoped to
   [data-theme="light"] ONLY, which left dark mode with header/toolbar bands the
   same near-black as the page — the region + mode selectors disappeared into
   the background. Now scoped to plain :root so BOTH themes get the band, each
   driven by its own --contrast-green token (dark themes now define a muted
   deep-green that lifts a clear step above the dark bg). Ink/rule colors are
   paired per theme for AA-readable contrast; falls back gracefully if absent. */

/* (a) Front-page header — region selector lives here. */
:root .site-header {
  background: var(--contrast-green, var(--bg-sunken));
  border-bottom-color: color-mix(in srgb, var(--contrast-green-rule, var(--border)) 38%, transparent);
}
/* Region prefix label + toggle text stay legible on the green band. */
:root .site-header .region-select-prefix {
  color: var(--contrast-green-ink, var(--text));
}

/* (b) Sort / search toolbar bar. */
:root .toolbar {
  background: var(--contrast-green, var(--bg-sunken));
  border-bottom-color: color-mix(in srgb, var(--contrast-green-rule, var(--border)) 38%, transparent);
}
:root .toolbar .toolbar-label {
  color: var(--contrast-green-ink, var(--text-muted));
}
/* Keep the sort dropdown + search input filled (surface) so they pop against
   the green bar, with a green accent on focus instead of gold. */
:root .toolbar .filter-select:hover,
:root .toolbar .filter-select:focus {
  border-color: var(--contrast-green-rule, var(--gold));
}

/* (c) Modal collapsible section bars — the clickable "collapse" headers.
   Re-skin the gold-tinted band as a green band. Keep the small left accent
   rule, now green. Label ink shifts to the green-paired ink. */
:root .proto-collapsible-summary {
  background:
    linear-gradient(to right, var(--contrast-green-rule, var(--gold)) 0 3px, transparent 3px),
    var(--contrast-green, var(--surface));
  background-repeat: no-repeat;
}
:root .proto-collapsible-summary:hover {
  background:
    linear-gradient(to right, var(--contrast-green-rule, var(--gold)) 0 3px, transparent 3px),
    var(--contrast-green-strong, var(--contrast-green, var(--surface)));
  background-repeat: no-repeat;
}
:root .proto-collapsible-label {
  color: var(--contrast-green-ink, var(--text)) !important;
}
:root .proto-collapsible-count {
  color: color-mix(in srgb, var(--contrast-green-ink, var(--text-muted)) 78%, transparent);
}
:root .proto-collapsible-chevron {
  color: var(--contrast-green-rule, var(--gold));
}
/* ===== GREEN-CONTRAST-2026 — END ============================================ */

/* ===== BAND-NAVY-DARK-2026 — START ==========================================
   Dark-mode-ONLY override. Now that the hotel cards are navy (#192740 via
   CARD-NAVY-DARK-2026), the green header + sort/search bands clash against
   them — the navy card hitting the green toolbar reads as discordant. Per
   direction, in DARK MODE the two bars (.site-header + .toolbar) return to a
   navy in the SAME family as the cards but "not-quite-the-same" — a touch
   lighter and bluer (#1d2c47 vs card #192740) so the bars stay a distinct
   band/surface rather than blending into the cards, while restoring harmony.

   Light mode is untouched (keeps its green contrast band). These rules are
   scoped to :root[data-theme="dark"] (specificity 0,2,1) so they outrank the
   plain :root green-band rules above (0,1,1), and they are era-independent so
   every era's dark mode gets the same navy band that matches the navy cards.

   Steel-blue ink/rule borrowed from the card family (rgba(141,167,209,...))
   plus cool near-white ink (#e6ebf4) keep AA-readable contrast on the navy. */
:root[data-theme="dark"] .site-header {
  background: #1d2c47;
  border-bottom-color: rgba(141, 167, 209, 0.42);
}
:root[data-theme="dark"] .site-header .region-select-prefix {
  color: #e6ebf4;
}
:root[data-theme="dark"] .toolbar {
  background: #1d2c47;
  border-bottom-color: rgba(141, 167, 209, 0.42);
}
:root[data-theme="dark"] .toolbar .toolbar-label {
  color: #e6ebf4;
}
/* Sort dropdown + search input: keep filled surface popping against the navy
   bar, with a steel-blue accent on hover/focus instead of the green one. */
:root[data-theme="dark"] .toolbar .filter-select:hover,
:root[data-theme="dark"] .toolbar .filter-select:focus {
  border-color: rgba(141, 167, 209, 0.85);
}
/* ===== BAND-NAVY-DARK-2026 — END ============================================ */

/* ===== REDESIGN-2026 SIDE-ORNAMENT — START ==================================
   Per-era decorative side rails living in the viewport gutters OUTSIDE the
   centered --max-w content column. The reading/card column stays solid for
   legibility; ornament only adds "expensive" texture along the margins.

   Strategy:
   - .era-ornament is a fixed, full-height, click-through overlay behind content.
   - Two rails are pinned to the far left/right viewport edges and sized to the
     available gutter so they NEVER overlap the content column.
   - Hidden by default; only shown >=1400px, where real gutters exist.
   - Each era reskins the rails with a RENDERED, vertically-seamless art strip
     (art/ornaments/sideornament_<era>_<theme>.png) that tiles down the gutter
     like an expensive printed veneer. Strips are mirror-reflected tiles so the
     repeat join is invisible.
   - Antique-gold only (champagne-bronze) — never bright canary.
   ========================================================================== */
.era-ornament {
  position: fixed;
  inset: 0;
  z-index: 0;              /* behind header (z:50) + all content */
  pointer-events: none;
  display: none;           /* revealed on wide viewports only (see @media) */
  overflow: hidden;
}
.era-ornament-rail {
  position: absolute;
  top: 0;
  bottom: 0;
  /* Gutter width = half of (viewport - content column). Cap rail width so it
     stays a slim decorative margin, and leave a small breathing gap before the
     content column edge (16px — was 28px; FILIGREE-INSET-2026). */
  width: clamp(24px, calc((100vw - var(--max-w)) / 2 - 16px), 72px);
  opacity: 0.5;
  /* Fade the rail in from the very edge so it reads as a soft margin treatment
     rather than a hard block. */
  -webkit-mask-image: linear-gradient(to var(--rail-fade, right), rgba(0,0,0,1) 0%, rgba(0,0,0,0.94) 68%, rgba(0,0,0,0.15) 100%);
          mask-image: linear-gradient(to var(--rail-fade, right), rgba(0,0,0,1) 0%, rgba(0,0,0,0.94) 68%, rgba(0,0,0,0.15) 100%);
  transition: opacity var(--dur-med) var(--ease);
}
.era-ornament-rail--left  { left: 0;  --rail-fade: left; }
.era-ornament-rail--right { right: 0; --rail-fade: left;  transform: scaleX(-1); }

/* Only show the rails where there is genuine gutter room. Below this the
   content column eats the full width and ornament would crowd the cards.
   1300px lets iPad Pro landscape (1366px CSS) pick up the ornament — verified
   the slim rail still clears the content column comfortably at that width. */
@media (min-width: 1300px) {
  .era-ornament { display: block; }
}
@media (min-width: 1700px) {
  .era-ornament-rail { opacity: 0.62; }
}

/* ---------------------------------------------------------------------------
   ERA MOTIFS — each rail uses a RENDERED, vertically-seamless art strip that
   tiles down the gutter. The strip is anchored to the content-facing edge of
   the rail (left rail: its motif hugs the right side; the --right rail's
   scaleX(-1) flips this so both motifs face inward toward the content). The
   strip width is fixed so it reads at a consistent scale; it repeats on Y.
   --------------------------------------------------------------------------- */
.era-ornament-rail {
  /* Common painting rules for the rendered strips. The actual image is set
     per era+theme below. Anchor to the inner (content-facing) edge and tile
     vertically; cap the drawn strip width so the motif stays slim + elegant. */
  background-repeat: repeat-y;
  background-position: right top;     /* hug the content-facing edge */
  background-size: clamp(42px, 100%, 64px) auto;
}

/* ---- BELLE ÉPOQUE — sinuous Art-Nouveau gilt vine ---- */
:root[data-era="belleepoque"][data-theme="light"] .era-ornament-rail {
  background-image: url("art/ornaments/sideornament_belleepoque_light.png");
}
:root[data-era="belleepoque"][data-theme="dark"] .era-ornament-rail {
  background-image: url("art/ornaments/sideornament_belleepoque_dark.png");
}

/* ---- ART DECO — fluted columns, sunburst fans, stepped brackets ---- */
:root[data-era="artdeco"][data-theme="light"] .era-ornament-rail {
  background-image: url("art/ornaments/sideornament_artdeco_light.png");
}
:root[data-era="artdeco"][data-theme="dark"] .era-ornament-rail {
  background-image: url("art/ornaments/sideornament_artdeco_dark.png");
}

/* ---- MID-CENTURY — atomic starbursts, orbits, boomerangs ---- */
:root[data-era="midcentury"][data-theme="light"] .era-ornament-rail {
  background-image: url("art/ornaments/sideornament_midcentury_light.png");
}
:root[data-era="midcentury"][data-theme="dark"] .era-ornament-rail {
  background-image: url("art/ornaments/sideornament_midcentury_dark.png");
}

/* ---- EDITORIAL — restrained Swiss hairline + ticks ---- */
:root[data-era="editorial"][data-theme="light"] .era-ornament-rail {
  background-image: url("art/ornaments/sideornament_editorial_light.png");
}
:root[data-era="editorial"][data-theme="dark"] .era-ornament-rail {
  background-image: url("art/ornaments/sideornament_editorial_dark.png");
}
/* Editorial is intentionally faintest — keep it whisper-quiet.
   EDITORIAL-ELEVATE-2026: dialed further down (0.4 -> 0.16) as part of
   reducing Editorial's ornamental chrome overall — see that block below
   (search marker) for the rest of the Editorial-only overrides. */
:root[data-era="editorial"] .era-ornament-rail { opacity: 0.16; }
/* The --right rail is mirrored via scaleX(-1), so every strip's motif faces
   inward toward the content on both sides — no per-side override needed. */

/* Respect reduced-motion users by dropping the rail fade transition; the
   ornament itself is static so nothing else to disable. */
@media (prefers-reduced-motion: reduce) {
  .era-ornament-rail { transition: none; }
}
/* ===== REDESIGN-2026 SIDE-ORNAMENT — END ==================================== */

/* ===== TOOLBAR-FILIGREE-2026 (2026-06-07, eve) — CENTERED SORT/SEARCH FILIGREE
   ============================================================================
   Owner abandoned the "kissing" header+sortbar ornament columns (the entire
   HEADER-FLOURISH-2026 block that used to live here was removed). Replacement:
   ONE gorgeous, showy horizontal filigree, centred PERFECTLY in the gap between
   the Sort box (left, ends ~x=468 at 1440w) and the Search box (right, starts
   ~x=986). That gap's centre (~727px) coincides with the viewport centre and
   therefore with the central column of the 3-up hotel-card grid, so a single
   element pinned to the toolbar's horizontal centre lands exactly where asked.

   It is styled like the per-era HERO card filigrees (.hero-filigree) but flatter
   / more stretched (~7.5:1 source art, shown ~360px wide). Each era has a BRAND
   NEW motif (no vocabulary reused from the hero filigrees) and is bound per
   theme so the colourful, champagne-gold (never canary-yellow) art sings against
   that era/theme's background. Decorative only (aria-hidden, pointer-events:none)
   so it never blocks the controls flanking it.
   --------------------------------------------------------------------------- */
.toolbar-filigree {
  position: absolute;
  top: 50%;
  left: 50%;
  /* translate3d avoids Safari subpixel smear when centering; never pair with
     filter:blur — even 0.35px reads as heavy blur on iPad Pro retina. */
  transform: translate3d(-50%, -50%, 0);
  -webkit-transform: translate3d(-50%, -50%, 0);
  width: clamp(220px, 26vw, 380px);    /* fits inside the ~518px gap with margins; scales down on narrower widths */
  height: 52px;                        /* ~7:1..7.5:1 against the width range; vertically centred in the 65px bar */
  background-color: transparent;       /* PNG margins are alpha — toolbar band shows through (was --bg-sunken; clashed after GREEN-CONTRAST-2026) */
  pointer-events: none;
  z-index: 1;                          /* behind the sort/search controls, which sit in .toolbar-inner above */
  background-repeat: no-repeat;
  background-position: center center;
  background-size: contain;            /* show the WHOLE flat filigree; never crop the motif */
  /* Antique mute without blur — hero filigrees stay sharp; match that clarity. */
  opacity: 0.94;
  filter: saturate(0.92) contrast(0.97) sepia(0.04);
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
}

/* Hide where the toolbar gets tight (controls would crowd / overlap the art).
   IPAD-PRO-12-FILIGREE-2026: lowered the cutoff from 1080px → 960px so the
   ornament reappears on the 12.9" iPad Pro in PORTRAIT (~1024px CSS width),
   where the sort/search gap is still ~354px wide — ample room for the
   clamp(220px,26vw,380px) motif to sit centred without crowding either
   control. Smaller tablets (iPad Air 11" ~820px, mini ~744px) stay hidden
   since their gap collapses below the motif's 220px min. */
@media (max-width: 960px) {
  .toolbar-filigree { display: none; }
}

/* ---- Per-era / per-theme artwork bindings (image-set: avif then png) ------- */

/* BELLE ÉPOQUE — Art-Nouveau peacock plumes + dragonfly (NEW; hero used roses) */
:root[data-era="belleepoque"][data-theme="light"] .toolbar-filigree {
  /* No 1x density pin — retina Safari was forced to upscale a “1x” layer. */
  background-image: -webkit-image-set(url("art/filigree/toolbar_belleepoque_light.avif") type("image/avif"), url("art/filigree/toolbar_belleepoque_light.png") type("image/png"));
  background-image: image-set(url("art/filigree/toolbar_belleepoque_light.avif") type("image/avif"), url("art/filigree/toolbar_belleepoque_light.png") type("image/png")); }
:root[data-era="belleepoque"][data-theme="dark"] .toolbar-filigree {
  background-image: -webkit-image-set(url("art/filigree/toolbar_belleepoque_dark.avif") type("image/avif"), url("art/filigree/toolbar_belleepoque_dark.png") type("image/png"));
  background-image: image-set(url("art/filigree/toolbar_belleepoque_dark.avif") type("image/avif"), url("art/filigree/toolbar_belleepoque_dark.png") type("image/png")); }

/* ART DECO — Deco "frozen-fountain" cascade of arcs (NEW; hero used sunburst fan) */
:root[data-era="artdeco"][data-theme="light"] .toolbar-filigree {
  background-image: -webkit-image-set(url("art/filigree/toolbar_artdeco_light.avif") type("image/avif"), url("art/filigree/toolbar_artdeco_light.png") type("image/png"));
  background-image: image-set(url("art/filigree/toolbar_artdeco_light.avif") type("image/avif"), url("art/filigree/toolbar_artdeco_light.png") type("image/png")); }
:root[data-era="artdeco"][data-theme="dark"] .toolbar-filigree {
  background-image: -webkit-image-set(url("art/filigree/toolbar_artdeco_dark.avif") type("image/avif"), url("art/filigree/toolbar_artdeco_dark.png") type("image/png"));
  background-image: image-set(url("art/filigree/toolbar_artdeco_dark.avif") type("image/avif"), url("art/filigree/toolbar_artdeco_dark.png") type("image/png")); }

/* MID-CENTURY — organic botanical: monstera leaves + seed pods (NEW; NOT atomic/space) */
:root[data-era="midcentury"][data-theme="light"] .toolbar-filigree {
  background-image: -webkit-image-set(url("art/filigree/toolbar_midcentury_light.avif") type("image/avif"), url("art/filigree/toolbar_midcentury_light.png") type("image/png"));
  background-image: image-set(url("art/filigree/toolbar_midcentury_light.avif") type("image/avif"), url("art/filigree/toolbar_midcentury_light.png") type("image/png")); }
:root[data-era="midcentury"][data-theme="dark"] .toolbar-filigree {
  background-image: -webkit-image-set(url("art/filigree/toolbar_midcentury_dark.avif") type("image/avif"), url("art/filigree/toolbar_midcentury_dark.png") type("image/png"));
  background-image: image-set(url("art/filigree/toolbar_midcentury_dark.avif") type("image/avif"), url("art/filigree/toolbar_midcentury_dark.png") type("image/png")); }

/* EDITORIAL — ornate engraved crest cartouche + scroll flourishes (NEW; EXTRA showy,
   since editorial is otherwise the plainest era). Hero used sparse laurel sprigs. */
:root[data-era="editorial"][data-theme="light"] .toolbar-filigree {
  background-image: -webkit-image-set(url("art/filigree/toolbar_editorial_light.avif") type("image/avif"), url("art/filigree/toolbar_editorial_light.png") type("image/png"));
  background-image: image-set(url("art/filigree/toolbar_editorial_light.avif") type("image/avif"), url("art/filigree/toolbar_editorial_light.png") type("image/png")); }
:root[data-era="editorial"][data-theme="dark"] .toolbar-filigree {
  background-image: -webkit-image-set(url("art/filigree/toolbar_editorial_dark.avif") type("image/avif"), url("art/filigree/toolbar_editorial_dark.png") type("image/png"));
  background-image: image-set(url("art/filigree/toolbar_editorial_dark.avif") type("image/avif"), url("art/filigree/toolbar_editorial_dark.png") type("image/png")); }

/* ===== TOOLBAR-FILIGREE-2026 — END ========================================= */

/* ===== EDITORIAL-ELEVATE-2026 — START =======================================
   Owner directive (2026-08-22): Editorial read as "Art Deco but boring" — a
   quieter palette swap on the same ornamental layout, not a real magazine
   aesthetic. This block gives Editorial its own visual language: stark
   whitespace, photography that dominates, a crisp Didone headline face, and
   true near-white / near-black grounds instead of the warm parchment/charcoal
   the other three eras share. Pure CSS/layout-rule work scoped entirely to
   [data-era="editorial"] — no markup changes, no era-based content/tier
   filtering (that suggestion was explicitly rejected by the owner). Rebuild
   note: does not change build-data.js / hotel data — styles.css only.

   Rename note: only the DISPLAY LABELS changed (Art Deco → "The Grand Dame",
   Mid-century → "The Modernist", Editorial → "The Curator" — see
   index.html .mobile-look-era-name). The underlying data-era id stays
   "editorial" everywhere in this file so localStorage (`lha.era`) keeps
   working for existing visitors. */

/* ---- Typography: the --font-wordmark swap (Cabinet Grotesk sans → Bodoni
   Moda Didone) lives on the main :root[data-era="editorial"] token block
   above. Bodoni Moda is served from the existing Google Fonts pipeline
   (ensureEraFontsLoaded() in app.js loads it alongside Marcellus/Gilda/
   Cinzel/Poiret/Poppins, so no new asset pipeline or licensing question) and
   falls back to Didot, then Georgia, then serif if the webfont fails.
   `.card-name` intentionally keeps the unified Cormorant Garamond serif per
   CARD-NAME-SERIF-2026 — not touched here. */
:root[data-era="editorial"] .hero-wordmark {
  font-weight: 500;
  letter-spacing: 0.008em;
}
:root[data-era="editorial"] .results-heading,
:root[data-era="editorial"] .modal-title {
  font-family: 'Bodoni Moda', 'Didot', Georgia, serif;
  font-style: normal;
  letter-spacing: -0.006em;
}

/* ---- Background: stark white (light) / near-black (dark) rather than the
   warm ivory/charcoal every other era uses. The header + toolbar bands still
   read via their own --contrast-green token (unchanged), so navigation chrome
   stays visible against the flatter page ground. */
:root[data-era="editorial"][data-theme="light"] {
  --bg: #ffffff;
  --bg-elevated: #ffffff;
  --bg-sunken: #f4f4f4;
  --surface: #ffffff;
  --surface-hover: #f7f7f7;
  --border: rgba(20, 20, 20, 0.12);
  --border-strong: rgba(20, 20, 20, 0.24);
}
:root[data-era="editorial"][data-theme="dark"] {
  --bg: #0a0a0a;
  --bg-elevated: #131313;
  --bg-sunken: #050505;
  --surface: #121212;
  --surface-hover: #1c1c1c;
  --text: #f4f4f4;
  --text-muted: #b8b8b8;
  --border: rgba(255, 255, 255, 0.12);
  --border-strong: rgba(255, 255, 255, 0.22);
}

/* ---- Reduce ornamental chrome. Note the toolbar crest was previously tuned
   "EXTRA showy... since editorial is otherwise the plainest era" (see
   TOOLBAR-FILIGREE-2026 above) — compensating for a plain layout with MORE
   ornament, the opposite of a real editorial/magazine look. Dial it (and the
   hero filigree bands, side rail, gold rule/hover-border) down instead of up. */
:root[data-era="editorial"] .hero-filigree {
  opacity: 0.32;
}
:root[data-era="editorial"] .hero-rail .hero-filigree {
  height: clamp(24px, 2.6vw, 34px);
}
:root[data-era="editorial"] .toolbar-filigree {
  opacity: 0.2;
  width: clamp(150px, 16vw, 240px);
  filter: saturate(0.35) contrast(1) grayscale(0.4);
}
/* .era-ornament-rail opacity is tuned directly on its own SIDE-ORNAMENT rule
   above (search "EDITORIAL-ELEVATE-2026" near that block) rather than here. */
:root[data-era="editorial"] .hero-rail {
  border-left: 1px solid var(--border-strong);
}
:root[data-era="editorial"] .hero-wordmark-rule {
  background: var(--border-strong);
  width: 64px;
  height: 1px;
}
:root[data-era="editorial"] .hero-wordmark-rule::after {
  display: none;
}
:root[data-era="editorial"] .card:hover {
  border-color: var(--border-strong);
  box-shadow: 0 20px 44px rgba(0, 0, 0, 0.12);
}
:root[data-era="editorial"] .card-brand::before {
  color: var(--text-muted);
}
:root[data-era="editorial"] .hero-lead .hero-stats--masthead {
  border-color: var(--border);
  box-shadow: none;
  background: var(--surface);
}

/* ---- Let photography dominate. Hotel card art goes ~20% taller for the
   same width (16:10 → 4:3 is exactly a 1.20x height/area increase), and the
   hotel-modal photo gallery moves from 16:9 to a magazine-style 3:2 frame
   (~+20% taller). Grid column math (the auto-fill/minmax base rule and every
   fixed-column breakpoint) is untouched — only the photo frame's own aspect
   ratio changes, so responsive behavior is unaffected in every era. */
:root[data-era="editorial"] .card-art {
  aspect-ratio: 4 / 3;
}
:root[data-era="editorial"] .modal-gallery {
  aspect-ratio: 3 / 2;
}

/* ---- Whitespace: more breathing room between cards and inside the card
   body, leaning into stark whitespace instead of the tighter, ornament-era
   spacing the other three looks use. */
:root[data-era="editorial"] .card-grid {
  gap: clamp(1.5rem, 2.4vw, 2.75rem);
}
:root[data-era="editorial"] .card-body {
  padding: var(--space-6);
  gap: var(--space-4);
}
/* ===== EDITORIAL-ELEVATE-2026 — END ========================================= */

.hero-wordmark-rule {
  display: block;
  width: 96px;
  height: 2px;
  margin: 0.45rem auto 0;
  background: var(--rule-gold);
  position: relative;
  flex-shrink: 0;
}
.hero-lead .hero-wordmark-rule {
  margin-top: clamp(0.35rem, 1vh, 0.65rem);
}
/* Small diamond ornament centered on the rule — era-flavored accent. */
.hero-wordmark-rule::after {
  content: "";
  position: absolute;
  left: 32px; top: 50%;
  width: 5px; height: 5px;
  background: var(--rule-gold);
  transform: translateY(-50%) rotate(45deg);
}

/* ===== HERO-GAZETTE-2026 — few choice headlines in the retired-wordmark gap */
.hero-gazette {
  width: min(100%, 34rem);
  margin: 0.55rem auto 0;
  text-align: left;
  flex: 0 1 auto;
  min-height: 0;
}
.hero-gazette-head {
  display: flex;
  align-items: baseline;
  justify-content: center;
  margin-bottom: 0.35rem;
}
.hero-gazette-kicker {
  appearance: none;
  background: none;
  border: 0;
  padding: 0;
  cursor: pointer;
  font-family: var(--font-display);
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--gold);
}
.hero-gazette-kicker:hover,
.hero-gazette-kicker:focus-visible {
  color: var(--text);
  outline: none;
}
.hero-gazette-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.28rem;
}
.hero-gazette-item {
  margin: 0;
  border-top: 1px solid color-mix(in srgb, var(--rule-gold) 45%, transparent);
}
.hero-gazette-item:last-child {
  border-bottom: 1px solid color-mix(in srgb, var(--rule-gold) 45%, transparent);
}
.hero-gazette-link {
  appearance: none;
  background: none;
  border: 0;
  width: 100%;
  padding: 0.38rem 0.15rem;
  cursor: pointer;
  text-align: left;
  display: grid;
  grid-template-columns: 3.4rem 1fr;
  column-gap: 0.65rem;
  row-gap: 0.05rem;
  color: inherit;
  font: inherit;
}
.hero-gazette-link:hover .hero-gazette-hl,
.hero-gazette-link:focus-visible .hero-gazette-hl {
  color: var(--gold);
}
.hero-gazette-link:focus-visible {
  outline: 1px solid var(--gold);
  outline-offset: 2px;
}
.hero-gazette-date {
  grid-row: 1 / -1;
  font-family: var(--font-display);
  font-size: 0.68rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--muted, var(--gold));
  padding-top: 0.12rem;
}
.hero-gazette-hl {
  grid-column: 2;
  font-family: var(--font-display);
  font-size: clamp(0.82rem, 1.15vw, 0.98rem);
  font-weight: 500;
  line-height: 1.28;
  color: var(--text);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.hero-gazette-dek {
  grid-column: 2;
  font-size: 0.72rem;
  line-height: 1.38;
  color: var(--muted, var(--gold));
  opacity: 0.92;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
  margin: 0.12rem 0 0.04rem;
  font-weight: 400;
  letter-spacing: 0.01em;
}
.hero-gazette-place {
  grid-column: 2;
  font-size: 0.68rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--muted, var(--gold));
  opacity: 0.85;
}

/* ---- Stat row inside the editorial hero (override the old centered one) ---- */
/* ===== HERO-STATS-ENLARGE-2026 ============================================
   The whole HOTELS | BRANDS | FROM row is enlarged per the owner's request,
   and the FROM block is re-aligned so it sits on the SAME baseline as the
   other two stats instead of stacking lower (the old column layout made the
   $price look "out of whack" relative to the inline Hotels/Brands counts).
   Now all three stats share one row: a big serif numeral + uppercase label,
   with the FROM block's tiny date sub-line tucked beneath only its own label
   so the three numerals still align across the top. ====================== */
.hero--editorial .hero-stats {
  justify-content: flex-start;
  align-items: baseline;        /* numerals share one baseline */
  gap: clamp(1.1rem, 2.4vw, 2rem);
  margin: 0;
  flex-wrap: wrap;
}
.hero--editorial .hero-stat {
  flex-direction: row;
  align-items: baseline;
  gap: 0.55rem;
}
.hero--editorial .hero-stat-num {
  /* STAT-FONT-BUMP-2026: was clamp(2rem,3.4vw,2.75rem). */
  font-size: clamp(2.2rem, 3.7vw, 3.05rem);
}
.hero--editorial .hero-stat-label {
  font-size: 0.8rem;
  letter-spacing: 0.2em;
}
.hero--editorial .hero-stat-divider {
  width: 1px;
  height: 1.5em;
  align-self: center;
  margin: 0;
}

/* HERO-STATS-MASTHEAD-2026: compressed HOTELS | BRANDS | FROM row tucked
   directly under the wordmark rule — frees the results header band so cards
   start much higher on the page. */
.hero--editorial .hero-lead .hero-stats--masthead {
  display: grid;
  grid-template-columns: 1fr auto 1fr auto 1fr;
  align-items: center;
  justify-content: center;
  flex-wrap: nowrap;
  gap: 0;
}
.hero-lead .hero-stats--masthead {
  width: 100%;
  max-width: min(100%, 560px);
  margin: auto 0 0;
  /* HERO-PANEL-SOFT-2026: rounded panel (replaces top hairline). */
  padding: clamp(0.55rem, 1vh, 0.75rem) clamp(0.7rem, 1.5vw, 1.1rem);
  border: 1px solid var(--panel-soft-edge);
  border-radius: var(--radius-lg);
  background: var(--panel-soft-bg);
  box-shadow:
    inset 0 0 0 1px var(--panel-soft-inset),
    0 0 0 1px var(--panel-soft-edge-outer),
    0 1px 2px color-mix(in srgb, var(--gold) 10%, transparent);
  column-gap: clamp(0.45rem, 1.2vw, 1rem);
  flex-shrink: 0;
  box-sizing: border-box;
}
.hero--editorial .hero-lead .hero-stats--masthead .hero-stat-num {
  font-size: clamp(1.65rem, 2.55vw, 2.35rem);
}
.hero--editorial .hero-lead .hero-stats--masthead .hero-stat-label {
  font-size: clamp(0.66rem, 0.82vw, 0.74rem);
  letter-spacing: 0.12em;
}
.hero-lead .hero-stats--masthead .hero-stat-num {
  font-size: clamp(1.65rem, 2.55vw, 2.35rem);
}
.hero-lead .hero-stats--masthead .hero-stat-label {
  font-size: clamp(0.66rem, 0.82vw, 0.74rem);
  letter-spacing: 0.12em;
}
.hero-lead .hero-stats--masthead .hero-stat-divider {
  height: 1.25em;
  margin-top: 0;
  margin-bottom: 0;
}

/* ---- RIGHT column: slim sidebar rail with the two numbered lists ---- */
.hero-rail {
  border-left: 2px solid var(--rule-gold);
  padding-left: clamp(1rem, 2vw, 1.75rem);
  min-width: 0;
}
/* Re-home the cheapest teaser into the rail: force a single stacked column,
   undoing the old 880px side-by-side grid (which was for the centered hero). */
.hero-rail .cheapest-teaser {
  margin: 0;
  max-width: none;
  width: 100%;
  padding: 0;
  border-top: none;
  border-bottom: none;
  display: block;          /* override the @media(min-width:880px) grid */
  text-align: left;
}
/* FILIGREE-MOVE-2026: the owner asked to ENLARGE every piece of lettering in
   the two cheapest-stays lists — labels, index numbers, dates, the "from"
   eyebrow, hotel names, ranks AND prices. These rail-scoped sizes override the
   old slim-rail typography with a uniformly larger, more readable scale. */
.hero-rail .cheapest-teaser-title {
  font-size: clamp(0.98rem, 1.15vw, 1.18rem);
  letter-spacing: 0.035em;
  font-weight: 800;
  text-transform: none;
}
.hero-rail .cheapest-teaser-dates {
  font-size: clamp(0.86rem, 0.95vw, 0.96rem);
  margin-top: 0.32rem;
  color: color-mix(in srgb, var(--gold) 82%, var(--text));
}
.hero-rail .rail-index {
  display: none;
}
.hero-rail .cheapest-teaser-from {
  font-size: 0.72rem;
  letter-spacing: 0.12em;
  align-self: flex-end;
}
/* HERO-PANEL-SOFT-2026: each cheapest-stays list in its own rounded panel. */
.hero-rail .cheapest-teaser-section {
  padding: clamp(0.65rem, 1.1vh, 0.85rem) clamp(0.7rem, 1.3vw, 0.95rem)
    clamp(0.55rem, 1vh, 0.75rem);
  border: 1px solid var(--panel-soft-edge);
  border-radius: var(--radius-lg);
  background: var(--panel-soft-bg);
  box-shadow:
    inset 0 0 0 1px var(--panel-soft-inset),
    0 0 0 1px var(--panel-soft-edge-outer),
    0 1px 2px color-mix(in srgb, var(--gold) 10%, transparent);
  box-sizing: border-box;
}
.hero-rail .cheapest-teaser-head {
  margin-bottom: 0.45rem;
  padding: 0.2rem 0 0.5rem;
}
.hero-rail .cheapest-teaser-divider {
  height: 0;
  background: none;
  margin: clamp(0.55rem, 1vh, 0.85rem) 0;
  opacity: 1;
  border: 0;
}
.hero-rail .cheapest-teaser-list { gap: 0; }
.hero-rail .cheapest-teaser-item,
.hero-rail .cheapest-teaser-row {
  padding: clamp(4px, 0.65vh, 7px) 0;
  font-size: 0.94rem;
  column-gap: clamp(0.55rem, 1.2vw, 0.85rem);
  align-items: start;
}
.hero-rail .cheapest-teaser-namecell {
  min-width: 0;
  max-width: 100%;
}
.hero-rail .cheapest-teaser-name,
.hero-rail .cheapest-teaser-name--link {
  font-size: clamp(1.04rem, 1.14vw, 1.12rem);
  font-weight: 600;
  color: var(--text);
  line-height: 1.26;
  /* CHEAPEST-MIDWIDTH-2026: keep long titles out of the price column. */
  max-width: 100%;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
}
.hero-rail .cheapest-teaser-loc {
  font-size: clamp(0.86rem, 0.95vw, 0.92rem);
  letter-spacing: 0.012em;
  color: var(--text-muted);
  /* CHEAPEST-MIDWIDTH-2026: never spill into the neighboring column. */
  white-space: normal;
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  max-width: 100%;
}
.hero-rail .cheapest-teaser-price {
  font-size: 0.92rem;
  font-weight: 600;
  color: var(--text);
  flex-shrink: 0;
  padding-left: 0.15rem;
}

/* ============================================================ */
/* 5. COUNTRY-MODE "coming soon" TOAST                          */
/* ============================================================ */
.redesign-toast {
  position: fixed;
  left: 50%;
  bottom: 28px;
  transform: translateX(-50%) translateY(12px);
  z-index: 1000;
  max-width: min(90vw, 380px);
  padding: 12px 20px;
  background: var(--bg-elevated);
  color: var(--text);
  border: 1px solid var(--gold);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-lg);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 0.92rem;
  letter-spacing: 0.02em;
  text-align: center;
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--dur-med) var(--ease), transform var(--dur-med) var(--ease);
}
.redesign-toast.is-visible {
  opacity: 1;
  transform: translateX(-50%) translateY(0);
}
@media (prefers-reduced-motion: reduce) {
  .redesign-toast { transition: opacity var(--dur-fast) linear; }
}

/* ============================================================ */
/* 5b. RESULTS CONTEXT BAR — "now showing" active-filter dateline */
/*    Folds the old centered serif .results-header into the       */
/*    editorial system. KEEPS its live function (a multi-signal    */
/*    reminder of the active region/city + brand filters, plus a   */
/*    Clear All affordance) but restyles it as a refined left-     */
/*    aligned context line bracketed by thin gold rules. Themed    */
/*    across all 8 era×theme looks via the era tokens + fonts.     */
/*    JS (#resultsEyebrow / #resultsRegion / #resultsBrand /       */
/*    #resultsClearBtn) is untouched.                              */
/* ============================================================ */
.results-header {
  /* override old: text-align:center; margin-bottom: space-8 */
  max-width: var(--max-w);
  margin: 0 auto var(--space-4);
  padding: clamp(0.85rem, 2vh, 1.25rem) var(--space-6) 0;
  text-align: left;
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: center;
  column-gap: var(--space-5);
  row-gap: 6px;
}
/* A hairline gold rule runs across the top of the context bar so it
   reads as a deliberate editorial band separating hero from results. */
.results-header::before {
  content: "";
  grid-column: 1 / -1;
  grid-row: 1;
  height: 1px;
  background: linear-gradient(90deg,
              var(--rule-gold) 0%,
              color-mix(in srgb, var(--rule-gold) 35%, transparent) 60%,
              transparent 100%);
  margin-bottom: clamp(0.6rem, 1.5vh, 1rem);
  opacity: 0.85;
}

/* Eyebrow: small gold kicker — "THE FULL ATLAS" / "NOW SHOWING HOTELS IN". */
.results-header .results-eyebrow {
  grid-column: 1;
  grid-row: 2;
  display: inline-flex;
  align-items: center;
  gap: 0.55rem;
  margin: 0 0 2px;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.66rem;
  letter-spacing: 0.3em;
  text-transform: uppercase;
  color: var(--gold);
}
/* The old em-dashes flanking the eyebrow are noise in the new layout;
   replace them with a single small leading diamond tick instead. */
.results-header .results-eyebrow .em-dash { display: none; }
.results-header .results-eyebrow::before {
  content: "";
  width: 5px; height: 5px;
  background: var(--rule-gold);
  transform: rotate(45deg);
  flex-shrink: 0;
}

/* The heading itself: region/city · brand, now an editorial context line.
   Era card-name display (700) so weight matches eyebrow + SORT labels; wordmark
   faces like Marcellus/Poiret One are single-weight and read hairline at 500. */
.results-header .results-heading {
  grid-column: 1;
  grid-row: 3;
  font-family: var(--font-card-name, var(--font-display));
  font-style: normal;
  font-weight: var(--card-name-weight, 700);
  font-size: clamp(1.35rem, 2.8vw, 1.9rem);
  line-height: 1.15;
  letter-spacing: var(--card-name-tracking, -0.005em);
  color: var(--text);
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0 0.55rem;
}
.results-header .results-heading #resultsRegion { color: var(--text); font-weight: inherit; }
.results-header .results-heading #resultsBrand {
  color: color-mix(in srgb, var(--text) 90%, var(--text-muted));
  font-weight: inherit;
}
.results-header .results-sep {
  color: var(--gold);
  margin: 0;
  font-style: normal;
  font-weight: inherit;
}

/* Clear-All sits at the right of the band as a quiet ghost pill that only
   appears when filters are active (JS toggles [hidden]); it reinforces the
   "you have filters on" reminder without shouting. */
.results-header .results-clear-wrap {
  /* CLEAR-BTN-FIX-2026: cancel the leftover Phase-35 absolute positioning
     (@media min-width:768px) so the button rejoins the grid flow. In-flow it
     occupies the `auto` column, which constrains the heading's `1fr` column so
     the region/brand line wraps to a second row BEFORE it can ever run under
     the button. */
  position: static;
  transform: none;
  grid-column: 2;
  grid-row: 2 / span 2;
  justify-self: end;
  align-self: center;
}
.results-header .results-clear-wrap .clear-all-btn {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  padding: 10px 22px;
  white-space: nowrap;
  border: 1px solid var(--gold);
  border-radius: 999px;
  background: transparent;
  color: var(--gold);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 0.82rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  transition: background var(--dur-fast) var(--ease),
              color var(--dur-fast) var(--ease),
              border-color var(--dur-fast) var(--ease),
              transform var(--dur-fast) var(--ease);
}
.results-header .results-clear-wrap .clear-all-btn:hover {
  background: var(--gold);
  color: var(--bg-sunken);
  border-color: var(--gold);
  transform: translateY(-1px);
}
.results-header .results-clear-wrap .clear-all-btn[hidden] { display: none; }

/* In Map Mode the existing base rule centers/hides parts of the header;
   keep our editorial band coherent there too (it still shows region/brand). */
body.is-map-mode .results-header { text-align: left; }

/* Per-era flourishes for the context bar so the reminder "flows" with each
   art era rather than looking bolted on. Layout is identical; only the
   accent rule + eyebrow rhythm shift. */
:root[data-era="belleepoque"] .results-header .results-eyebrow { letter-spacing: 0.26em; }
:root[data-era="artdeco"] .results-header::before {
  /* deco: a crisper, fuller-width rule */
  background: linear-gradient(90deg, var(--rule-gold), var(--rule-gold) 78%, transparent);
  opacity: 0.7;
}
:root[data-era="artdeco"] .results-header .results-eyebrow { letter-spacing: 0.38em; }
:root[data-era="artdeco"] .results-header .results-eyebrow::before { transform: none; width: 14px; height: 2px; }
:root[data-era="midcentury"] .results-header .results-eyebrow::before { border-radius: 50%; transform: none; }

/* ============================================================ */
/* 6. RESPONSIVE — collapse hero to one column on phones        */
/* ============================================================ */
@media (max-width: 860px) {
  .hero--editorial .hero-inner.hero-grid {
    grid-template-columns: 1fr;
    gap: 1.5rem;
  }
  .hero-rail {
    border-left: none;
    border-top: 2px solid var(--rule-gold);
    padding-left: 0;
    padding-top: 1.25rem;
  }
  /* On phones the two cheapest lists may sit side-by-side again if room. */
}
@media (max-width: 640px) {
  .hero.hero--editorial {
    padding: 1.1rem var(--space-4) 1rem;
  }
  .hero-wordmark { font-size: clamp(2rem, 9vw, 2.8rem); }
  /* Keep header chrome on the shared control height (HEADER-ALIGN-2026). */
  #modeButton.mode-select {
    padding: 0 var(--header-control-pad-x);
    font-size: var(--header-control-fs);
    min-height: var(--header-control-h);
    height: var(--header-control-h);
  }
  .jewel-toggle {
    width: var(--header-control-h);
    height: var(--header-control-h);
  }
  .jewel-stage { width: 30px; height: 30px; }
  /* Context bar: pad with the page edge + drop the Clear pill below the line. */
  .results-header { padding-left: var(--space-4); padding-right: var(--space-4); }
  .results-header .results-heading { font-size: clamp(1.2rem, 5.2vw, 1.55rem); }
}
@media (max-width: 520px) {
  /* On very narrow screens let the Clear pill wrap under the heading so the
     region/brand reminder never gets squeezed. */
  .results-header { grid-template-columns: 1fr; }
  .results-header .results-clear-wrap {
    grid-column: 1;
    grid-row: auto;
    justify-self: start;
    margin-top: 0.5rem;
  }
}
@media (max-width: 420px) {
  /* Hide the mode button's text label on very narrow screens — icon+chevron
     remain so the control stays reachable (it's core navigation). */
  #modeButton.mode-select #modeButtonLabel { display: none; }
  #modeButton.mode-select {
    padding: 0 10px;
    gap: 6px;
    min-height: var(--header-control-h);
    height: var(--header-control-h);
  }
}

/* ===================================================================== */
/* ===== REDESIGN-2026 — END ===== */
/* ===================================================================== */

/* ============================================================================ */
/* ===== MAP-V2-2026: High-Design Map Mode — era-themed canvas, pins,    ===== */
/* =====              clusters, POI gems, legend & popups. START.        ===== */
/* =====  Fully reversible: delete this whole block to restore Map v1.   ===== */
/* =====  All colors read the active era×theme CSS vars (--gold, --bg,   ===== */
/* =====  --surface, --text, --font-wordmark...) so the map matches the  ===== */
/* =====  home page in every one of the 8 looks.                         ===== */
/* ============================================================================ */

/* MAP-TILE-THEMES-2026: Voyager (light UI) / Positron (dark UI) basemaps. */
/* MAPLIBRE-PILOT-2026: MapLibre GL vector basemap (opt-in ?maplibre=1). */
.map-container--maplibre .maplibregl-map,
.map-container--maplibre .maplibregl-canvas {
  width: 100%;
  height: 100%;
  position: absolute;
  inset: 0;
}
.map-container--maplibre { position: relative; min-height: 280px; }
.map-engine-pilot-notice {
  margin: 0.5rem 0.75rem 0;
  padding: 0.5rem 0.75rem;
  font-size: 0.75rem;
  line-height: 1.45;
  border-radius: 6px;
  background: rgba(180, 140, 60, 0.12);
  border: 1px solid rgba(180, 140, 60, 0.35);
  color: var(--text, #2a2520);
}
.map-engine-pilot-notice strong { display: block; margin-bottom: 0.15rem; font-size: 0.7rem; letter-spacing: 0.06em; text-transform: uppercase; }
.map-engine-pilot-notice--error { background: rgba(160, 40, 40, 0.08); border-color: rgba(160, 40, 40, 0.35); }
.map-container { background: #e8e0d4; }
.map-container .leaflet-container { background: #e8e0d4; }
/* Dark theme UI keeps a Positron (light) geo canvas — match tile gutter color. */
:root[data-theme="dark"] .map-container,
:root[data-theme="dark"] .map-container .leaflet-container {
  background: #e8e0d4;
}
/* Label overlay sits on shadowPane via JS — keep place names legible. */
.map-container .leaflet-shadow-pane { opacity: 1; }

/* ---- Hotel pin: slim antique-gold teardrop with a set gem ------------------ */
/* Beat vendor/leaflet/leaflet.css .leaflet-div-icon (white box + border) when
   Leaflet CSS lazy-loads after styles.css — PERF-2026 load-order regression. */
.map-container .leaflet-marker-icon.atlas-pin { background: none !important; border: none !important; }
.atlas-pin .atlas-pin-inner {
  display: block;
  filter: drop-shadow(0 3px 4px rgba(0,0,0,0.30));
  transform-origin: 50% 100%;
  transition: transform 0.16s cubic-bezier(0.2,0.8,0.2,1);
}
.atlas-pin:hover .atlas-pin-inner { transform: translateY(-2px) scale(1.08); }
.atlas-pin .atlas-pin-body {
  fill: var(--gold);
  stroke: var(--gold-deep, var(--gold));
  stroke-width: 1;
}
.atlas-pin .atlas-pin-gem {
  fill: var(--surface);
  stroke: var(--gold-deep, var(--gold));
  stroke-width: 0.8;
}
/* Belle Époque & Mid-century lean warm/round; Art Deco & Editorial crisper. */
:root[data-era="artdeco"] .atlas-pin .atlas-pin-gem,
:root[data-era="editorial"] .atlas-pin .atlas-pin-gem { stroke-width: 1; }

/* Film/TV locations (Movie Mode) — warm clapperboard tint on the map pin gem. */
.atlas-pin.atlas-pin--onscreen .atlas-pin-gem {
  fill: #1a130d;
  stroke: #e6c489;
  stroke-width: 1.1;
}
.atlas-pin.atlas-pin--onscreen .atlas-pin-body {
  fill: color-mix(in srgb, var(--gold) 88%, #1a130d);
}
/* PEG-TOGGLE-2026-07: a teardrop pin whose hotel box is currently open (Size
   3/4/5) gets a bright highlight + gentle lift, mirroring the selected price
   peg. Makes it obvious which pin the docked box belongs to. */
.atlas-pin.is-selected .atlas-pin-body {
  fill: var(--gold-bright, #d9bf82);
  stroke: var(--gold-deep, #6a4f17);
  stroke-width: 1.4;
}
.atlas-pin.is-selected .atlas-pin-gem {
  fill: #fff;
  stroke: var(--gold-deep, #6a4f17);
}
.atlas-pin.is-selected .atlas-pin-inner {
  filter: drop-shadow(0 3px 7px rgba(0, 0, 0, 0.4));
  transform: translateY(-2px) scale(1.12);
  transform-origin: center bottom;
}
.atlas-pin .atlas-pin-inner {
  transition: transform 0.16s cubic-bezier(0.2, 0.8, 0.2, 1);
}

/* ---- MAP-PLAQUE-SIZE-2026: Size 1 price pegs (Hotels.com-inspired) -------- */
.map-container .leaflet-marker-icon.atlas-price-peg {
  background: none !important;
  border: none !important;
}
/* NODATA-PEG-COLOR-2026-07: hotels with no future weekend price render a plain
   teardrop instead of a pill. It previously had NO fill rule (the gold
   .atlas-pin .atlas-pin-body selector requires the .atlas-pin class, which this
   marker lacks), so the SVG defaulted to jet black — a harsh, out-of-place blob
   on the warm Voyager basemap (owner feedback). Give it a soft muted-bronze
   fill with a slightly deeper outline: it sits calmly in the map's palette yet
   still reads clearly as a marker. Distinct from priced pegs (bright pills) and
   from the gold on-map hotel pins, so "no price yet" is legible at a glance. */
.atlas-price-peg--nodata .atlas-pin-body {
  fill: #9c8f79;
  stroke: #6f6250;
  stroke-width: 1;
}
.atlas-price-peg--nodata .atlas-pin-gem {
  fill: #f3efe6;
  stroke: #6f6250;
  stroke-width: 0.8;
}
.atlas-price-peg--nodata .atlas-pin-inner {
  filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.28));
}
.atlas-price-peg--nodata.is-selected .atlas-pin-body {
  fill: var(--gold-bright, #d9bf82);
  stroke: var(--gold-deep, #6a4f17);
}
/* Dark site theme: lift the muted bronze a touch so it stays visible on the
   filtered dark tiles without going back to a harsh pure black. */
:root[data-theme="dark"] .atlas-price-peg--nodata .atlas-pin-body {
  fill: #b3a488;
  stroke: #dccca8;
}
:root[data-theme="dark"] .atlas-price-peg--nodata .atlas-pin-gem {
  fill: #26211a;
  stroke: #dccca8;
}
.atlas-price-peg .atlas-price-peg-inner {
  display: flex;
  flex-direction: column;
  align-items: center;
  filter: drop-shadow(0 2px 5px rgba(0, 0, 0, 0.32));
  transition: transform 0.16s cubic-bezier(0.2, 0.8, 0.2, 1);
}
.atlas-price-peg:hover .atlas-price-peg-inner,
.atlas-price-peg.is-selected .atlas-price-peg-inner {
  transform: translateY(-2px) scale(1.06);
}
/* PRICE-PEG-READABLE-2026: the price pill formerly used a muted --gold fill
   with dark ink, which read "dark-on-dark" against the basemap and was hard to
   scan (owner feedback, Size 1 / Size 2). Reworked to a bright warm-white pill
   with deep near-black ink + a gold hairline frame — a crisp, high-contrast
   price tag (Hotels.com style) that pops on both light and dark tiles. */
.atlas-price-peg .atlas-price-peg-pill {
  display: block;
  padding: 3px 10px 4px;
  border-radius: 999px;
  background: #fcfaf5;
  color: #1a1206;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 0.8rem;
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.01em;
  line-height: 1.1;
  border: 1.5px solid color-mix(in srgb, var(--gold-deep, var(--gold)) 78%, #1a1206);
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.6);
  white-space: nowrap;
}
.atlas-price-peg.is-selected .atlas-price-peg-pill {
  background: var(--gold-bright);
  color: #1a1206;
  box-shadow: 0 0 0 2px color-mix(in srgb, var(--surface) 88%, transparent),
              0 0 0 4px color-mix(in srgb, var(--gold-bright) 55%, transparent);
}
.atlas-price-peg .atlas-price-peg-tail {
  width: 0;
  height: 0;
  margin-top: -1px;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  border-top: 6px solid color-mix(in srgb, var(--gold-deep, var(--gold)) 78%, #1a1206);
}
.atlas-price-peg.is-selected .atlas-price-peg-tail {
  border-top-color: var(--gold-bright);
}
/* Dark site theme: keep a light, legible pill (charcoal-white) with dark ink so
   the price never disappears into the filtered dark basemap. */
:root[data-theme="dark"] .atlas-price-peg .atlas-price-peg-pill {
  background: #f4efe4;
  color: #1a1206;
  border-color: color-mix(in srgb, var(--gold-bright, #d9bf82) 60%, #1a1206);
}
:root[data-theme="dark"] .atlas-price-peg .atlas-price-peg-tail {
  border-top-color: color-mix(in srgb, var(--gold-bright, #d9bf82) 60%, #1a1206);
}

/* ---- Cluster bubble: a ringed gold medallion with the count --------------
   CLUSTER-SIZE-2026: enlarged from v1 (34/42/52px) for region-zoom legibility;
   tuned to ~1.5× original — still bigger than launch, lighter than the 2× pass.
   CLUSTER-PRIORITY-2026: rendered on atlasClusters pane (z 1000) — above default
   hotel plates (720). Hovered plates move to atlasHotelLabelsHover (z 1100). */
   Selector must beat .leaflet-marker-icon / .leaflet-div-icon from vendor CSS
   when Leaflet lazy-loads after styles.css (PERF-2026). */
.map-container .leaflet-marker-icon.atlas-cluster {
  background: none !important;
  border: none !important;
  display: flex !important;
  align-items: center;
  justify-content: center;
  position: relative;
  z-index: 1000;
}
.map-container .leaflet-marker-icon.atlas-cluster .atlas-cluster-ring {
  position: absolute; inset: 0;
  border-radius: 50%;
  background: color-mix(in srgb, var(--gold) 72%, transparent);
  border: 2px solid var(--surface);
  box-shadow: 0 2px 10px rgba(0,0,0,0.28),
              0 0 0 1px color-mix(in srgb, var(--gold-deep, var(--gold)) 48%, transparent);
}
.map-container .leaflet-marker-icon.atlas-cluster .atlas-cluster-num {
  position: absolute; inset: 0;
  display: flex; align-items: center; justify-content: center;
  z-index: 1;
  font-family: var(--font-wordmark, var(--font-display));
  font-weight: 700;
  font-size: 1.24rem;
  /* Dark ink on gold — --bg-sunken is cream in light theme (invisible on gold). */
  color: #1a1206;
  font-variant-numeric: tabular-nums;
  line-height: 1;
}
.atlas-cluster--sm { width: 52px; height: 52px; }
.atlas-cluster--md { width: 64px; height: 64px; }
.map-container .leaflet-marker-icon.atlas-cluster--md .atlas-cluster-num { font-size: 1.38rem; }
.atlas-cluster--lg { width: 78px; height: 78px; }
.map-container .leaflet-marker-icon.atlas-cluster--lg .atlas-cluster-num { font-size: 1.53rem; }
.map-container .leaflet-marker-icon.atlas-cluster:hover .atlas-cluster-ring {
  background: var(--gold-bright);
  transform: scale(1.06);
  transition: transform 0.15s ease, background 0.15s ease;
}
.leaflet-pane.leaflet-atlasHotelLabelsHover-pane {
  z-index: 1100 !important;
  pointer-events: none;
}
.leaflet-pane.leaflet-atlasHotelLabelsHover-pane .leaflet-tooltip {
  pointer-events: auto;
}
.leaflet-pane.leaflet-atlasClusters-pane {
  z-index: 1000 !important;
}

/* ---- PIN-LABEL-2026: always-on label beside a declustered single pin -----
   A small, glassy plate carrying the hotel name + a compact meta line
   (Brand · NNN rooms · est. YYYY). Strips Leaflet's default white tooltip
   chrome (box, border, arrow). Hidden until the map is zoomed to metro/city
   level (body.atlas-pin-labels-on, zoom >= 11), so region/world views stay clean and the
   labels never crowd the ocean. Pointer-events:none so labels never steal a
   pin click. Plain text only — no images — for smooth pan/zoom. */
/* MAP-TEXT-READABLE-2026: Light mode keeps a warm cream plate on the bright
   Voyager basemap. Dark site theme uses a separate night plate below (charcoal
   + cream/gold ink) so labels sit naturally on the filtered CARTO dark tiles.
   Leaflet positions via transform on .leaflet-tooltip — visual plate chrome
   (background, border, shadow) lives on .atlas-pin-label-plate so hover scale
   grows the whole box, not just the text. */
.atlas-pin-label.leaflet-tooltip {
  background: transparent;
  border: none;
  padding: 0;
  box-shadow: none;
  white-space: normal;
  max-width: none;
  width: auto;
  pointer-events: auto;
  cursor: default;
  z-index: 720;
  /* hidden by default; revealed at city zoom */
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.18s ease;
}
body.atlas-pin-labels-on .atlas-pin-label.leaflet-tooltip {
  opacity: 1;
  visibility: visible;
}
/* HOTEL vs POI-2026: hotel plates = centered serif; POI = left rail + chip.
   T1 is a plain uniform box (no gold cap); T2+ paint prestige chrome. */
.atlas-pin-label--hotel.leaflet-tooltip {
  text-align: center;
  overflow: visible;
  width: max-content;
  max-width: none;
}
/* Visible plate surface — scales as one unit on hover (Leaflet never touches this).
   MAP-PLAQUE-LIFT-2026-07: light plate is a touch brighter than the Voyager land
   fill so boxes separate from the basemap; near-black ink (#1a1206) is unchanged. */
.atlas-pin-label--hotel .atlas-pin-label-plate {
  display: block;
  cursor: pointer;
  text-align: center;
  background: rgba(255, 252, 246, 0.99);
  /* T1-NO-BAR-2026-08: Tier 1 is a plain box — uniform 1.5px, no gold cap. */
  border: 1.5px solid #6a4f17;
  border-radius: 8px;
  box-shadow:
    0 2px 10px rgba(0, 0, 0, 0.36),
    0 0 0 2px rgba(255, 255, 255, 0.88);
  padding: 5px 11px 7px;
  max-width: 230px;
  width: max-content;
  color: #1a1206;
  transform-origin: center bottom;
  transition: transform 0.16s ease, box-shadow 0.16s ease;
}
/* Hover: slight scale-up; lift to hover pane (z 1100) so plate reads over cluster bubbles. */
.atlas-pin-label--hotel.leaflet-tooltip.is-map-label-hover {
  z-index: 1100 !important;
}
.atlas-pin-label--hotel.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate,
.atlas-pin-label--hotel .atlas-pin-label-plate:hover {
  transform: scale(1.045);
  box-shadow:
    0 5px 16px rgba(0, 0, 0, 0.42),
    0 0 0 2px rgba(255, 255, 255, 0.92);
}
.atlas-pin-label--hotel.is-map-label-hover .atlas-pin-label-name {
  color: #14213d;
  text-decoration: underline;
  text-underline-offset: 2px;
}
/* Modal jump focus: lifted above all other hotel plates until Back / mode change. */
.atlas-pin-label--hotel.leaflet-tooltip.is-map-label-focus {
  z-index: 1200 !important;
}
/* MAP-MODAL-FOCUS-2026 (light): champagne-gold frame + whisper rose tint — modal click-through only. */
:root[data-theme="light"] .atlas-pin-label--hotel.leaflet-tooltip.is-map-label-focus .atlas-pin-label-plate {
  background: color-mix(in srgb, #e8c4c8 7%, rgba(255, 252, 246, 0.99));
  border: 2.25px solid #b8964e;
  border-top: 4.5px solid #d4bc82;
  transform: scale(1.05);
  box-shadow:
    0 6px 20px rgba(0, 0, 0, 0.48),
    0 0 0 2px rgba(255, 255, 255, 0.82),
    0 0 0 6px color-mix(in srgb, var(--gold-bright, #d9bf82) 42%, transparent),
    inset 0 1px 0 rgba(255, 255, 255, 0.35);
}
:root[data-theme="light"] .atlas-pin-label--hotel.is-map-label-focus .atlas-pin-label-name {
  color: #3a2a08;
  font-weight: 800;
  letter-spacing: 0.002em;
}
.atlas-pin-label .atlas-pin-label-plate:focus-visible {
  outline: 2px solid #6a4f17;
  outline-offset: 2px;
  border-radius: 4px;
}
.atlas-pin-label .atlas-pin-label-plate:hover .atlas-pin-label-name,
.atlas-pin-label .atlas-pin-label-plate:focus-visible .atlas-pin-label-name {
  color: #14213d;
  text-decoration: underline;
  text-underline-offset: 2px;
}
/* Kill Leaflet's default tooltip arrow/triangle for our flat plate. */
.atlas-pin-label.leaflet-tooltip::before { display: none !important; }
.atlas-pin-label .atlas-pin-label-name {
  display: block;
  font-family: var(--font-serif);
  font-weight: 700;
  /* PIN-NAME-BIG-2026: hotel name made MUCH larger (was 0.78rem) — it is the
     primary thing to scan on the map, so it now clearly dominates the plate. */
  /* MAP-TEXT-READABLE-2026: bumped up again for older / lower-vision viewers,
     and recolored from bright --gold (which is low-contrast on the white plate)
     to a DEEP gold-brown that keeps a hint of the era identity while clearing
     WCAG AA against the warm-white plate. Theme-independent. */
  font-size: 1.2rem;
  line-height: 1.16;
  color: #4a360c;
  letter-spacing: 0.005em;
  /* PIN-LABEL-WRAP-2026: allow multi-line wrapping + balanced line breaks so a
     long name splits into tidy lines instead of one long clipped row. */
  white-space: normal;
  text-wrap: balance;
  overflow-wrap: break-word;
}
.atlas-pin-label .atlas-pin-label-meta {
  display: block;
  margin-top: 2px;
  font-family: var(--font-display);
  font-weight: 600;
  /* MAP-TEXT-READABLE-2026: larger + a fixed dark slate (was --text-muted which
     went pale in dark mode). Reads clearly on the bright plate in both themes. */
  font-size: 0.76rem;
  letter-spacing: 0.03em;
  color: #3a342a;
  text-transform: none;
}
/* PIN-PRICE-SCORES-2026: "Independent" reads as the ABSENCE of a brand, not a
   brand named Independent — italic + jade (--indie-text) so it scans as
   non-marque in BOTH themes (dark already used jade; light was mid-slate and
   looked like a muted brand). */
.atlas-pin-label .atlas-pin-label-indie {
  font-style: italic;
  font-weight: 600;
  color: var(--indie-text);
  letter-spacing: 0.02em;
}
/* PIN-PRICE-SCORES-2026: third line — lowest future price + Google / TA scores
   + green/red flags on the same flex row (wrap when crowded). */
.atlas-pin-label .atlas-pin-label-stats {
  display: flex;
  align-items: center;
  /* PIN-LABEL-ABOVE-2026: center the price/score/flag row under the (now centered)
     name; wrap flags onto the next line when they no longer fit beside Loc/TA. */
  justify-content: center;
  flex-wrap: wrap;
  white-space: normal;
  gap: 8px;
  margin-top: 4px;
  font-family: var(--font-display);
  font-variant-numeric: tabular-nums;
  line-height: 1;
}
/* Flags sit in the stats row (not a dedicated below-row). */
.atlas-pin-label .atlas-pin-label-stats .atlas-pin-label-flaggroups {
  margin-left: 2px;
  max-width: 100%;
}
.atlas-pin-label .atlas-pin-label-flagrow {
  display: flex;
  justify-content: center;
  flex-wrap: wrap;
  gap: 3px;
  margin-top: 5px;
  max-width: 100%;
  line-height: 0;
}
.atlas-pin-label .atlas-pin-label-price {
  font-weight: 800;
  /* MAP-TEXT-READABLE-2026: larger + fixed near-black (was --text). */
  font-size: 0.92rem;
  color: #1a1206;
}
.atlas-pin-label .atlas-pin-label-score {
  display: inline-flex;
  align-items: baseline;
  gap: 2px;
  font-weight: 700;
  /* MAP-TEXT-READABLE-2026: larger + fixed near-black (was --text). */
  font-size: 0.82rem;
  color: #1a1206;
}
.atlas-pin-label .atlas-pin-label-score-src {
  font-weight: 800;
  font-size: 0.56rem;
  letter-spacing: 0.02em;
  opacity: 0.92;
}
/* Google = its blue; TripAdvisor = its green. Source letters carry the color so
   the numbers stay crisp on the plate. */
.atlas-pin-label .atlas-pin-label-score--g .atlas-pin-label-score-src { color: #4285f4; }
.atlas-pin-label .atlas-pin-label-score--ta .atlas-pin-label-score-src { color: #00aa6c; }
.atlas-pin-label .atlas-pin-label-score--naver .atlas-pin-label-score-src { color: #03c75a; }
.atlas-pin-label .atlas-pin-label-score--loc .atlas-pin-label-score-src { color: #7c6aad; }
/* MAP-RATING-EXTREME-2026: regional percentile signals on G / Loc / TA numerals.
   Only the score number is tinted; source letters keep brand colors. Glow uses
   text-shadow (not box-shadow) so the tight pin plate stays legible on the
   bright basemap (Voyager light / Positron dark UI) in both site themes. */
.atlas-pin-label .atlas-pin-label-score-num {
  font-weight: 800;
  color: #1a1206;
}
/* Low scores — pink → red → orange escalation (stronger glow for map scan) */
.atlas-pin-label .atlas-pin-label-score.is-rating-low-20 .atlas-pin-label-score-num {
  color: #1a1206;
  text-shadow:
    0 0 3px rgba(244, 114, 182, 0.78),
    0 0 8px rgba(236, 72, 153, 0.52);
}
.atlas-pin-label .atlas-pin-label-score.is-rating-low-15 .atlas-pin-label-score-num {
  color: #7f1d1d;
  text-shadow:
    0 0 4px rgba(244, 114, 182, 0.88),
    0 0 11px rgba(236, 72, 153, 0.62);
}
.atlas-pin-label .atlas-pin-label-score.is-rating-low-10 .atlas-pin-label-score-num {
  color: #b91c1c;
  font-weight: 900;
  text-shadow:
    0 0 5px rgba(239, 68, 68, 0.92),
    0 0 12px rgba(248, 113, 113, 0.62);
}
.atlas-pin-label .atlas-pin-label-score.is-rating-low-5 .atlas-pin-label-score-num {
  color: #c2410c;
  font-weight: 900;
  text-shadow:
    0 0 6px rgba(249, 115, 22, 0.95),
    0 0 14px rgba(251, 146, 60, 0.68);
}
/* High scores — blue → navy → green escalation */
.atlas-pin-label .atlas-pin-label-score.is-rating-high-20 .atlas-pin-label-score-num {
  color: #1a1206;
  text-shadow:
    0 0 3px rgba(96, 165, 250, 0.78),
    0 0 8px rgba(59, 130, 246, 0.52);
}
.atlas-pin-label .atlas-pin-label-score.is-rating-high-15 .atlas-pin-label-score-num {
  color: #1e3a5f;
  text-shadow:
    0 0 4px rgba(96, 165, 250, 0.88),
    0 0 11px rgba(59, 130, 246, 0.62);
}
.atlas-pin-label .atlas-pin-label-score.is-rating-high-10 .atlas-pin-label-score-num {
  color: #14532d;
  font-weight: 900;
  text-shadow:
    0 0 5px rgba(74, 222, 128, 0.92),
    0 0 12px rgba(34, 197, 94, 0.62);
}
.atlas-pin-label .atlas-pin-label-score.is-rating-high-5 .atlas-pin-label-score-num {
  color: #166534;
  font-weight: 900;
  text-shadow:
    0 0 6px rgba(74, 222, 128, 0.95),
    0 0 14px rgba(34, 197, 94, 0.72);
}
.atlas-pin-label .atlas-pin-label-extras {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 5px;
  margin-top: 3px;
}
.atlas-pin-label-lab {
  font-size: 0.58rem;
  font-weight: 700;
  letter-spacing: 0.07em;
  text-transform: uppercase;
  color: #3d6b4f;
  padding: 1px 6px;
  border-radius: 999px;
  background: rgba(61, 107, 79, 0.12);
  border: 1px solid rgba(61, 107, 79, 0.28);
}
.atlas-pin-label-onscreen {
  font-size: 0.58rem;
  font-weight: 700;
  letter-spacing: 0.07em;
  text-transform: uppercase;
  color: #8a6d2b;
  padding: 1px 6px;
  border-radius: 999px;
  background: rgba(200, 168, 75, 0.14);
  border: 1px solid rgba(200, 168, 75, 0.35);
}
/* MAP-PIN-FLAGS-2026: discreet saturated flag glyphs — one icon per active flag,
   sized just above the G/Loc/TA score numerals (0.82rem), not text pills. */
.atlas-pin-label-flaggroups {
  display: inline-flex;
  align-items: center;
  flex-wrap: wrap;
  justify-content: center;
  gap: 5px;
  max-width: 100%;
  line-height: 0;
  vertical-align: middle;
}
.atlas-pin-label-flags {
  display: inline-flex;
  align-items: center;
  flex-wrap: wrap;
  justify-content: center;
  gap: 2px;
  line-height: 0;
  vertical-align: middle;
  max-width: 100%;
}
/* Green pill — greens only (3–4 flags = tier 2, 5+ = tier 3). */
.atlas-pin-label-flags--green.is-green-tier-2 {
  padding: 2px 4px;
  border-radius: 999px;
  background: rgba(0, 200, 83, 0.1);
  box-shadow: 0 0 6px rgba(0, 200, 83, 0.28);
}
.atlas-pin-label-flags--green.is-green-tier-3 {
  padding: 3px 5px;
  border-radius: 999px;
  background: linear-gradient(135deg, rgba(0, 168, 68, 0.18), rgba(0, 230, 118, 0.12));
  box-shadow: 0 0 10px rgba(0, 230, 118, 0.45), 0 0 0 1px rgba(0, 168, 68, 0.25);
}
/* Red pill — reds only; mirrors green thresholds with red wash/glow. */
.atlas-pin-label-flags--red.is-red-pill-tier-2 {
  padding: 2px 4px;
  border-radius: 999px;
  background: rgba(255, 23, 68, 0.1);
  box-shadow: 0 0 6px rgba(255, 23, 68, 0.28);
}
.atlas-pin-label-flags--red.is-red-pill-tier-3 {
  padding: 3px 5px;
  border-radius: 999px;
  background: linear-gradient(135deg, rgba(220, 38, 38, 0.18), rgba(255, 23, 68, 0.12));
  box-shadow: 0 0 10px rgba(255, 23, 68, 0.42), 0 0 0 1px rgba(220, 38, 38, 0.28);
}
.atlas-pin-label-flag {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: none;
  background: none;
  border-radius: 0;
  line-height: 0;
  flex-shrink: 0;
}
.atlas-pin-label-flag-icon {
  display: block;
  width: 0.8rem;
  height: 1rem;
  filter: drop-shadow(0 0 0.5px rgba(255, 255, 255, 0.85));
}
.atlas-pin-label-flag--green {
  color: #00c853;
}
.atlas-pin-label-flag--green.is-green-tier-2 {
  color: #00a844;
  filter: drop-shadow(0 0 1.5px rgba(0, 200, 83, 0.75)) drop-shadow(0 0 0.5px rgba(255, 255, 255, 0.85));
}
.atlas-pin-label-flag--green.is-green-tier-3 {
  color: #00e676;
  filter:
    drop-shadow(0 0 2.5px rgba(0, 230, 118, 0.9))
    drop-shadow(0 0 5px rgba(0, 200, 83, 0.55))
    drop-shadow(0 0 0.5px rgba(255, 255, 255, 0.85));
}
.atlas-pin-label-flag-overflow {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 1.05rem;
  height: 0.9rem;
  padding: 0 3px;
  font-family: var(--font-display);
  font-size: 0.58rem;
  font-weight: 800;
  line-height: 1;
  letter-spacing: 0.02em;
  border-radius: 999px;
  color: #5a5a64;
  background: rgba(90, 90, 100, 0.12);
  border: 1px solid rgba(90, 90, 100, 0.22);
  vertical-align: middle;
}
.atlas-pin-label-flag-overflow--green {
  color: #157a42;
  background: rgba(0, 200, 83, 0.14);
  border-color: rgba(0, 200, 83, 0.35);
}
.atlas-pin-label-flag-overflow--green.is-green-tier-2 {
  box-shadow: 0 0 4px rgba(0, 200, 83, 0.35);
}
.atlas-pin-label-flag-overflow--green.is-green-tier-3 {
  color: #fff;
  background: linear-gradient(135deg, #059669, #10b981);
  border-color: #047857;
  box-shadow: 0 0 6px rgba(16, 185, 129, 0.5);
}
.atlas-pin-label-flag--red {
  color: #ff1744;
}
.atlas-pin-label-flag--red.is-red-tier-1 { color: #e86050; }
.atlas-pin-label-flag--red.is-red-tier-2 { color: #f04838; }
.atlas-pin-label-flag--red.is-red-tier-3 { color: #f83830; }
.atlas-pin-label-flag--red.is-red-tier-4 { color: #f04838; }
.atlas-pin-label-flag--red.is-red-tier-5 {
  color: #ff2840;
  filter: drop-shadow(0 0 2px rgba(255, 40, 64, 0.75)) drop-shadow(0 0 6px rgba(255, 100, 130, 0.35));
}
.atlas-pin-label-flag--red.is-red-tier-6 {
  color: #ff5080;
  filter:
    drop-shadow(0 0 3px rgba(255, 80, 130, 0.9))
    drop-shadow(0 0 8px rgba(255, 60, 110, 0.55));
}
.atlas-pin-label-flag--red.is-red-tier-7 {
  color: #ff7030;
  filter:
    drop-shadow(0 0 3px rgba(255, 120, 50, 0.9))
    drop-shadow(0 0 10px rgba(255, 80, 30, 0.55));
}
/* Stronger red glyph glow inside red pill tiers (mirrors green pill icons). */
.atlas-pin-label-flags--red.is-red-pill-tier-2 .atlas-pin-label-flag--red {
  filter: drop-shadow(0 0 1.5px rgba(255, 23, 68, 0.75)) drop-shadow(0 0 0.5px rgba(255, 255, 255, 0.85));
}
.atlas-pin-label-flags--red.is-red-pill-tier-3 .atlas-pin-label-flag--red {
  filter:
    drop-shadow(0 0 2.5px rgba(255, 23, 68, 0.9))
    drop-shadow(0 0 5px rgba(220, 38, 38, 0.55))
    drop-shadow(0 0 0.5px rgba(255, 255, 255, 0.85));
}
.atlas-pin-label-tier {
  font-weight: 800;
  font-size: 0.72rem;
  color: var(--gold);
  letter-spacing: 0.04em;
  padding: 0 2px;
}

/* MAP-DARK-PLATE-2026: Night plates for hotel pin labels when the site is in
   dark theme (CARTO Positron basemap). Warm charcoal surface + cream/gold
   ink — same vocabulary as cards/modals, not the light-mode cream slab. */
:root[data-theme="dark"] .atlas-pin-label--hotel .atlas-pin-label-plate {
  background: rgba(44, 46, 51, 0.96);
  border-color: rgba(198, 167, 102, 0.42);
  box-shadow:
    0 3px 14px rgba(0, 0, 0, 0.62),
    0 0 0 1px rgba(198, 167, 102, 0.18),
    inset 0 1px 0 rgba(255, 255, 255, 0.06);
  color: #f2ead9;
}
:root[data-theme="dark"] .atlas-pin-label--hotel.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate,
:root[data-theme="dark"] .atlas-pin-label--hotel .atlas-pin-label-plate:hover {
  box-shadow:
    0 6px 20px rgba(0, 0, 0, 0.72),
    0 0 0 1px rgba(198, 167, 102, 0.38),
    0 0 18px rgba(198, 167, 102, 0.14);
}
:root[data-theme="dark"] .atlas-pin-label--hotel.is-map-label-hover .atlas-pin-label-name,
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-plate:hover .atlas-pin-label-name,
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-plate:focus-visible .atlas-pin-label-name {
  color: #d9bf82;
  text-decoration-color: rgba(217, 191, 130, 0.85);
}
/* MAP-MODAL-FOCUS-2026 (dark): night champagne frame + dusk-rose tint — pairs with light focus above. */
:root[data-theme="dark"] .atlas-pin-label--hotel.leaflet-tooltip.is-map-label-focus .atlas-pin-label-plate {
  background: color-mix(in srgb, #c49a9e 8%, rgba(44, 46, 51, 0.96));
  border: 2.25px solid #a88848;
  border-top: 4.5px solid #dcc894;
  transform: scale(1.05);
  box-shadow:
    0 8px 24px rgba(0, 0, 0, 0.78),
    0 0 0 1px rgba(217, 191, 130, 0.38),
    0 0 0 6px color-mix(in srgb, var(--gold-bright, #d9bf82) 32%, transparent),
    0 0 24px rgba(198, 167, 102, 0.26),
    inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
:root[data-theme="dark"] .atlas-pin-label--hotel.is-map-label-focus .atlas-pin-label-name {
  color: #f5e6c8;
  font-weight: 800;
  letter-spacing: 0.002em;
}
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-plate:focus-visible {
  outline-color: #c6a766;
}
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-name {
  color: #f2ead9;
}
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-meta {
  color: #b0ac9a;
}
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-indie {
  color: #7fe3cd;
}
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-price,
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-score {
  color: #f2ead9;
}
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-score-num {
  color: #f2ead9;
}
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-score--g .atlas-pin-label-score-src { color: #7db2ec; }
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-score--ta .atlas-pin-label-score-src { color: #5fd4a0; }
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-score--naver .atlas-pin-label-score-src { color: #3ddc84; }
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-score--loc .atlas-pin-label-score-src { color: #b8a8d8; }
/* Rating glows — slightly stronger on the dark plate so extremes still scan. */
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-score.is-rating-low-20 .atlas-pin-label-score-num {
  color: #fce7f3;
  text-shadow:
    0 0 4px rgba(244, 114, 182, 0.95),
    0 0 10px rgba(236, 72, 153, 0.65);
}
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-score.is-rating-low-15 .atlas-pin-label-score-num {
  color: #fecaca;
  text-shadow:
    0 0 5px rgba(248, 113, 113, 0.95),
    0 0 12px rgba(239, 68, 68, 0.72);
}
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-score.is-rating-low-10 .atlas-pin-label-score-num {
  color: #fca5a5;
  text-shadow:
    0 0 6px rgba(239, 68, 68, 0.98),
    0 0 14px rgba(248, 113, 113, 0.75);
}
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-score.is-rating-low-5 .atlas-pin-label-score-num {
  color: #fdba74;
  text-shadow:
    0 0 7px rgba(251, 146, 60, 0.98),
    0 0 16px rgba(249, 115, 22, 0.78);
}
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-score.is-rating-high-20 .atlas-pin-label-score-num {
  color: #e0f2fe;
  text-shadow:
    0 0 4px rgba(96, 165, 250, 0.95),
    0 0 10px rgba(59, 130, 246, 0.65);
}
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-score.is-rating-high-15 .atlas-pin-label-score-num {
  color: #bfdbfe;
  text-shadow:
    0 0 5px rgba(96, 165, 250, 0.98),
    0 0 12px rgba(59, 130, 246, 0.75);
}
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-score.is-rating-high-10 .atlas-pin-label-score-num {
  color: #bbf7d0;
  text-shadow:
    0 0 6px rgba(74, 222, 128, 0.98),
    0 0 14px rgba(34, 197, 94, 0.75);
}
:root[data-theme="dark"] .atlas-pin-label .atlas-pin-label-score.is-rating-high-5 .atlas-pin-label-score-num {
  color: #86efac;
  text-shadow:
    0 0 7px rgba(74, 222, 128, 0.98),
    0 0 16px rgba(34, 197, 94, 0.82);
}
:root[data-theme="dark"] .atlas-pin-label-lab {
  color: #8fd4a8;
  background: rgba(76, 201, 176, 0.14);
  border-color: rgba(76, 201, 176, 0.32);
}
/* Flag pills + glyphs on dark plate */
:root[data-theme="dark"] .atlas-pin-label-flags--green.is-green-tier-2 {
  background: rgba(0, 200, 83, 0.16);
  box-shadow: 0 0 8px rgba(0, 200, 83, 0.38);
}
:root[data-theme="dark"] .atlas-pin-label-flags--green.is-green-tier-3 {
  background: linear-gradient(135deg, rgba(0, 168, 68, 0.28), rgba(0, 230, 118, 0.18));
  box-shadow: 0 0 12px rgba(0, 230, 118, 0.52), 0 0 0 1px rgba(0, 200, 83, 0.35);
}
:root[data-theme="dark"] .atlas-pin-label-flags--red.is-red-pill-tier-2 {
  background: rgba(255, 23, 68, 0.16);
  box-shadow: 0 0 8px rgba(255, 23, 68, 0.38);
}
:root[data-theme="dark"] .atlas-pin-label-flags--red.is-red-pill-tier-3 {
  background: linear-gradient(135deg, rgba(220, 38, 38, 0.28), rgba(255, 23, 68, 0.18));
  box-shadow: 0 0 12px rgba(255, 23, 68, 0.48), 0 0 0 1px rgba(255, 23, 68, 0.32);
}
:root[data-theme="dark"] .atlas-pin-label-flag-icon {
  filter: drop-shadow(0 0 1px rgba(0, 0, 0, 0.85));
}
:root[data-theme="dark"] .atlas-pin-label-flag--green.is-green-tier-2 {
  filter: drop-shadow(0 0 2px rgba(0, 230, 118, 0.85)) drop-shadow(0 0 1px rgba(0, 0, 0, 0.75));
}
:root[data-theme="dark"] .atlas-pin-label-flag--green.is-green-tier-3 {
  filter:
    drop-shadow(0 0 3px rgba(0, 230, 118, 0.95))
    drop-shadow(0 0 6px rgba(0, 200, 83, 0.65))
    drop-shadow(0 0 1px rgba(0, 0, 0, 0.75));
}
:root[data-theme="dark"] .atlas-pin-label-flags--red.is-red-pill-tier-2 .atlas-pin-label-flag--red {
  filter: drop-shadow(0 0 2px rgba(255, 23, 68, 0.85)) drop-shadow(0 0 1px rgba(0, 0, 0, 0.75));
}
:root[data-theme="dark"] .atlas-pin-label-flags--red.is-red-pill-tier-3 .atlas-pin-label-flag--red {
  filter:
    drop-shadow(0 0 3px rgba(255, 23, 68, 0.95))
    drop-shadow(0 0 6px rgba(220, 38, 38, 0.65))
    drop-shadow(0 0 1px rgba(0, 0, 0, 0.75));
}
:root[data-theme="dark"] .atlas-pin-label-flag--red.is-red-tier-1 { color: #ff9888; }
:root[data-theme="dark"] .atlas-pin-label-flag--red.is-red-tier-2 { color: #ff7868; }
:root[data-theme="dark"] .atlas-pin-label-flag--red.is-red-tier-3 { color: #ff6858; }
:root[data-theme="dark"] .atlas-pin-label-flag-overflow {
  color: #a8a49a;
  background: rgba(255, 255, 255, 0.08);
  border-color: rgba(255, 255, 255, 0.14);
}

/* ---- MAP-PLAQUE-SIZE-2026: plaque density variants (Sizes 2–5) ---------- */
/* T1-NO-BAR / T2-STRONG-TOP-2026-08: T1 never carries a top-only gold cap
   (the default plate is a uniform box). T2's top-only bar is a heavy stripe
   so T1 vs T2 reads at a glance. T3–6 Size 4/5 full surrounds are untouched. */
.atlas-pin-label--hotel .atlas-pin-label-plate:not([class*="plate--t"]) {
  border-top-width: 1.5px;
  border-top-color: #6a4f17;
}
:root[data-theme="dark"] .atlas-pin-label--hotel .atlas-pin-label-plate:not([class*="plate--t"]) {
  border-top-width: 1.5px;
  border-top-color: rgba(198, 167, 102, 0.42);
}
/* Size 2: compact plates */
.atlas-pin-label--size-2 .atlas-pin-label-plate {
  max-width: 190px;
  padding: 4px 9px 5px;
}
.atlas-pin-label--size-2 .atlas-pin-label-name {
  font-size: 0.95rem;
  line-height: 1.14;
}
.atlas-pin-label--size-2 .atlas-pin-label-meta {
  font-size: 0.68rem;
  margin-top: 1px;
}
.atlas-pin-label--size-2 .atlas-pin-label-stats {
  margin-top: 3px;
  gap: 6px;
}
/* SIZE2-TIER-TOP-2026-07: scaled-down Size 4 top stripe (T2–6).
   T2-STRONG-TOP-2026-08: T2 top bar much heavier than the old 3.5px whisper. */
.atlas-pin-label--size-2 .atlas-pin-label-plate--t2 {
  border-top-width: 6px;
  border-top-color: #b8964e;
  box-shadow:
    0 2px 8px rgba(0, 0, 0, 0.34),
    0 0 0 1.5px rgba(255, 255, 255, 0.86),
    0 -1.5px 0 0 color-mix(in srgb, #b8964e 65%, transparent),
    0 -2.5px 0 0 color-mix(in srgb, #8f6f2e 40%, transparent);
}
.atlas-pin-label--size-2 .atlas-pin-label-plate--t3 {
  /* Former T4 gold chrome, shifted down one. */
  border-top-width: 4.5px;
  border-top-color: #e8b83a;
  box-shadow:
    0 2px 8px rgba(0, 0, 0, 0.34),
    0 0 0 1.5px rgba(255, 255, 255, 0.88),
    0 -1px 0 0 color-mix(in srgb, #d4a017 75%, transparent);
}
.atlas-pin-label--size-2 .atlas-pin-label-plate--t4 {
  position: relative;
  border-top-width: 4.5px;
  border-top-color: #1aa891;
  box-shadow:
    0 2px 8px rgba(0, 0, 0, 0.34),
    0 0 0 1.5px rgba(255, 255, 255, 0.88),
    0 -1px 0 0 #12897a,
    0 -2px 0 0 color-mix(in srgb, #0f6e63 45%, transparent);
}
.atlas-pin-label--size-2 .atlas-pin-label-plate--t5 {
  position: relative;
  border-top-width: 5px;
  border-top-color: #3f5fd6;
  background: color-mix(in srgb, #3f5fd6 7%, rgba(255, 252, 246, 0.99));
  box-shadow:
    0 2px 8px rgba(0, 0, 0, 0.34),
    0 0 0 1.5px rgba(255, 255, 255, 0.88),
    0 -1px 0 0 #2a3f9e,
    0 -2px 0 0 color-mix(in srgb, #d6bd82 55%, transparent);
}
.atlas-pin-label--size-2 .atlas-pin-label-plate--t6 {
  position: relative;
  border-top-width: 6.5px;
  border-top-color: #8a4ec8;
  background: color-mix(in srgb, #8a4ec8 7%, rgba(255, 252, 246, 0.99));
  box-shadow:
    0 2px 8px rgba(0, 0, 0, 0.34),
    0 0 0 1.5px rgba(255, 255, 255, 0.88),
    0 -1px 0 0 #5a2d8a,
    0 -2px 0 0 #3c1a5c,
    0 -3px 0 0 color-mix(in srgb, #d6bd82 60%, transparent),
    0 -4px 0 0 color-mix(in srgb, #c4a0ec 40%, transparent);
}
.atlas-pin-label--size-2.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t2,
.atlas-pin-label--size-2 .atlas-pin-label-plate--t2:hover {
  box-shadow:
    0 4px 12px rgba(0, 0, 0, 0.4),
    0 0 0 1.5px rgba(255, 255, 255, 0.9),
    0 -1.5px 0 0 color-mix(in srgb, #b8964e 75%, transparent),
    0 -2.5px 0 0 color-mix(in srgb, #8f6f2e 50%, transparent);
}
.atlas-pin-label--size-2.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t3,
.atlas-pin-label--size-2 .atlas-pin-label-plate--t3:hover {
  box-shadow:
    0 4px 12px rgba(0, 0, 0, 0.4),
    0 0 0 1.5px rgba(255, 255, 255, 0.92),
    0 -1px 0 0 #d4a017;
}
.atlas-pin-label--size-2.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t4,
.atlas-pin-label--size-2 .atlas-pin-label-plate--t4:hover {
  box-shadow:
    0 4px 12px rgba(0, 0, 0, 0.4),
    0 0 0 1.5px rgba(255, 255, 255, 0.92),
    0 -1px 0 0 #12897a,
    0 -2px 0 0 #0f6e63;
}
.atlas-pin-label--size-2.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t5,
.atlas-pin-label--size-2 .atlas-pin-label-plate--t5:hover {
  box-shadow:
    0 4px 12px rgba(0, 0, 0, 0.4),
    0 0 0 1.5px rgba(255, 255, 255, 0.92),
    0 -1px 0 0 #2a3f9e,
    0 -2px 0 0 rgba(214, 189, 130, 0.7);
}
.atlas-pin-label--size-2.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t6,
.atlas-pin-label--size-2 .atlas-pin-label-plate--t6:hover {
  box-shadow:
    0 4px 12px rgba(0, 0, 0, 0.4),
    0 0 0 1.5px rgba(255, 255, 255, 0.92),
    0 -1px 0 0 #5a2d8a,
    0 -2px 0 0 #3c1a5c,
    0 -3px 0 0 rgba(214, 189, 130, 0.75),
    0 -4px 0 0 rgba(196, 160, 236, 0.5);
}
:root[data-theme="dark"] .atlas-pin-label--size-2 .atlas-pin-label-plate--t2 {
  border-top-width: 6px;
  border-top-color: #d4b56a;
  box-shadow:
    0 3px 12px rgba(0, 0, 0, 0.6),
    0 0 0 1px rgba(198, 167, 102, 0.14),
    0 -1.5px 0 0 color-mix(in srgb, #d4b56a 65%, transparent),
    0 -2.5px 0 0 color-mix(in srgb, #b8964e 40%, transparent);
}
:root[data-theme="dark"] .atlas-pin-label--size-2 .atlas-pin-label-plate--t3 {
  border-top-width: 4.5px;
  border-top-color: #f5c84a;
  box-shadow:
    0 3px 12px rgba(0, 0, 0, 0.6),
    0 0 0 1px rgba(232, 184, 58, 0.32),
    0 -1px 0 0 #e0ac28;
}
:root[data-theme="dark"] .atlas-pin-label--size-2 .atlas-pin-label-plate--t4 {
  border-top-width: 4.5px;
  border-top-color: #5ef0d4;
  box-shadow:
    0 3px 12px rgba(0, 0, 0, 0.6),
    0 0 0 1px rgba(46, 212, 184, 0.26),
    0 -1px 0 0 #2ad4b8,
    0 -2px 0 0 #12897a;
}
:root[data-theme="dark"] .atlas-pin-label--size-2 .atlas-pin-label-plate--t5 {
  border-top-width: 5px;
  border-top-color: #a8bcff;
  background: color-mix(in srgb, #7a96ff 7%, rgba(44, 46, 51, 0.96));
  box-shadow:
    0 3px 12px rgba(0, 0, 0, 0.6),
    0 0 0 1px rgba(168, 188, 255, 0.26),
    0 -1px 0 0 #7a96ff,
    0 -2px 0 0 rgba(214, 189, 130, 0.5);
}
:root[data-theme="dark"] .atlas-pin-label--size-2 .atlas-pin-label-plate--t6 {
  border-top-width: 6.5px;
  border-top-color: #d4b8ff;
  background: color-mix(in srgb, #b07aee 7%, rgba(44, 46, 51, 0.96));
  box-shadow:
    0 3px 12px rgba(0, 0, 0, 0.6),
    0 0 0 1px rgba(212, 184, 255, 0.28),
    0 -1px 0 0 #a06ae0,
    0 -2px 0 0 #5a2d8a,
    0 -3px 0 0 rgba(214, 189, 130, 0.55);
}
/* Size 3: compact plate; name sits between Size 2 (0.95rem) and Size 4 (1.2rem). */
.atlas-pin-label--size-3 .atlas-pin-label-plate {
  max-width: 161px;
  padding: 4px 8px 5px;
  border-radius: 6px;
}
.atlas-pin-label--size-3 .atlas-pin-label-name { font-size: 1.06rem; line-height: 1.14; }
.atlas-pin-label--size-3 .atlas-pin-label-meta { font-size: 0.62rem; margin-top: 1px; }
.atlas-pin-label--size-3 .atlas-pin-label-stats { margin-top: 3px; gap: 5px; font-size: 0.88em; }
.atlas-pin-label--size-3 .atlas-pin-label-price { font-size: 0.78rem; }
.atlas-pin-label--size-3 .atlas-pin-label-tier { font-size: 0.72rem; }
.atlas-pin-label--size-3 .atlas-pin-label-score { font-size: 0.68rem; }
.atlas-pin-label--size-3 .atlas-pin-label-flagrow { margin-top: 3px; }
/* SIZE3-TIER-TOP-2026-08: top-only tier bars. T2-STRONG-TOP-2026-08: T2's
   top bar is a heavy stripe (was 5px) so T1 (no bar) vs T2 is obvious. */
.atlas-pin-label--size-3 .atlas-pin-label-plate--t2 {
  border-top-width: 8px;
  border-top-color: #b8964e;
  box-shadow:
    0 2px 10px rgba(0, 0, 0, 0.36),
    0 0 0 2px rgba(255, 255, 255, 0.88),
    0 -2px 0 0 color-mix(in srgb, #b8964e 70%, transparent),
    0 -3.5px 0 0 color-mix(in srgb, #8f6f2e 40%, transparent);
}
.atlas-pin-label--size-3 .atlas-pin-label-plate--t3 {
  /* Former T4 gold chrome, shifted down one. */
  border-top-width: 7.5px;
  border-top-color: #e8b83a;
  box-shadow:
    0 2px 10px rgba(0, 0, 0, 0.36),
    0 0 0 2px rgba(255, 255, 255, 0.9),
    0 -1px 0 0 #efc24a,
    0 -2px 0 0 #d4a017,
    0 -3px 0 0 color-mix(in srgb, #a87a12 65%, transparent);
}
.atlas-pin-label--size-3 .atlas-pin-label-plate--t4 {
  position: relative;
  border-top-width: 9px;
  border-top-color: #1aa891;
  box-shadow:
    0 2px 10px rgba(0, 0, 0, 0.36),
    0 0 0 2px rgba(255, 255, 255, 0.9),
    0 -1px 0 0 #12897a,
    0 -2px 0 0 #0f6e63,
    0 -3px 0 0 color-mix(in srgb, #0b5049 50%, transparent);
}
.atlas-pin-label--size-3 .atlas-pin-label-plate--t5 {
  position: relative;
  border-top-width: 10px;
  border-top-color: #3f5fd6;
  background: color-mix(in srgb, #3f5fd6 7%, rgba(255, 252, 246, 0.99));
  box-shadow:
    0 2px 10px rgba(0, 0, 0, 0.36),
    0 0 0 2px rgba(255, 255, 255, 0.9),
    0 -1px 0 0 #2a3f9e,
    0 -2px 0 0 #1b2c6b,
    0 -3px 0 0 color-mix(in srgb, #d6bd82 70%, transparent),
    0 -4px 0 0 color-mix(in srgb, #1b2c6b 35%, transparent);
}
.atlas-pin-label--size-3 .atlas-pin-label-plate--t6 {
  position: relative;
  border-top-width: 12px;
  border-top-color: #8a4ec8;
  background: color-mix(in srgb, #8a4ec8 7%, rgba(255, 252, 246, 0.99));
  box-shadow:
    0 2px 10px rgba(0, 0, 0, 0.36),
    0 0 0 2px rgba(255, 255, 255, 0.9),
    0 -1px 0 0 #c4a0ec,
    0 -2px 0 0 #5a2d8a,
    0 -3px 0 0 #3c1a5c,
    0 -4px 0 0 color-mix(in srgb, #d6bd82 70%, transparent),
    0 -5px 0 0 color-mix(in srgb, #3c1a5c 40%, transparent);
}
.atlas-pin-label--size-3.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t3,
.atlas-pin-label--size-3 .atlas-pin-label-plate--t3:hover {
  box-shadow:
    0 5px 16px rgba(0, 0, 0, 0.42),
    0 0 0 2px rgba(255, 255, 255, 0.95),
    0 -1px 0 0 #efc24a,
    0 -2px 0 0 #d4a017,
    0 -3px 0 0 #a87a12;
}
.atlas-pin-label--size-3.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t4,
.atlas-pin-label--size-3 .atlas-pin-label-plate--t4:hover {
  box-shadow:
    0 5px 16px rgba(0, 0, 0, 0.42),
    0 0 0 2px rgba(255, 255, 255, 0.95),
    0 -1px 0 0 #12897a,
    0 -2px 0 0 #0f6e63,
    0 -3px 0 0 #0b5049;
}
.atlas-pin-label--size-3.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t5,
.atlas-pin-label--size-3 .atlas-pin-label-plate--t5:hover {
  box-shadow:
    0 5px 16px rgba(0, 0, 0, 0.42),
    0 0 0 2px rgba(255, 255, 255, 0.95),
    0 -1px 0 0 #2a3f9e,
    0 -2px 0 0 #1b2c6b,
    0 -3px 0 0 rgba(214, 189, 130, 0.8),
    0 -4px 0 0 rgba(27, 44, 107, 0.4);
}
.atlas-pin-label--size-3.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t6,
.atlas-pin-label--size-3 .atlas-pin-label-plate--t6:hover {
  box-shadow:
    0 5px 16px rgba(0, 0, 0, 0.42),
    0 0 0 2px rgba(255, 255, 255, 0.95),
    0 -1px 0 0 #c4a0ec,
    0 -2px 0 0 #5a2d8a,
    0 -3px 0 0 #3c1a5c,
    0 -4px 0 0 rgba(214, 189, 130, 0.8),
    0 -5px 0 0 rgba(60, 26, 92, 0.45);
}
.atlas-pin-label--size-3 .atlas-pin-label-tier--t1 { color: #6a4f17; }
.atlas-pin-label--size-3 .atlas-pin-label-tier--t2 { color: #8f6f2e; }
.atlas-pin-label--size-3 .atlas-pin-label-tier--t3 { color: #d4a017; }
.atlas-pin-label--size-3 .atlas-pin-label-tier--t4 { color: #12897a; }
.atlas-pin-label--size-3 .atlas-pin-label-tier--t5 { color: #2a3f9e; }
.atlas-pin-label--size-3 .atlas-pin-label-tier--t6 { color: #5a2d8a; }
:root[data-theme="dark"] .atlas-pin-label--size-3 .atlas-pin-label-plate--t2 {
  border-top-width: 8px;
  border-top-color: #d4b56a;
  box-shadow:
    0 3px 14px rgba(0, 0, 0, 0.62),
    0 0 0 1px rgba(198, 167, 102, 0.15),
    0 -2px 0 0 color-mix(in srgb, #d4b56a 70%, transparent),
    0 -3.5px 0 0 color-mix(in srgb, #b8964e 42%, transparent);
}
:root[data-theme="dark"] .atlas-pin-label--size-3 .atlas-pin-label-plate--t3 {
  border-top-width: 7.5px;
  border-top-color: #f5c84a;
  box-shadow:
    0 3px 14px rgba(0, 0, 0, 0.62),
    0 0 0 1px rgba(232, 184, 58, 0.36),
    0 -1px 0 0 #efc24a,
    0 -2px 0 0 #d4a017,
    0 -3px 0 0 color-mix(in srgb, #a87a12 70%, transparent);
}
:root[data-theme="dark"] .atlas-pin-label--size-3 .atlas-pin-label-plate--t4 {
  border-top-width: 9px;
  border-top-color: #5ef0d4;
  box-shadow:
    0 3px 14px rgba(0, 0, 0, 0.62),
    0 0 0 1px rgba(46, 212, 184, 0.28),
    0 -1px 0 0 #2ad4b8,
    0 -2px 0 0 #12897a,
    0 -3px 0 0 color-mix(in srgb, #0b5049 55%, transparent);
}
:root[data-theme="dark"] .atlas-pin-label--size-3 .atlas-pin-label-plate--t5 {
  border-top-width: 10px;
  border-top-color: #a8bcff;
  background: color-mix(in srgb, #7a96ff 7%, rgba(44, 46, 51, 0.96));
  box-shadow:
    0 3px 14px rgba(0, 0, 0, 0.62),
    0 0 0 1px rgba(168, 188, 255, 0.28),
    0 -1px 0 0 #7a96ff,
    0 -2px 0 0 #3f5fd6,
    0 -3px 0 0 rgba(214, 189, 130, 0.6),
    0 -4px 0 0 color-mix(in srgb, #1b2c6b 40%, transparent);
}
:root[data-theme="dark"] .atlas-pin-label--size-3 .atlas-pin-label-plate--t6 {
  border-top-width: 12px;
  border-top-color: #d4b8ff;
  background: color-mix(in srgb, #b07aee 7%, rgba(44, 46, 51, 0.96));
  box-shadow:
    0 3px 14px rgba(0, 0, 0, 0.62),
    0 0 0 1px rgba(212, 184, 255, 0.3),
    0 -1px 0 0 #c4a0ec,
    0 -2px 0 0 #a06ae0,
    0 -3px 0 0 #5a2d8a,
    0 -4px 0 0 rgba(214, 189, 130, 0.6),
    0 -5px 0 0 color-mix(in srgb, #3c1a5c 45%, transparent);
}
:root[data-theme="dark"] .atlas-pin-label--size-3 .atlas-pin-label-tier--t1 { color: #d4c4a0; }
:root[data-theme="dark"] .atlas-pin-label--size-3 .atlas-pin-label-tier--t2 { color: #d9bf82; }
:root[data-theme="dark"] .atlas-pin-label--size-3 .atlas-pin-label-tier--t3 { color: #f5c84a; }
:root[data-theme="dark"] .atlas-pin-label--size-3 .atlas-pin-label-tier--t4 { color: #5ef0d4; }
:root[data-theme="dark"] .atlas-pin-label--size-3 .atlas-pin-label-tier--t5 { color: #a8bcff; }
:root[data-theme="dark"] .atlas-pin-label--size-3 .atlas-pin-label-tier--t6 { color: #d4b8ff; }
/* Size 4: explicit — matches legacy defaults (body.map-plaque-size-4) */
.atlas-pin-label--size-4 .atlas-pin-label-plate {
  max-width: 230px;
  position: relative;
}
/* SIZE4-T2-TOP-2026-08: strong top-only bar (was 4px whisper). No side/bottom
   frames — T3–6 keep the Size-5-style all-sides surrounds below. */
.atlas-pin-label--size-4 .atlas-pin-label-plate--t2 {
  border-top-width: 8px;
  border-top-color: #b8964e;
  box-shadow:
    0 2px 10px rgba(0, 0, 0, 0.36),
    0 0 0 2px rgba(255, 255, 255, 0.88),
    0 -2px 0 0 color-mix(in srgb, #b8964e 70%, transparent),
    0 -3.5px 0 0 color-mix(in srgb, #8f6f2e 40%, transparent);
}
/* SIZE4-TIER-FRAME-2026-08: T3–6 get Size 5's all-sides prestige frames, scaled
   down for the smaller plate (thinner rings / hatch, still readable).
   TIER-CHROME-SHIFT-2026-08: gold/emerald/sapphire each drop one tier; T6 is
   a new royal-purple apex, thicker than the former T6 sapphire. */
.atlas-pin-label--size-4 .atlas-pin-label-plate--t3 {
  /* Former T4 gold chrome. */
  border-width: 2.5px;
  border-top-width: 4.5px;
  border-color: #b8964e;
  border-top-color: #f0d78a;
  background: color-mix(in srgb, #e7cf8f 5%, rgba(255, 252, 246, 0.99));
  box-shadow:
    0 0 0 1.5px rgba(255, 252, 246, 0.95),
    0 0 0 3px #e7cf8f,
    0 0 0 5px #c9a94f,
    0 0 0 6.5px #9b7f45,
    0 0 8px rgba(231, 207, 143, 0.5),
    0 3px 14px rgba(155, 127, 69, 0.38);
}
.atlas-pin-label--size-4 .atlas-pin-label-plate--t4 {
  /* Former T5 emerald chrome. */
  border: 3px solid #0b5049;
  border-top: 4.5px solid #1aa891;
  background: color-mix(in srgb, #1aa891 3.5%, rgba(255, 252, 246, 0.99));
  box-shadow:
    0 0 0 1px #d6bd82,
    0 0 0 3px #12897a,
    0 0 0 5px #0f6e63,
    0 0 0 6.5px rgba(214, 189, 130, 0.7),
    0 3px 14px rgba(15, 110, 99, 0.38);
}
.atlas-pin-label--size-4 .atlas-pin-label-plate--t4::before,
.atlas-pin-label--size-4 .atlas-pin-label-plate--t5::before,
.atlas-pin-label--size-4 .atlas-pin-label-plate--t6::before {
  content: "";
  position: absolute;
  inset: -2px;
  border-radius: inherit;
  pointer-events: none;
  z-index: 0;
  padding: 2px;
  background:
    repeating-linear-gradient(
      -45deg,
      #0f6e63 0 1.5px,
      #1aa891 1.5px 4px,
      rgba(214, 189, 130, 0.85) 4px 5px,
      #12897a 5px 7px
    );
  -webkit-mask:
    linear-gradient(#fff 0 0) content-box,
    linear-gradient(#fff 0 0);
  -webkit-mask-composite: xor;
          mask-composite: exclude;
}
.atlas-pin-label--size-4 .atlas-pin-label-plate--t4 > *,
.atlas-pin-label--size-4 .atlas-pin-label-plate--t5 > *,
.atlas-pin-label--size-4 .atlas-pin-label-plate--t6 > * {
  position: relative;
  z-index: 1;
}
.atlas-pin-label--size-4 .atlas-pin-label-plate--t5 {
  /* Former T6 sapphire chrome + a slightly stronger blue wisp. */
  border: 3.5px solid #1b2c6b;
  border-top: 5px solid #3f5fd6;
  background: color-mix(in srgb, #3f5fd6 7%, rgba(255, 252, 246, 0.99));
  box-shadow:
    0 0 0 1px #d6bd82,
    0 0 0 3px #2a3f9e,
    0 0 0 5px #1b2c6b,
    0 0 0 6.5px #d6bd82,
    0 0 0 8px rgba(42, 63, 158, 0.55),
    0 4px 16px rgba(27, 44, 107, 0.42);
}
.atlas-pin-label--size-4 .atlas-pin-label-plate--t5::before {
  inset: -3px;
  padding: 3px;
  background:
    repeating-linear-gradient(
      45deg,
      #1b2c6b 0 1.5px,
      #2a3f9e 1.5px 3px,
      #d6bd82 3px 4px,
      #3f5fd6 4px 6px,
      rgba(214, 189, 130, 0.75) 6px 7px
    );
}
.atlas-pin-label--size-4 .atlas-pin-label-plate--t6 {
  /* Apex: royal-purple chrome, thicker than the former T6 sapphire. */
  border: 5px solid #3c1a5c;
  border-top: 7px solid #8a4ec8;
  background: color-mix(in srgb, #8a4ec8 7%, rgba(255, 252, 246, 0.99));
  box-shadow:
    0 0 0 1.5px #d6bd82,
    0 0 0 4px #c4a0ec,
    0 0 0 6.5px #5a2d8a,
    0 0 0 8.5px #3c1a5c,
    0 0 0 10.5px #d6bd82,
    0 0 0 13px rgba(138, 78, 200, 0.5),
    0 5px 18px rgba(60, 26, 92, 0.45);
}
.atlas-pin-label--size-4 .atlas-pin-label-plate--t6::before {
  inset: -4px;
  padding: 4px;
  background:
    repeating-linear-gradient(
      45deg,
      #3c1a5c 0 1.5px,
      #5a2d8a 1.5px 3px,
      #d6bd82 3px 4.5px,
      #8a4ec8 4.5px 7px,
      #c4a0ec 7px 8.5px
    );
}
.atlas-pin-label--size-4.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t3,
.atlas-pin-label--size-4 .atlas-pin-label-plate--t3:hover {
  box-shadow:
    0 0 0 1.5px rgba(255, 252, 246, 0.98),
    0 0 0 3px #e7cf8f,
    0 0 0 5px #c9a94f,
    0 0 0 6.5px #9b7f45,
    0 0 12px rgba(231, 207, 143, 0.6),
    0 5px 16px rgba(155, 127, 69, 0.5);
}
.atlas-pin-label--size-4.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t4,
.atlas-pin-label--size-4 .atlas-pin-label-plate--t4:hover {
  box-shadow:
    0 0 0 1px #d6bd82,
    0 0 0 3px #12897a,
    0 0 0 5px #0f6e63,
    0 0 0 6.5px rgba(214, 189, 130, 0.75),
    0 5px 16px rgba(15, 110, 99, 0.48);
}
.atlas-pin-label--size-4.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t5,
.atlas-pin-label--size-4 .atlas-pin-label-plate--t5:hover {
  box-shadow:
    0 0 0 1px #d6bd82,
    0 0 0 3px #2a3f9e,
    0 0 0 5px #1b2c6b,
    0 0 0 6.5px #d6bd82,
    0 0 0 8px rgba(42, 63, 158, 0.6),
    0 6px 18px rgba(27, 44, 107, 0.5);
}
.atlas-pin-label--size-4.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t6,
.atlas-pin-label--size-4 .atlas-pin-label-plate--t6:hover {
  box-shadow:
    0 0 0 1.5px #d6bd82,
    0 0 0 4px #c4a0ec,
    0 0 0 6.5px #5a2d8a,
    0 0 0 8.5px #3c1a5c,
    0 0 0 10.5px #d6bd82,
    0 0 0 13px rgba(138, 78, 200, 0.55),
    0 7px 20px rgba(60, 26, 92, 0.55);
}
/* Size 4 Roman tier glyph: slightly larger than G/Loc scores, tinted to match
   Size 5's tier frame vocabulary (bronze → gold → emerald → sapphire → purple).
   SIZE4-LHA-TIER-LABEL-2026-08: small italic serif "LHA Tier" sits immediately
   before the big Cormorant numeral — different typeface AND a quieter accent
   than plate body ink (#1a1206 / cream #f2ead9) or the per-tier roman color. */
.atlas-pin-label--size-4 .atlas-pin-label-tier {
  display: inline-flex;
  align-items: baseline;
  gap: 0.32em;
  font-family: var(--font-serif);
  font-size: 0.98rem;
  font-weight: 800;
  line-height: 1;
  letter-spacing: 0.03em;
  padding: 0 1px;
}
.atlas-pin-label--size-4 .atlas-pin-label-tier::before {
  content: "LHA Tier";
  font-family: Georgia, "Times New Roman", Times, serif;
  font-style: italic;
  font-weight: 500;
  font-size: 0.58rem;
  letter-spacing: 0.04em;
  line-height: 1;
  color: #8a6840;
  white-space: nowrap;
}
.atlas-pin-label--size-4 .atlas-pin-label-tier--t1 { color: #6a4f17; }
.atlas-pin-label--size-4 .atlas-pin-label-tier--t2 { color: #8f6f2e; }
.atlas-pin-label--size-4 .atlas-pin-label-tier--t3 { color: #d4a017; }
.atlas-pin-label--size-4 .atlas-pin-label-tier--t4 { color: #12897a; }
.atlas-pin-label--size-4 .atlas-pin-label-tier--t5 { color: #2a3f9e; }
.atlas-pin-label--size-4 .atlas-pin-label-tier--t6 { color: #5a2d8a; }
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-plate--t2 {
  border-top-width: 8px;
  border-top-color: #d4b56a;
  box-shadow:
    0 3px 14px rgba(0, 0, 0, 0.62),
    0 0 0 1px rgba(198, 167, 102, 0.15),
    0 -2px 0 0 color-mix(in srgb, #d4b56a 70%, transparent),
    0 -3.5px 0 0 color-mix(in srgb, #b8964e 42%, transparent);
}
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-plate--t3 {
  border-width: 2px;
  border-top-width: 3.5px;
  border-color: #c9a94f;
  border-top-color: #f0d78a;
  background: color-mix(in srgb, #e7cf8f 5.5%, rgba(44, 46, 51, 0.96));
  box-shadow:
    0 0 0 1px rgba(0, 0, 0, 0.4),
    0 0 0 2.5px #e7cf8f,
    0 0 0 4.5px #c9a94f,
    0 0 0 6px #9b7f45,
    0 0 12px rgba(231, 207, 143, 0.4),
    0 3px 12px rgba(0, 0, 0, 0.52);
}
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-plate--t4 {
  border: 3.25px solid #1ec9b0;
  border-top: 5px solid #5ef0d4;
  background: color-mix(in srgb, #2ad4b8 4.5%, rgba(44, 46, 51, 0.96));
  box-shadow:
    0 0 0 1px rgba(0, 0, 0, 0.5),
    0 0 0 2.5px #d6bd82,
    0 0 0 4.5px #2ad4b8,
    0 0 0 6.5px #12897a,
    0 0 0 8px rgba(214, 189, 130, 0.85),
    0 0 14px rgba(46, 212, 184, 0.4),
    0 3px 14px rgba(0, 0, 0, 0.58);
}
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-plate--t4::before {
  inset: -3px;
  padding: 3px;
  background:
    repeating-linear-gradient(
      -45deg,
      #1aa891 0 1.5px,
      #5ef0d4 1.5px 4px,
      #d6bd82 4px 5.5px,
      #2ad4b8 5.5px 7.5px
    );
}
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-plate--t5 {
  border: 4px solid #6b8cff;
  border-top: 6px solid #a8bcff;
  background: color-mix(in srgb, #7a96ff 7%, rgba(44, 46, 51, 0.96));
  box-shadow:
    0 0 0 1px rgba(0, 0, 0, 0.5),
    0 0 0 2.5px #d6bd82,
    0 0 0 4.5px #7a96ff,
    0 0 0 6.5px #3f5fd6,
    0 0 0 8.5px #d6bd82,
    0 0 0 10px rgba(106, 140, 255, 0.55),
    0 0 14px rgba(168, 188, 255, 0.35),
    0 4px 16px rgba(0, 0, 0, 0.62);
}
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-plate--t5::before {
  inset: -3.5px;
  padding: 3.5px;
  background:
    repeating-linear-gradient(
      45deg,
      #3f5fd6 0 1.5px,
      #7a96ff 1.5px 3px,
      #d6bd82 3px 4.5px,
      #a8bcff 4.5px 7px,
      rgba(214, 189, 130, 0.9) 7px 8px
    );
}
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-plate--t6 {
  border: 5.5px solid #b07aee;
  border-top: 8px solid #d4b8ff;
  background: color-mix(in srgb, #b07aee 7%, rgba(44, 46, 51, 0.96));
  box-shadow:
    0 0 0 1px rgba(0, 0, 0, 0.5),
    0 0 0 3px #d6bd82,
    0 0 0 5.5px #c4a0ec,
    0 0 0 8px #a06ae0,
    0 0 0 10.5px #d6bd82,
    0 0 0 13px rgba(176, 122, 238, 0.55),
    0 0 16px rgba(212, 184, 255, 0.38),
    0 5px 18px rgba(0, 0, 0, 0.64);
}
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-plate--t6::before {
  inset: -4.5px;
  padding: 4.5px;
  background:
    repeating-linear-gradient(
      45deg,
      #3c1a5c 0 1.5px,
      #a06ae0 1.5px 3px,
      #d6bd82 3px 4.5px,
      #d4b8ff 4.5px 7.5px,
      #c4a0ec 7.5px 9px
    );
}
:root[data-theme="dark"] .atlas-pin-label--size-4.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t3,
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-plate--t3:hover {
  box-shadow:
    0 0 0 1px rgba(0, 0, 0, 0.45),
    0 0 0 2.5px #e7cf8f,
    0 0 0 4.5px #c9a94f,
    0 0 0 6px #9b7f45,
    0 0 14px rgba(231, 207, 143, 0.5),
    0 5px 14px rgba(0, 0, 0, 0.58);
}
:root[data-theme="dark"] .atlas-pin-label--size-4.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t4,
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-plate--t4:hover {
  box-shadow:
    0 0 0 1px rgba(0, 0, 0, 0.55),
    0 0 0 2.5px #d6bd82,
    0 0 0 4.5px #2ad4b8,
    0 0 0 6.5px #12897a,
    0 0 0 8px rgba(214, 189, 130, 0.9),
    0 0 16px rgba(46, 212, 184, 0.5),
    0 5px 16px rgba(0, 0, 0, 0.62);
}
:root[data-theme="dark"] .atlas-pin-label--size-4.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t5,
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-plate--t5:hover {
  box-shadow:
    0 0 0 1px rgba(0, 0, 0, 0.55),
    0 0 0 2.5px #d6bd82,
    0 0 0 4.5px #7a96ff,
    0 0 0 6.5px #3f5fd6,
    0 0 0 8.5px #d6bd82,
    0 0 16px rgba(168, 188, 255, 0.45),
    0 6px 18px rgba(0, 0, 0, 0.66);
}
:root[data-theme="dark"] .atlas-pin-label--size-4.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t6,
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-plate--t6:hover {
  box-shadow:
    0 0 0 1px rgba(0, 0, 0, 0.55),
    0 0 0 3px #d6bd82,
    0 0 0 5.5px #c4a0ec,
    0 0 0 8px #a06ae0,
    0 0 0 10.5px #d6bd82,
    0 0 18px rgba(212, 184, 255, 0.48),
    0 7px 20px rgba(0, 0, 0, 0.68);
}
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-tier--t1 { color: #d4c4a0; }
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-tier--t2 { color: #d9bf82; }
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-tier--t3 { color: #f5c84a; }
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-tier--t4 { color: #5ef0d4; }
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-tier--t5 { color: #a8bcff; }
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-tier--t6 { color: #d4b8ff; }
:root[data-theme="dark"] .atlas-pin-label--size-4 .atlas-pin-label-tier::before {
  color: #c4a882;
}

/* SIZE2-3-T56-TOP-VEIL-2026-07: whisper darkening at the topmost edge of the
   prestige stripe — barely perceptible depth, not a second color.
   After the chrome shift, emerald is T4, sapphire T5, royal-purple T6.
   Size 4 T4–T6 now use Size 5-style all-sides frames instead of a top veil. */
.atlas-pin-label--size-2 .atlas-pin-label-plate--t4::after,
.atlas-pin-label--size-2 .atlas-pin-label-plate--t5::after,
.atlas-pin-label--size-2 .atlas-pin-label-plate--t6::after {
  content: "";
  position: absolute;
  left: -1.5px;
  right: -1.5px;
  top: -4.5px;
  height: 4.5px;
  border-radius: 7px 7px 0 0;
  pointer-events: none;
  z-index: 2;
  background: linear-gradient(
    to bottom,
    color-mix(in srgb, #000 16%, transparent) 0%,
    color-mix(in srgb, #000 6%, transparent) 42%,
    transparent 100%
  );
}
.atlas-pin-label--size-2 .atlas-pin-label-plate--t5::after { top: -5px; height: 5px; }
.atlas-pin-label--size-2 .atlas-pin-label-plate--t6::after { top: -6.5px; height: 6.5px; }
.atlas-pin-label--size-3 .atlas-pin-label-plate--t4::after,
.atlas-pin-label--size-3 .atlas-pin-label-plate--t5::after,
.atlas-pin-label--size-3 .atlas-pin-label-plate--t6::after {
  content: "";
  position: absolute;
  left: -1.5px;
  right: -1.5px;
  top: -9px;
  height: 9px;
  border-radius: 5px 5px 0 0;
  pointer-events: none;
  z-index: 2;
  background: linear-gradient(
    to bottom,
    color-mix(in srgb, #000 15%, transparent) 0%,
    color-mix(in srgb, #000 5%, transparent) 40%,
    transparent 100%
  );
}
.atlas-pin-label--size-3 .atlas-pin-label-plate--t5::after { top: -10px; height: 10px; }
.atlas-pin-label--size-3 .atlas-pin-label-plate--t6::after { top: -12px; height: 12px; }
:root[data-theme="dark"] .atlas-pin-label--size-2 .atlas-pin-label-plate--t4::after,
:root[data-theme="dark"] .atlas-pin-label--size-2 .atlas-pin-label-plate--t5::after,
:root[data-theme="dark"] .atlas-pin-label--size-2 .atlas-pin-label-plate--t6::after,
:root[data-theme="dark"] .atlas-pin-label--size-3 .atlas-pin-label-plate--t4::after,
:root[data-theme="dark"] .atlas-pin-label--size-3 .atlas-pin-label-plate--t5::after,
:root[data-theme="dark"] .atlas-pin-label--size-3 .atlas-pin-label-plate--t6::after {
  background: linear-gradient(
    to bottom,
    color-mix(in srgb, #000 22%, transparent) 0%,
    color-mix(in srgb, #000 8%, transparent) 40%,
    transparent 100%
  );
}

/* Size 5: +20% premium plates with tier hero + award chips */
.atlas-pin-label--size-5 .atlas-pin-label-plate {
  max-width: 276px;
  padding: 6px 13px 8px;
  border-radius: 9px;
  position: relative;
}
/* SIZE5-T2-TOP-2026-08: strong top-only bar (was 4.25px whisper). No frame. */
.atlas-pin-label--size-5 .atlas-pin-label-plate--t2 {
  border-top-width: 8.5px;
  border-top-color: #b8964e;
  box-shadow:
    0 2px 10px rgba(0, 0, 0, 0.36),
    0 0 0 2px rgba(255, 255, 255, 0.88),
    0 -2px 0 0 color-mix(in srgb, #b8964e 70%, transparent),
    0 -3.5px 0 0 color-mix(in srgb, #8f6f2e 40%, transparent);
}
/* SIZE5-TIER-FRAME-2026-07: Tiers 3–6 get progressive prestige frames that
   echo the bottom tier chip. Size 5 only — Sizes 2–3 use top-edge stripes.
   TIER-CHROME-SHIFT-2026-08: gold/emerald/sapphire each drop one tier; T6 is
   a new royal-purple apex, thicker than the former T6 sapphire. */
.atlas-pin-label--size-5 .atlas-pin-label-plate--t3 {
  /* Former T4 gold chrome. */
  border-width: 3.5px;
  border-top-width: 6px;
  border-color: #b8964e;
  border-top-color: #f0d78a;
  background: color-mix(in srgb, #e7cf8f 5%, rgba(255, 252, 246, 0.99));
  box-shadow:
    0 0 0 2px rgba(255, 252, 246, 0.95),
    0 0 0 4px #e7cf8f,
    0 0 0 7px #c9a94f,
    0 0 0 9px #9b7f45,
    0 0 10px rgba(231, 207, 143, 0.55),
    0 3px 16px rgba(155, 127, 69, 0.42);
}
.atlas-pin-label--size-5 .atlas-pin-label-plate--t4 {
  /* Former T5 emerald chrome. */
  border: 4px solid #0b5049;
  border-top: 6px solid #1aa891;
  background: color-mix(in srgb, #1aa891 3.5%, rgba(255, 252, 246, 0.99));
  box-shadow:
    0 0 0 1px #d6bd82,
    0 0 0 4px #12897a,
    0 0 0 7px #0f6e63,
    0 0 0 9px rgba(214, 189, 130, 0.7),
    0 4px 18px rgba(15, 110, 99, 0.4);
}
.atlas-pin-label--size-5 .atlas-pin-label-plate--t4::before,
.atlas-pin-label--size-5 .atlas-pin-label-plate--t5::before,
.atlas-pin-label--size-5 .atlas-pin-label-plate--t6::before {
  content: "";
  position: absolute;
  inset: -3px;
  border-radius: inherit;
  pointer-events: none;
  z-index: 0;
  padding: 3px;
  background:
    repeating-linear-gradient(
      -45deg,
      #0f6e63 0 2px,
      #1aa891 2px 5px,
      rgba(214, 189, 130, 0.85) 5px 6px,
      #12897a 6px 9px
    );
  -webkit-mask:
    linear-gradient(#fff 0 0) content-box,
    linear-gradient(#fff 0 0);
  -webkit-mask-composite: xor;
          mask-composite: exclude;
}
.atlas-pin-label--size-5 .atlas-pin-label-plate--t4 > *,
.atlas-pin-label--size-5 .atlas-pin-label-plate--t5 > *,
.atlas-pin-label--size-5 .atlas-pin-label-plate--t6 > * {
  position: relative;
  z-index: 1;
}
.atlas-pin-label--size-5 .atlas-pin-label-plate--t5 {
  /* Former T6 sapphire chrome + a slightly stronger blue wisp. */
  border: 5px solid #1b2c6b;
  border-top: 7px solid #3f5fd6;
  background: color-mix(in srgb, #3f5fd6 7%, rgba(255, 252, 246, 0.99));
  box-shadow:
    0 0 0 1px #d6bd82,
    0 0 0 4px #2a3f9e,
    0 0 0 7px #1b2c6b,
    0 0 0 9px #d6bd82,
    0 0 0 11px rgba(42, 63, 158, 0.55),
    0 5px 20px rgba(27, 44, 107, 0.45);
}
.atlas-pin-label--size-5 .atlas-pin-label-plate--t5::before {
  inset: -4px;
  padding: 4px;
  background:
    repeating-linear-gradient(
      45deg,
      #1b2c6b 0 2px,
      #2a3f9e 2px 4px,
      #d6bd82 4px 5px,
      #3f5fd6 5px 8px,
      rgba(214, 189, 130, 0.75) 8px 9px
    );
}
.atlas-pin-label--size-5 .atlas-pin-label-plate--t6 {
  /* Apex: royal-purple chrome — thickest/fanciest so far. Dual-purple hatch
     plus gold metallic rim, matching gold/emerald/sapphire chrome language. */
  border: 6.5px solid #3c1a5c;
  border-top: 9px solid #8a4ec8;
  background: color-mix(in srgb, #8a4ec8 7%, rgba(255, 252, 246, 0.99));
  box-shadow:
    0 0 0 1.5px #d6bd82,
    0 0 0 5px #c4a0ec,
    0 0 0 8.5px #5a2d8a,
    0 0 0 11.5px #3c1a5c,
    0 0 0 14px #d6bd82,
    0 0 0 17px rgba(138, 78, 200, 0.5),
    0 6px 22px rgba(60, 26, 92, 0.48);
}
.atlas-pin-label--size-5 .atlas-pin-label-plate--t6::before {
  inset: -5.5px;
  padding: 5.5px;
  background:
    repeating-linear-gradient(
      45deg,
      #3c1a5c 0 2px,
      #5a2d8a 2px 4.5px,
      #d6bd82 4.5px 6px,
      #8a4ec8 6px 10px,
      #c4a0ec 10px 12px
    );
}
/* SIZE5-DARK-TIER-SCALE-2026-07: on dark plaques + gray Voyager map, keep T3
   bright gold, T4 emerald, T5 sapphire, and give T6 a heavier royal-purple
   frame so apex still out-prestiges sapphire. */
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-plate--t2 {
  border-top-width: 8.5px;
  border-top-color: #d4b56a;
  box-shadow:
    0 3px 14px rgba(0, 0, 0, 0.55),
    0 0 0 1px rgba(198, 167, 102, 0.16),
    0 -2px 0 0 color-mix(in srgb, #d4b56a 70%, transparent),
    0 -3.5px 0 0 color-mix(in srgb, #b8964e 42%, transparent);
}
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-plate--t3 {
  border-width: 3px;
  border-top-width: 5px;
  border-color: #c9a94f;
  border-top-color: #f0d78a;
  background: color-mix(in srgb, #e7cf8f 5.5%, rgba(44, 46, 51, 0.96));
  box-shadow:
    0 0 0 1px rgba(0, 0, 0, 0.4),
    0 0 0 3px #e7cf8f,
    0 0 0 6px #c9a94f,
    0 0 0 8px #9b7f45,
    0 0 14px rgba(231, 207, 143, 0.45),
    0 3px 14px rgba(0, 0, 0, 0.55);
}
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-plate--t4 {
  border: 4.5px solid #1ec9b0;
  border-top: 7px solid #5ef0d4;
  background: color-mix(in srgb, #2ad4b8 4.5%, rgba(44, 46, 51, 0.96));
  box-shadow:
    0 0 0 1px rgba(0, 0, 0, 0.5),
    0 0 0 3px #d6bd82,
    0 0 0 6px #2ad4b8,
    0 0 0 9px #12897a,
    0 0 0 11px rgba(214, 189, 130, 0.85),
    0 0 16px rgba(46, 212, 184, 0.45),
    0 4px 18px rgba(0, 0, 0, 0.6);
}
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-plate--t4::before {
  inset: -4px;
  padding: 4px;
  background:
    repeating-linear-gradient(
      -45deg,
      #1aa891 0 2px,
      #5ef0d4 2px 5px,
      #d6bd82 5px 7px,
      #2ad4b8 7px 10px
    );
}
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-plate--t5 {
  border: 5.5px solid #6b8cff;
  border-top: 8px solid #a8bcff;
  background: color-mix(in srgb, #7a96ff 7%, rgba(44, 46, 51, 0.96));
  box-shadow:
    0 0 0 1px rgba(0, 0, 0, 0.5),
    0 0 0 3px #d6bd82,
    0 0 0 6px #7a96ff,
    0 0 0 9px #3f5fd6,
    0 0 0 12px #d6bd82,
    0 0 0 14px rgba(106, 140, 255, 0.55),
    0 0 18px rgba(168, 188, 255, 0.4),
    0 5px 20px rgba(0, 0, 0, 0.65);
}
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-plate--t5::before {
  inset: -5px;
  padding: 5px;
  background:
    repeating-linear-gradient(
      45deg,
      #3f5fd6 0 2px,
      #7a96ff 2px 4px,
      #d6bd82 4px 6px,
      #a8bcff 6px 9px,
      rgba(214, 189, 130, 0.9) 9px 10px
    );
}
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-plate--t6 {
  border: 7px solid #b07aee;
  border-top: 10px solid #d4b8ff;
  background: color-mix(in srgb, #b07aee 7%, rgba(44, 46, 51, 0.96));
  box-shadow:
    0 0 0 1.5px rgba(0, 0, 0, 0.5),
    0 0 0 4px #d6bd82,
    0 0 0 7.5px #c4a0ec,
    0 0 0 11px #a06ae0,
    0 0 0 14.5px #d6bd82,
    0 0 0 17.5px rgba(176, 122, 238, 0.55),
    0 0 20px rgba(212, 184, 255, 0.42),
    0 6px 22px rgba(0, 0, 0, 0.68);
}
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-plate--t6::before {
  inset: -6.5px;
  padding: 6.5px;
  background:
    repeating-linear-gradient(
      45deg,
      #3c1a5c 0 2px,
      #a06ae0 2px 4.5px,
      #d6bd82 4.5px 6.5px,
      #d4b8ff 6.5px 11px,
      #c4a0ec 11px 13px
    );
}
/* Keep prestige frames on hover (generic plate:hover would flatten them). */
.atlas-pin-label--size-5.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t3,
.atlas-pin-label--size-5 .atlas-pin-label-plate--t3:hover {
  box-shadow:
    0 0 0 2px rgba(255, 252, 246, 0.98),
    0 0 0 4px #e7cf8f,
    0 0 0 7px #c9a94f,
    0 0 0 9px #9b7f45,
    0 0 14px rgba(231, 207, 143, 0.65),
    0 6px 18px rgba(155, 127, 69, 0.55);
}
.atlas-pin-label--size-5.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t4,
.atlas-pin-label--size-5 .atlas-pin-label-plate--t4:hover {
  box-shadow:
    0 0 0 1px #d6bd82,
    0 0 0 4px #12897a,
    0 0 0 7px #0f6e63,
    0 0 0 9px rgba(214, 189, 130, 0.75),
    0 6px 20px rgba(15, 110, 99, 0.5);
}
.atlas-pin-label--size-5.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t5,
.atlas-pin-label--size-5 .atlas-pin-label-plate--t5:hover {
  box-shadow:
    0 0 0 1px #d6bd82,
    0 0 0 4px #2a3f9e,
    0 0 0 7px #1b2c6b,
    0 0 0 9px #d6bd82,
    0 0 0 11px rgba(42, 63, 158, 0.6),
    0 7px 22px rgba(27, 44, 107, 0.55);
}
.atlas-pin-label--size-5.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t6,
.atlas-pin-label--size-5 .atlas-pin-label-plate--t6:hover {
  box-shadow:
    0 0 0 1.5px #d6bd82,
    0 0 0 5px #c4a0ec,
    0 0 0 8.5px #5a2d8a,
    0 0 0 11.5px #3c1a5c,
    0 0 0 14px #d6bd82,
    0 0 0 17px rgba(138, 78, 200, 0.55),
    0 8px 24px rgba(60, 26, 92, 0.58);
}
:root[data-theme="dark"] .atlas-pin-label--size-5.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t3,
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-plate--t3:hover {
  box-shadow:
    0 0 0 1px rgba(0, 0, 0, 0.45),
    0 0 0 3px #e7cf8f,
    0 0 0 6px #c9a94f,
    0 0 0 8px #9b7f45,
    0 0 16px rgba(231, 207, 143, 0.55),
    0 5px 16px rgba(0, 0, 0, 0.6);
}
:root[data-theme="dark"] .atlas-pin-label--size-5.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t4,
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-plate--t4:hover {
  box-shadow:
    0 0 0 1px rgba(0, 0, 0, 0.55),
    0 0 0 3px #d6bd82,
    0 0 0 6px #2ad4b8,
    0 0 0 9px #12897a,
    0 0 0 11px rgba(214, 189, 130, 0.9),
    0 0 18px rgba(46, 212, 184, 0.55),
    0 6px 20px rgba(0, 0, 0, 0.65);
}
:root[data-theme="dark"] .atlas-pin-label--size-5.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t5,
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-plate--t5:hover {
  box-shadow:
    0 0 0 1px rgba(0, 0, 0, 0.55),
    0 0 0 3px #d6bd82,
    0 0 0 6px #7a96ff,
    0 0 0 9px #3f5fd6,
    0 0 0 12px #d6bd82,
    0 0 20px rgba(168, 188, 255, 0.5),
    0 6px 22px rgba(0, 0, 0, 0.7);
}
:root[data-theme="dark"] .atlas-pin-label--size-5.leaflet-tooltip.is-map-label-hover .atlas-pin-label-plate--t6,
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-plate--t6:hover {
  box-shadow:
    0 0 0 1.5px rgba(0, 0, 0, 0.55),
    0 0 0 4px #d6bd82,
    0 0 0 7.5px #c4a0ec,
    0 0 0 11px #a06ae0,
    0 0 0 14.5px #d6bd82,
    0 0 22px rgba(212, 184, 255, 0.5),
    0 7px 24px rgba(0, 0, 0, 0.72);
}
/* SIZE5-TIER-CORNER-2026: the old huge "tier hero" block above the name is gone.
   The tier now rides in a small badge centered along the BOTTOM of the box.
   Prestige is signalled by color (see the per-tier rules below): Tier 1 quietly
   blends into the plate; Tier 5 / 6 glow "like a peacock". Size 5 only. */
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner-row {
  display: flex;
  justify-content: center;
  margin-top: 6px;
}
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  /* Symmetric padding so the label is perfectly balanced inside the chip. */
  padding: 5px 10px;
  border-radius: 7px;
  /* Base look = quiet, matches the plate (this IS the Tier 1 treatment). */
  background: transparent;
  border: 1px solid color-mix(in srgb, #6a4f17 26%, transparent);
  transition: background 0.16s ease, box-shadow 0.16s ease;
}
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner-roman {
  font-family: var(--font-serif);
  font-weight: 800;
  font-size: 1rem;
  line-height: 1;
  color: #4a360c;
  letter-spacing: 0.03em;
}
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner-label {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.56rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: #5c4a22;
  /* line-height:1 + flex centering keeps the uppercase caps optically centered
     rather than "riding high" inside the chip. */
  line-height: 1;
  display: block;
  text-align: center;
  white-space: nowrap;
}
/* --- Per-tier prestige coloring (Size 5 ONLY) ------------------------------
   Tier 1 — no color: blends into the plate, "nothing special".
   Tier 2–4 — progressively warmer / more present.
   Tier 5–6 — elegant but unmistakable "peacock" jewel tones with a soft glow. */
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t1 {
  background: transparent;
  border-color: color-mix(in srgb, #6a4f17 22%, transparent);
}
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t2 {
  background: color-mix(in srgb, #c6a766 16%, transparent);
  border-color: color-mix(in srgb, #c6a766 45%, transparent);
}
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t3 {
  background: linear-gradient(180deg, #e7cf8f, #c9a94f);
  border-color: #9b7f45;
  box-shadow: 0 1px 4px rgba(155, 127, 69, 0.4);
}
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t3 .atlas-pin-label-tiercorner-roman,
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t3 .atlas-pin-label-tiercorner-label {
  color: #3a2a08;
}
/* Tier 4 — emerald-teal peacock jewel (former T5) */
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t4 {
  background: linear-gradient(135deg, #0f6e63 0%, #12897a 55%, #1aa891 100%);
  border-color: #0b5049;
  box-shadow:
    0 1px 5px rgba(15, 110, 99, 0.5),
    0 0 0 1px rgba(214, 189, 130, 0.55),
    0 0 12px rgba(26, 168, 145, 0.42);
}
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t4 .atlas-pin-label-tiercorner-roman,
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t4 .atlas-pin-label-tiercorner-label {
  color: #f4efe0;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35);
}
/* Tier 5 — sapphire-royal peacock jewel with a gold rim (former T6) */
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t5 {
  background: linear-gradient(135deg, #1b2c6b 0%, #2a3f9e 50%, #3f5fd6 100%);
  border-color: #d6bd82;
  box-shadow:
    0 1px 6px rgba(27, 44, 107, 0.55),
    0 0 0 1.5px rgba(214, 189, 130, 0.8),
    0 0 16px rgba(63, 95, 214, 0.5);
}
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t5 .atlas-pin-label-tiercorner-roman,
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t5 .atlas-pin-label-tiercorner-label {
  color: #f6f1e4;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
}
/* Tier 6 — royal-purple apex peacock jewel with gold rim */
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t6 {
  background: linear-gradient(135deg, #3c1a5c 0%, #5a2d8a 45%, #8a4ec8 100%);
  border-color: #d6bd82;
  box-shadow:
    0 1px 7px rgba(60, 26, 92, 0.6),
    0 0 0 1.5px rgba(214, 189, 130, 0.85),
    0 0 18px rgba(138, 78, 200, 0.52);
}
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t6 .atlas-pin-label-tiercorner-roman,
.atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t6 .atlas-pin-label-tiercorner-label {
  color: #f6f1e4;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
}
.atlas-pin-label--size-5 .atlas-pin-label-awards {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 4px;
  /* SIZE5-NAME-AWARD-GAP-2026-07: clear descenders (g/y) + hover underline. */
  margin: 9px 0 5px;
  max-width: 100%;
}
.atlas-pin-label--size-5 .atlas-pin-label-awards .award-chip {
  transform: scale(0.85);
  transform-origin: center center;
}
.atlas-pin-label--size-5 .atlas-pin-label-name {
  font-size: 1.44rem;
  line-height: 1.22;
  padding-bottom: 2px;
}
.atlas-pin-label--size-5.is-map-label-hover .atlas-pin-label-name,
.atlas-pin-label--size-5 .atlas-pin-label-plate:hover .atlas-pin-label-name,
.atlas-pin-label--size-5 .atlas-pin-label-plate:focus-visible .atlas-pin-label-name {
  text-underline-offset: 4px;
}
.atlas-pin-label--size-5 .atlas-pin-label-meta { font-size: 0.82rem; }
.atlas-pin-label--size-5 .atlas-pin-label-stats { gap: 9px; margin-top: 5px; }
.atlas-pin-label--size-5 .atlas-pin-label-price { font-size: 1.05rem; }
/* Dark theme: Tier 1–2 badges sit on the night plate, so their ink must be light.
   Tier 3–6 carry their own bright fills + light (or dark-on-gold) ink already. */
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-tiercorner-roman { color: #f2ead9; }
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-tiercorner-label { color: #d4c4a0; }
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t1 {
  border-color: color-mix(in srgb, #d9bf82 26%, transparent);
}
:root[data-theme="dark"] .atlas-pin-label--size-5 .atlas-pin-label-tiercorner--t2 {
  background: color-mix(in srgb, #d9bf82 14%, transparent);
  border-color: color-mix(in srgb, #d9bf82 40%, transparent);
}
/* Size 1–2 dock: bottom-center Size 5 plate */
.map-plaque-dock {
  position: absolute;
  left: 50%;
  bottom: 28px;
  transform: translateX(-50%);
  /* Below hotel modal (z-index 200) so the dock fades under the backdrop. */
  z-index: 40;
  width: min(calc(100% - 32px), 320px);
  pointer-events: none;
}
.map-plaque-dock[hidden] { display: none !important; }
.map-plaque-dock__close {
  position: absolute;
  top: -10px;
  right: -6px;
  z-index: 2;
  pointer-events: auto;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: 1px solid color-mix(in srgb, var(--gold) 65%, transparent);
  background: color-mix(in srgb, var(--surface) 92%, transparent);
  color: var(--text);
  font-size: 1.1rem;
  line-height: 1;
  cursor: pointer;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.22);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
}
.map-plaque-dock__inner {
  pointer-events: auto;
}
/* DOCK-SIZE5-2026-07: dock wraps a Size 5 premium plate (buildPinLabel premium).
   Fill dock width; keep flat (no hover scale — already the selection). */
.map-plaque-dock__inner .atlas-pin-label {
  display: block;
  width: 100%;
}
.map-plaque-dock__inner .atlas-pin-label--hotel .atlas-pin-label-plate {
  display: block;
  max-width: none;
  width: 100%;
  cursor: pointer;
  transform: none;
  padding: 9px 15px 11px;
}
/* Generic dock shadow only when there is no Size 5 prestige frame to preserve. */
.map-plaque-dock__inner .atlas-pin-label--hotel .atlas-pin-label-plate:not([class*="plate--t"]) {
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.38), 0 0 0 2px rgba(255, 255, 255, 0.88);
}
/* Keep it flat + calm inside the dock — no lift-on-hover (it is the selection). */
.map-plaque-dock__inner .atlas-pin-label--hotel .atlas-pin-label-plate:hover {
  transform: none;
}
/* Don't flatten Size 5 tier prestige frames with a generic gold dock border. */
:root[data-theme="dark"] .map-plaque-dock__inner .atlas-pin-label--size-5 .atlas-pin-label-plate:not([class*="plate--t"]) {
  background: rgba(30, 27, 22, 0.98);
  border: 1.5px solid #c6a766;
  color: #f2ead9;
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.55), 0 0 0 2px rgba(0, 0, 0, 0.35);
}
:root[data-theme="dark"] .map-plaque-dock__inner .atlas-pin-label--size-5 .atlas-pin-label-plate[class*="plate--t"] {
  color: #f2ead9;
}
:root[data-theme="dark"] .map-plaque-dock__inner .atlas-pin-label-name { color: #f2ead9; }
:root[data-theme="dark"] .map-plaque-dock__inner .atlas-pin-label-meta { color: #cfc6b3; }
:root[data-theme="dark"] .map-plaque-dock__inner .atlas-pin-label-price,
:root[data-theme="dark"] .map-plaque-dock__inner .atlas-pin-label-score,
:root[data-theme="dark"] .map-plaque-dock__inner .atlas-pin-label-score-num { color: #f2ead9; }

/* ---- POI-LABEL-BOX-2026 (2026-06-07): always-on POI label boxes ----------
   The user wanted the easy-to-miss POI dots replaced by always-on boxes "in a
   very similar style to the property boxes" yet IMMEDIATELY distinct from them
   AND distinct per category, with NO photos in the auto-box.

   Shared anatomy: a high-readability warm-white plate (same MAP-TEXT-READABLE-
   2026 recipe as hotel labels so it reads on the bright tiles in both themes),
   but laid out as a horizontal pill with a colored "glyph chip" on the LEFT +
   a colored left rail. That left-rail + glyph-chip silhouette is what makes a
   POI box instantly tell-apart from the centered, serif, gold hotel name plate.

   Per-category identity: each category sets its own --poi-color (below). The
   chip fills with that color and the plate gets a matching left rail, so a
   museum box (ochre ▲) never looks like a theater box (plum ♠) or a bar (●).
   Photos are NOT here — MAP-POI-NOCLICK-2026: labels are display-only. */
.atlas-poi-label.leaflet-tooltip {
  --poi-color: #3d6b8c;                    /* overridden per category below */
  display: flex;
  align-items: center;
  gap: 7px;
  z-index: 540;
  /* Category-tinted POI plates — deliberately NOT the hotel warm-white/gold plate. */
  background: linear-gradient(
    135deg,
    color-mix(in srgb, var(--poi-color) 58%, rgba(248, 246, 252, 0.97)),
    color-mix(in srgb, var(--poi-color) 32%, rgba(252, 250, 248, 0.95))
  );
  border: 1.5px solid color-mix(in srgb, var(--poi-color) 78%, #1a2030);
  border-left: 6px solid var(--poi-color); /* colored rail = category at a glance */
  border-radius: 6px;
  box-shadow:
    inset 0 0 0 1px rgba(255,255,255,0.55),
    0 2px 8px rgba(0,0,0,0.34),
    0 0 0 2px color-mix(in srgb, var(--poi-color) 24%, transparent);
  padding: 4px 9px 4px 7px;
  max-width: 210px;
  width: max-content;
  text-align: left;
  color: #1a1206;
  pointer-events: none;
  cursor: default;
  /* POI-LABEL-ZOOM-GATE-2026 (2026-06-07): like the hotel plates, the POI boxes
     must NOT all paint at world/region zoom — hundreds of them would stack into
     an unreadable pile (and the dots they sit on aren't distinguishable at that
     scale anyway). Reuse the SAME zoom gate as the hotel labels (the existing
     body.atlas-pin-labels-on class, toggled at zoom >= 11), so POI boxes only
     appear once the user is zoomed to a city where individual places matter.
     Below that, the small category dots alone mark the layer. */
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.18s ease;
}
body.atlas-pin-labels-on .atlas-poi-label.leaflet-tooltip {
  opacity: 1;
  visibility: visible;
}
.atlas-poi-label.leaflet-tooltip::before { display: none !important; }
.atlas-poi-label .atlas-poi-label-chip {
  flex: 0 0 auto;
  width: 22px; height: 22px;
  border-radius: 6px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--poi-color);
  color: #fff;
  font-size: 0.8rem;
  line-height: 1;
  box-shadow: inset 0 0 0 1.5px rgba(255,255,255,0.55);
  text-shadow: 0 1px 1px rgba(0,0,0,0.35);
}
.atlas-poi-label .atlas-poi-label-body {
  display: flex;
  flex-direction: column;
  min-width: 0;
}
.atlas-poi-label .atlas-poi-label-name {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.84rem;            /* sans, compact — not hotel serif */
  line-height: 1.12;
  color: #1a1206;
  white-space: normal;
  overflow-wrap: break-word;
}
.atlas-poi-label .atlas-poi-label-plate {
  display: flex;
  align-items: center;
  gap: 7px;
  min-width: 0;
  cursor: default;
}
.atlas-poi-label .atlas-poi-label-cat {
  margin-top: 1px;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 0.66rem;
  letter-spacing: 0.02em;
  color: color-mix(in srgb, var(--poi-color) 62%, #2a2012); /* category-tinted but dark */
}
.atlas-poi-label .atlas-poi-label-rating {
  color: color-mix(in srgb, var(--poi-color) 72%, #1a1206);
  font-weight: 700;
}
/* Per-category color tokens — mirror MAP_LAYERS in app.js (same hex values).
   Selectors MUST include .leaflet-tooltip so they beat the base --poi-color rule. */
.atlas-poi-label.leaflet-tooltip.atlas-poi-label--airports    { --poi-color: #2563eb; }
.atlas-poi-label.leaflet-tooltip.atlas-poi-label--stadiums    { --poi-color: #15803d; }
.atlas-poi-label.leaflet-tooltip.atlas-poi-label--museums     { --poi-color: #c2410c; }
.atlas-poi-label.leaflet-tooltip.atlas-poi-label--theaters    { --poi-color: #a21caf; }
.atlas-poi-label.leaflet-tooltip.atlas-poi-label--restaurants { --poi-color: #b91c1c; }
.atlas-poi-label.leaflet-tooltip.atlas-poi-label--bars        { --poi-color: #6d28d9; }
.atlas-poi-label.leaflet-tooltip.atlas-poi-label--religion    { --poi-color: #854d0e; }
.atlas-poi-label.leaflet-tooltip.atlas-poi-label--landmarks   { --poi-color: #0d9488; }
.atlas-poi-label--religion .atlas-poi-label-chip { font-size: 0.72rem; letter-spacing: -0.02em; }
.atlas-poi-label--landmarks .atlas-poi-label-chip { font-size: 0.76rem; }

/* ---- Leaflet zoom control: re-skinned to the era palette ----------------- */
.map-container .leaflet-control-zoom a {
  background: color-mix(in srgb, var(--surface) 94%, transparent);
  color: var(--gold);
  border: 1px solid var(--border-strong, var(--gold));
  font-weight: 700;
  -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
  transition: background 0.15s ease, color 0.15s ease;
}
.map-container .leaflet-control-zoom a:hover {
  background: var(--gold); color: var(--bg-sunken, #fff);
}
.map-container .leaflet-bar { border: none; box-shadow: 0 2px 10px rgba(0,0,0,0.22); }

/* ---- Attribution: quiet, on-palette (kept legible per OSM/CARTO terms) ---- */
.map-container .leaflet-control-attribution {
  background: color-mix(in srgb, var(--surface) 80%, transparent);
  color: var(--text-muted);
  font-size: 0.66rem;
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
}
.map-container .leaflet-control-attribution a { color: var(--gold); }
/* Desktop Map Mode: keep OSM/CARTO credit inside the gold frame and out from
   under the TIERS panel. Centered along the bottom inset — no magic
   `margin-right` that would rot when the chip row grows. Phone keeps Leaflet's
   default corner (see MOBILE-IPHONE-2026). */
@media (min-width: 700px) {
  body.is-map-mode .map-view .map-container .leaflet-bottom.leaflet-right {
    right: auto;
    left: 50%;
    transform: translateX(-50%);
    bottom: var(--map-frame-inset, 14px);
    max-width: calc(100% - 2 * var(--map-frame-inset, 14px));
  }
}

/* ============================================================ */
/* The Legend — re-imagined as an editorial "Index" card.       */
/* Mirrors the home page: eyebrow kicker, gold hairline,        */
/* era display font. POI categories become a tidy index list.   */
/* ============================================================ */
.map-container .map-layer-panel {
  top: 14px; left: 14px;
  max-width: min(248px, calc(100% - 28px));
  padding: 0;
  background: color-mix(in srgb, var(--surface) 90%, transparent);
  -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  border: 1px solid color-mix(in srgb, var(--gold) 38%, transparent);
  border-radius: 4px;
  box-shadow: 0 10px 30px rgba(0,0,0,0.26);
  overflow: hidden;
}
/* Gold hairline crowning the panel, like the context bar rule. */
.map-container .map-layer-panel::before {
  content: "";
  display: block;
  height: 2px;
  background: linear-gradient(90deg, var(--rule-gold), color-mix(in srgb, var(--rule-gold) 30%, transparent));
}
.map-container .map-layer-panel-title {
  font-family: var(--font-display);
  font-size: 0.62rem;
  letter-spacing: var(--eyebrow-spacing, 0.3em);
  text-transform: uppercase;
  color: var(--gold);
  margin: 0;
  padding: 11px 14px 4px;
}
/* A second line: the era-font "Points of Interest" heading. */
.map-container .map-layer-panel-title::after {
  content: "Points of Interest";
  display: block;
  margin-top: 3px;
  font-family: var(--font-wordmark, var(--font-display));
  font-size: 0.98rem;
  letter-spacing: 0.01em;
  text-transform: none;
  color: var(--text);
}
.map-container .map-layer-toggles {
  display: flex; flex-direction: column;
  gap: 0;
  padding: 4px 6px 8px;
}
/* Each category is an index ROW (not a pill) for a refined directory feel. */
.map-container .map-layer-chip {
  width: 100%;
  justify-content: flex-start;
  gap: 9px;
  padding: 7px 9px;
  background: transparent;
  border: none;
  border-radius: 3px;
  font-family: var(--font-body, var(--font-display));
  font-size: 0.8rem;
  font-weight: 500;
  color: var(--text-muted);
  transition: background 0.14s ease, color 0.14s ease;
}
.map-container .map-layer-chip:hover {
  background: color-mix(in srgb, var(--gold) 12%, transparent);
  color: var(--text);
}
/* The category gem: a small filled disc holding the glyph. */
.map-container .map-layer-chip-dot {
  width: 18px; height: 18px;
  border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--layer-color);
  color: #fff;
  font-size: 0.6rem;
  line-height: 1;
  box-shadow: inset 0 0 0 1.5px color-mix(in srgb, #fff 55%, transparent);
  flex: 0 0 auto;
}
.map-container .map-layer-chip-label { flex: 1 1 auto; text-align: left; }
/* Count: a quiet tabular number on the right, gold when active. */
.map-container .map-layer-chip-count {
  font-variant-numeric: tabular-nums;
  font-size: 0.7rem; font-weight: 700;
  color: var(--gold);
  background: transparent;
  padding: 0; min-width: 0;
}
.map-container .map-layer-chip-count:empty { display: none; }
/* ON state: the row brightens, the gem gets a gold ring, text goes full ink. */
.map-container .map-layer-chip.is-on {
  background: color-mix(in srgb, var(--gold) 14%, transparent);
  color: var(--text);
  font-weight: 600;
}
.map-container .map-layer-chip.is-on .map-layer-chip-dot {
  box-shadow: inset 0 0 0 1.5px #fff,
              0 0 0 2px color-mix(in srgb, var(--gold) 70%, transparent);
}
.map-container .map-layer-chip.is-on .map-layer-chip-count {
  color: var(--gold-bright, var(--gold));
}

/* ============================================================ */
/* Popups — editorial cards matching the home page.             */
/* ============================================================ */
.map-container .leaflet-popup-content-wrapper {
  background: var(--surface);
  color: var(--text);
  border: 1px solid color-mix(in srgb, var(--gold) 34%, transparent);
  border-radius: 5px;
  box-shadow: 0 12px 34px rgba(0,0,0,0.34);
}
.map-container .leaflet-popup-tip {
  background: var(--surface);
  border: 1px solid color-mix(in srgb, var(--gold) 34%, transparent);
}
.map-container .leaflet-popup-content { margin: 0; }
.map-container .atlas-map-popup { padding: 12px 14px 13px; min-width: 150px; }
/* Gold eyebrow rule atop each popup. */
.map-container .atlas-map-popup::before {
  content: "";
  display: block;
  width: 26px; height: 2px;
  background: var(--rule-gold, var(--gold));
  margin-bottom: 8px;
}
.map-container .atlas-map-popup-name {
  font-family: var(--font-wordmark, var(--font-display));
  font-weight: 600;
  font-size: 1.02rem;
  line-height: 1.18;
  color: var(--text);
  margin-bottom: 3px;
}
.map-container .atlas-map-popup-meta {
  color: var(--text-muted);
  font-size: 0.78rem;
  letter-spacing: 0.01em;
}
.map-container .atlas-map-popup-link {
  margin-top: 9px;
  font-family: var(--font-display);
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  text-decoration: none;
  color: var(--gold);
  border-bottom: 1px solid color-mix(in srgb, var(--gold) 50%, transparent);
  padding-bottom: 1px;
}
.map-container .atlas-map-popup-link:hover {
  color: var(--gold-bright); border-bottom-color: var(--gold-bright);
}
/* POI popup photos keep their look but pick up the era radius/border. */
.map-container .atlas-poi-popup-thumb,
.map-container .atlas-poi-popup-gallery { border-radius: 4px; }
.map-container .leaflet-popup-close-button { color: var(--text-muted); }
.map-container .leaflet-popup-close-button:hover { color: var(--gold); }

/* ---- Mobile: the index card slims to a compact strip ---------------------- */
@media (max-width: 560px) {
  .map-container .map-layer-panel {
    top: 10px; left: 10px; right: 10px;
    max-width: none;
  }
  .map-container .map-layer-toggles {
    flex-direction: row; flex-wrap: wrap;
    gap: 4px; padding: 6px;
  }
  .map-container .map-layer-chip { width: auto; padding: 5px 8px; }
  .map-container .map-layer-chip-label { flex: 0 0 auto; }
}

/* ============================================================================ */
/* ===== MAP-V2-2026 — END ===== */
/* ============================================================================ */

/* ============================================================================ */
/* ===== MAP-FRAME-2026: second header bar + painting-mount map frame   ===== */
/* =====   Two additions, fully reversible (delete this block to revert): ===== */
/* =====   (1) #mapControlBar — a styled SECOND HEADER BAR below the main ===== */
/* =====       header carrying the POI legend / context toggles, with     ===== */
/* =====       per-era corner art.                                        ===== */
/* =====   (2) .map-mount / .map-mount-frame — a decorative passe-partout  ===== */
/* =====       + ornamental frame the map canvas is inset within, so the   ===== */
/* =====       map never runs edge-to-edge and the rendered side ornaments ===== */
/* =====       stay visible in the wide-screen gutters. Every color reads   ===== */
/* =====       the active era×theme tokens, so all 8 looks stay on-palette. ===== */
/* ============================================================================ */

/* ---- The Map-Mode view wrapper -------------------------------------------- */
/* In Card Mode it's hidden via [hidden]; in Map Mode JS clears that. It lives
   inside .results (already capped to --max-w and centered), so the whole map
   surface sits in the content column and the side ornaments show in gutters. */
.map-view { display: block; }
.map-view[hidden] { display: none; }
body.is-map-mode .map-view {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 0;
  height: auto !important;
}

/* Floating POI selector (MAP-POI-DROPDOWN-2026) */
.map-poi-anchor {
  position: absolute;
  top: 12px;
  right: 12px;
  z-index: 12;
}
.map-poi-button {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 14px;
  border-radius: 999px;
  border: 1.5px solid color-mix(in srgb, var(--gold) 55%, transparent);
  background: rgba(252, 250, 245, 0.96);
  color: #1a1206;
  font-family: var(--font-body, var(--font-display));
  font-size: 0.8125rem;
  font-weight: 700;
  letter-spacing: 0.03em;
  cursor: pointer;
  box-shadow: 0 4px 16px rgba(0,0,0,0.18);
  transition: background 0.15s, border-color 0.15s, box-shadow 0.15s;
}
.map-poi-button:hover,
.map-poi-button[aria-expanded="true"] {
  background: var(--gold);
  color: var(--bg-sunken);
  border-color: var(--gold);
}
.map-poi-button-chev { transition: transform 0.15s; }
.map-poi-button[aria-expanded="true"] .map-poi-button-chev { transform: rotate(180deg); }
.map-poi-dropdown {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  min-width: min(92vw, 420px);
  max-width: 480px;
  padding: 12px 14px 14px;
  border-radius: var(--radius-md);
  border: 1px solid color-mix(in srgb, var(--gold) 40%, transparent);
  background: rgba(252, 250, 245, 0.98);
  box-shadow: 0 12px 36px rgba(0,0,0,0.22);
  color: #1a1206;
}
.map-poi-dropdown-head {
  margin-bottom: 10px;
  padding-bottom: 8px;
  border-bottom: 1px solid color-mix(in srgb, var(--gold) 28%, transparent);
}
.map-poi-dropdown-eyebrow {
  display: block;
  font-size: 0.58rem;
  font-weight: 700;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: #6a4f17;
}
.map-poi-dropdown-title {
  display: block;
  font-family: var(--font-display);
  font-size: 1rem;
  font-weight: 600;
  color: #1a1206;
}
.map-poi-dropdown .map-layer-toggles {
  display: flex;
  flex-direction: column;
  gap: 7px;
}
.map-poi-dropdown .map-layer-chip {
  width: 100%;
  justify-content: flex-start;
}

/* Dark theme: POI dropdown matches charcoal UI (light cream panel unchanged). */
:root[data-theme="dark"] .map-poi-button {
  background: color-mix(in srgb, var(--surface) 92%, transparent);
  color: var(--text);
  border-color: color-mix(in srgb, var(--gold) 48%, transparent);
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.38);
}
:root[data-theme="dark"] .map-poi-button:hover,
:root[data-theme="dark"] .map-poi-button[aria-expanded="true"] {
  background: var(--gold);
  color: var(--bg-sunken);
  border-color: var(--gold);
}
:root[data-theme="dark"] .map-poi-dropdown {
  background: color-mix(in srgb, var(--bg-elevated) 97%, transparent);
  border-color: color-mix(in srgb, var(--gold) 32%, transparent);
  box-shadow: 0 12px 36px rgba(0, 0, 0, 0.48);
  color: var(--text);
}
:root[data-theme="dark"] .map-poi-dropdown-head {
  border-bottom-color: color-mix(in srgb, var(--gold) 22%, transparent);
}
:root[data-theme="dark"] .map-poi-dropdown-eyebrow {
  color: var(--gold-bright);
}
:root[data-theme="dark"] .map-poi-dropdown-title {
  color: var(--text);
}
:root[data-theme="dark"] .map-poi-dropdown .map-layer-chip {
  background: color-mix(in srgb, var(--bg-sunken) 78%, transparent);
  border-color: color-mix(in srgb, var(--text-muted) 32%, transparent);
  color: var(--text-muted);
}
:root[data-theme="dark"] .map-poi-dropdown .map-layer-chip:hover {
  background: color-mix(in srgb, var(--layer-color) 16%, var(--surface));
  border-color: color-mix(in srgb, var(--layer-color) 55%, var(--gold));
  color: var(--text);
}

/* Legacy control bar — removed from markup; keep selectors harmless if cached. */
#mapControlBar { display: none !important; }

/* The old floating context-layer panel becomes a transparent inline wrapper
   now that it lives inside the dropdown. Neutralize all of its v1/v2
   floating-card styling (absolute position, blur, border, shadow, padding). */
.map-view .map-layer-panel,
.map-control-bar .map-layer-panel,
.map-poi-dropdown .map-layer-panel {
  position: static;
  top: auto; left: auto; right: auto;
  max-width: none;
  margin: 0; padding: 0;
  background: none;
  -webkit-backdrop-filter: none; backdrop-filter: none;
  border: none;
  border-radius: 0;
  box-shadow: none;
  overflow: visible;
}
.map-view .map-layer-panel::before { content: none; display: none; }

/* ============================================================ */
/* (1) THE SECOND HEADER BAR — #mapControlBar                   */
/* ============================================================ */
.map-control-bar {
  position: relative;
  display: flex;
  align-items: center;
  width: 100%;
  margin: 10px auto 0;
  padding: 9px clamp(16px, 4vw, 54px);
  background:
    linear-gradient(180deg,
      color-mix(in srgb, var(--surface) 96%, transparent),
      color-mix(in srgb, var(--bg-sunken, var(--surface)) 90%, transparent));
  border: 1px solid color-mix(in srgb, var(--gold) 34%, transparent);
  border-radius: var(--radius-md);
  box-shadow: 0 4px 18px rgba(0,0,0,0.10),
              inset 0 1px 0 color-mix(in srgb, #fff 22%, transparent);
  overflow: hidden;
}
/* Gold hairline crowning the bar (echoes the home-page context rule). */
.map-control-bar::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 2px;
  background: linear-gradient(90deg,
    transparent,
    var(--rule-gold) 18%,
    var(--gold-bright, var(--rule-gold)) 50%,
    var(--rule-gold) 82%,
    transparent);
  opacity: 0.85;
}
/* Per-era corner art flourishes flanking the bar (pure CSS, era-specific
   below). They sit absolutely in the bar's left/right ends. */
.map-control-bar-art {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 30px; height: 30px;
  pointer-events: none;
  opacity: 0.9;
}
.map-control-bar-art--left  { left: 14px; }
.map-control-bar-art--right { right: 14px; }

.map-control-bar-inner {
  position: relative;
  z-index: 1;
  display: flex;
  align-items: center;
  gap: clamp(12px, 2.4vw, 30px);
  flex-wrap: wrap;
  width: 100%;
}
/* The legend lead-in: eyebrow kicker + era-font heading, like the home page. */
.map-control-bar-lead {
  display: flex;
  flex-direction: column;
  gap: 1px;
  flex: 0 0 auto;
  padding-right: clamp(10px, 2vw, 22px);
  border-right: 1px solid color-mix(in srgb, var(--gold) 24%, transparent);
}
.map-control-bar-eyebrow {
  font-family: var(--font-display);
  font-size: 0.6rem;
  font-weight: 700;
  letter-spacing: var(--eyebrow-spacing, 0.3em);
  text-transform: uppercase;
  color: var(--gold);
  line-height: 1;
}
.map-control-bar-heading {
  font-family: var(--font-wordmark, var(--font-display));
  font-size: 1.02rem;
  font-weight: 600;
  letter-spacing: 0.01em;
  color: var(--text);
  line-height: 1.1;
  white-space: nowrap;
}

/* The chips now flow HORIZONTALLY across the bar as a row of pills. */
.map-control-bar .map-layer-toggles {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  gap: 7px;
  flex: 1 1 auto;
}
/* LEGEND-REDESIGN-2026 (2026-06-07): the previous legend was nearly impossible
   to read for state — ON differed from OFF only by a faint gold wash, the same
   for every category, so you couldn't tell which POI flags were active. The
   redesign makes the ON/OFF state UNMISTAKABLE and self-explaining:
     • OFF  = quiet outlined pill, muted text, a DESATURATED/dim category dot,
              and a hollow ring marker (○) on the right — clearly "not on".
     • ON   = the chip FILLS with the category's OWN color (white text), a
              bright white-ringed dot, and a filled CHECK (✓) marker — it reads
              as a pressed, lit, color-coded button. State is conveyed by fill
              + shape + check, never color alone (a11y).
   Each chip is also a touch larger for easier reading/tapping. */
.map-control-bar .map-layer-chip,
.map-poi-dropdown .map-layer-chip {
  width: auto;
  justify-content: center;
  gap: 8px;
  padding: 7px 13px;
  background: color-mix(in srgb, var(--surface) 72%, transparent);
  border: 1.5px solid color-mix(in srgb, var(--text-muted) 40%, transparent);
  border-radius: 999px;
  font-family: var(--font-body, var(--font-display));
  font-size: 0.84rem;
  font-weight: 600;
  color: var(--text-muted);
  transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease,
              box-shadow 0.15s ease;
}
.map-poi-dropdown .map-layer-chip {
  width: 100%;
  justify-content: flex-start;
  color: #3a342c;
}
.map-control-bar .map-layer-chip:hover,
.map-poi-dropdown .map-layer-chip:hover {
  background: color-mix(in srgb, var(--layer-color) 14%, var(--surface));
  border-color: color-mix(in srgb, var(--layer-color) 80%, var(--gold));
  color: var(--text);
}
.map-control-bar .map-layer-chip-dot,
.map-poi-dropdown .map-layer-chip-dot {
  width: 17px; height: 17px;
  border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  /* OFF: a dim, desaturated category dot so inactive flags read as "asleep". */
  background: color-mix(in srgb, var(--layer-color) 55%, #8a8a8a);
  color: #fff;
  font-size: 0.58rem;
  line-height: 1;
  box-shadow: inset 0 0 0 1.4px color-mix(in srgb, #fff 40%, transparent);
  flex: 0 0 auto;
  opacity: 0.72;
  transition: opacity 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;
}
.map-control-bar .map-layer-chip-label,
.map-poi-dropdown .map-layer-chip-label { flex: 0 0 auto; text-align: left; }
.map-control-bar .map-layer-chip-count,
.map-poi-dropdown .map-layer-chip-count {
  font-variant-numeric: tabular-nums;
  font-size: 0.7rem; font-weight: 800;
  color: var(--gold);
  background: transparent;
  padding: 0 0 0 1px; min-width: 0;
}
.map-control-bar .map-layer-chip-count:empty,
.map-poi-dropdown .map-layer-chip-count:empty { display: none; }
/* The ON/OFF state marker: a small disc to the right of the chip. */
.map-control-bar .map-layer-chip-state,
.map-poi-dropdown .map-layer-chip-state {
  flex: 0 0 auto;
  width: 16px; height: 16px;
  border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 0.66rem;
  font-weight: 900;
  line-height: 1;
  /* OFF: hollow ring. */
  border: 1.6px solid currentColor;
  color: color-mix(in srgb, var(--text-muted) 75%, transparent);
  background: transparent;
}
.map-control-bar .map-layer-chip-state::before,
.map-poi-dropdown .map-layer-chip-state::before { content: ""; } /* OFF = empty ring */

/* ===== ON state: filled with the category's OWN color ===== */
.map-control-bar .map-layer-chip.is-on,
.map-poi-dropdown .map-layer-chip.is-on {
  background: var(--layer-color);
  border-color: color-mix(in srgb, var(--layer-color) 60%, #000);
  color: #fff;
  font-weight: 700;
  box-shadow: 0 1px 6px color-mix(in srgb, var(--layer-color) 45%, transparent),
              inset 0 0 0 1px rgba(255,255,255,0.25);
}
.map-control-bar .map-layer-chip.is-on:hover,
.map-poi-dropdown .map-layer-chip.is-on:hover {
  background: color-mix(in srgb, var(--layer-color) 88%, #000);
  color: #fff;
}
.map-control-bar .map-layer-chip.is-on .map-layer-chip-dot,
.map-poi-dropdown .map-layer-chip.is-on .map-layer-chip-dot {
  opacity: 1;
  background: rgba(255,255,255,0.18);
  box-shadow: inset 0 0 0 1.6px #fff;
}
.map-control-bar .map-layer-chip.is-on .map-layer-chip-count,
.map-poi-dropdown .map-layer-chip.is-on .map-layer-chip-count {
  color: #fff;
}
/* ON: the marker fills white with a colored check. */
.map-control-bar .map-layer-chip.is-on .map-layer-chip-state,
.map-poi-dropdown .map-layer-chip.is-on .map-layer-chip-state {
  background: #fff;
  border-color: #fff;
  color: var(--layer-color);
}
.map-control-bar .map-layer-chip.is-on .map-layer-chip-state::before,
.map-poi-dropdown .map-layer-chip.is-on .map-layer-chip-state::before {
  content: "\2713"; /* check mark */
}

/* ============================================================ */
/* (2) THE PAINTING MOUNT + FRAMED MAP CANVAS                   */
/* ============================================================ */
/* .map-mount is the passe-partout "mat": a slightly inset panel in the era
   surface tone that the framed map floats within. .map-mount-frame is the
   ornamental frame proper; #mapContainer (the live Leaflet canvas) sits inside
   it. Height math mirrors the prior map sizing minus the bar + mat insets. */
body.is-map-mode .map-mount {
  position: relative;
  width: 100%;
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 0;
  margin: 0;
  padding: clamp(8px, 1.1vw, 14px);
  background:
    linear-gradient(180deg,
      color-mix(in srgb, var(--bg-sunken, var(--surface)) 70%, var(--surface)),
      color-mix(in srgb, var(--bg-sunken, var(--surface)) 92%, transparent));
  border-radius: var(--radius-lg);
  box-shadow:
    0 10px 34px rgba(0,0,0,0.12),
    inset 0 1px 0 color-mix(in srgb, #fff 24%, transparent);
  box-sizing: border-box;
}
.map-mount {
  position: relative;
  width: 100%;
}
.map-mount-frame {
  position: relative;
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
  border-radius: var(--radius-md);
  /* The frame: a warm gold double-line by default; eras refine it below. */
  /* THICKEN-BORDERS-2026 — owner wanted the classic frame back but THICKER.
     Base gold rule 2px -> 4px; inner gold band pushed from 4px to 7px and
     given a touch more weight so the whole frame reads as a substantial,
     balanced border (not the previous near-hairline). Belle Epoque inherits
     this base (its override only sets radius), so the owner's favorite era
     gets the thicker treatment too. Outer halo 1px -> 2px. */
  border: 4px solid var(--gold);
  box-shadow:
    0 0 0 2px color-mix(in srgb, var(--gold-deep, var(--gold)) 60%, transparent),
    inset 0 0 0 4px var(--surface),
    inset 0 0 0 7px color-mix(in srgb, var(--gold) 48%, transparent),
    inset 0 0 26px color-mix(in srgb, var(--gold-deep, #000) 16%, transparent);
  overflow: hidden;
  /* Shared overlay inset, measured from this frame's inner padding box (the
     map pane inside the 4px gold border — NOT the viewport). 14px is the
     BOX SIZE gap that already clears the 7–10px inner gold band. TIERS,
     BOX SIZE, and Leaflet attribution all consume these tokens so a 6th
     chip or a thicker era frame cannot resurrect a magic `right:`. */
  --map-frame-inset: 14px;
  --map-frame-inset-bottom: var(--map-frame-inset);
}
/* The map canvas fills the frame; its own border is dropped (the frame owns
   the edge now). Height = viewport minus header, the second control bar, and
   the mat/frame insets so the BOTTOM frame + corners stay on-screen.
   NOTE: scoped with body.is-map-mode to beat the legacy
   `body.is-map-mode .map-container` sizing rules (specificity tie-breaker). */
body.is-map-mode .map-view .map-container {
  position: relative;
  flex: 1 1 auto;
  width: 100%;
  height: auto !important;
  min-height: 0;
  border: none !important;
  border-radius: calc(var(--radius-md) - 2px);
  margin: 0;
  background: #e8e0d4;
}
:root[data-theme="dark"] body.is-map-mode .map-view .map-container {
  background: var(--bg-sunken);
}

/* ---- Ornamental corner pieces (pure CSS) --------------------------------- */
/* Four L-shaped gold corner brackets that read as a picture-frame's corners.
   Era variants below restyle them (Deco steps, BE curves, etc.). */
.map-corner {
  position: absolute;
  z-index: 3;
  width: 26px; height: 26px;
  pointer-events: none;
  border-style: solid;
  border-color: var(--gold);
  border-width: 0;
  opacity: 0.92;
}
.map-corner--tl { top: 5px;    left: 5px;    border-top-width: 2px; border-left-width: 2px;  border-top-left-radius: 4px; }
.map-corner--tr { top: 5px;    right: 5px;   border-top-width: 2px; border-right-width: 2px; border-top-right-radius: 4px; }
.map-corner--bl { bottom: 5px; left: 5px;    border-bottom-width: 2px; border-left-width: 2px;  border-bottom-left-radius: 4px; }
.map-corner--br { bottom: 5px; right: 5px;   border-bottom-width: 2px; border-right-width: 2px; border-bottom-right-radius: 4px; }

/* ============================================================ */
/* THICKEN-BORDERS-2026 — The custom-art decorative border layer  */
/* (MAP-BORDER-ART-2026: .map-border-layer / .map-border /        */
/* .map-border-accent + per-era AVIF art) was archived at owner   */
/* request and removed from here. We returned to the classic CSS  */
/* passe-partout frame below, with THICKER frame rules (see the    */
/* THICKEN-BORDERS-2026 markers in the per-era frame section). The */
/* full removed feature — art, raw originals, build script, and    */
/* the exact CSS/HTML/JS — is preserved verbatim in               */
/* art/_archive/mapborders-decorative-MAP-BORDER-ART-2026/ along   */
/* with a step-by-step restore recipe.                            */
/* ============================================================ */

/* ============================================================ */
/* PER-ERA FRAME + BAR-ART TREATMENTS (all 4 eras)             */
/* ============================================================ */

/* ---- BELLE ÉPOQUE: soft, romantic. Rounder frame, curved corner flourishes,
   warm double-rule. The bar-art is a small filigree lozenge. ---- */
:root[data-era="belleepoque"] .map-mount { border-radius: 16px; }
:root[data-era="belleepoque"] .map-mount-frame { border-radius: 11px; }
:root[data-era="belleepoque"] .map-corner {
  width: 30px; height: 30px; border-width: 0;
}
:root[data-era="belleepoque"] .map-corner--tl { border-top-width: 2px; border-left-width: 2px; border-top-left-radius: 16px; }
:root[data-era="belleepoque"] .map-corner--tr { border-top-width: 2px; border-right-width: 2px; border-top-right-radius: 16px; }
:root[data-era="belleepoque"] .map-corner--bl { border-bottom-width: 2px; border-left-width: 2px; border-bottom-left-radius: 16px; }
:root[data-era="belleepoque"] .map-corner--br { border-bottom-width: 2px; border-right-width: 2px; border-bottom-right-radius: 16px; }
:root[data-era="belleepoque"] .map-control-bar-art {
  border-radius: 50%;
  background:
    radial-gradient(circle at 50% 50%, color-mix(in srgb, var(--gold) 70%, transparent) 0 2px, transparent 3px),
    conic-gradient(from 0deg, transparent 0 18deg, color-mix(in srgb, var(--gold) 55%, transparent) 19deg 21deg, transparent 22deg 88deg, color-mix(in srgb, var(--gold) 55%, transparent) 89deg 91deg, transparent 92deg 178deg, color-mix(in srgb, var(--gold) 55%, transparent) 179deg 181deg, transparent 182deg 268deg, color-mix(in srgb, var(--gold) 55%, transparent) 269deg 271deg, transparent 272deg);
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--gold) 40%, transparent);
}

/* ---- ART DECO: crisp, geometric. Stepped corner brackets + a tight double
   line. The bar-art is a sunburst-fan quarter. ---- */
:root[data-era="artdeco"] .map-mount { border-radius: 3px; }
:root[data-era="artdeco"] .map-mount-frame {
  border-radius: 2px;
  /* THICKEN-BORDERS-2026 — Deco's crisp double-line, made bolder. Outer rule
     2px -> 4px; the layered inner double-line band widened (gold lines at
     5px & 10px, surface gaps at 3px/8px) so it stays a true geometric
     double-frame but with more presence. */
  border-width: 4px;
  box-shadow:
    0 0 0 2px color-mix(in srgb, var(--gold-deep, var(--gold)) 65%, transparent),
    inset 0 0 0 3px var(--surface),
    inset 0 0 0 5px var(--gold),
    inset 0 0 0 8px var(--surface),
    inset 0 0 0 10px color-mix(in srgb, var(--gold) 60%, transparent);
}
:root[data-era="artdeco"] .map-corner {
  width: 22px; height: 22px;
  border-radius: 0 !important;
  border-width: 0;
}
/* Stepped Deco bracket via layered box-shadows on a small square. */
:root[data-era="artdeco"] .map-corner::before {
  content: "";
  position: absolute;
  width: 14px; height: 14px;
  border: 2px solid var(--gold);
}
:root[data-era="artdeco"] .map-corner--tl::before { top: 0; left: 0; border-right: none; border-bottom: none; }
:root[data-era="artdeco"] .map-corner--tr::before { top: 0; right: 0; border-left: none; border-bottom: none; }
:root[data-era="artdeco"] .map-corner--bl::before { bottom: 0; left: 0; border-right: none; border-top: none; }
:root[data-era="artdeco"] .map-corner--br::before { bottom: 0; right: 0; border-left: none; border-top: none; }
:root[data-era="artdeco"] .map-control-bar-art {
  background:
    conic-gradient(from 200deg at 50% 80%,
      transparent 0 8deg,
      color-mix(in srgb, var(--gold) 60%, transparent) 9deg 11deg,
      transparent 12deg 28deg,
      color-mix(in srgb, var(--gold) 60%, transparent) 29deg 31deg,
      transparent 32deg 48deg,
      color-mix(in srgb, var(--gold) 60%, transparent) 49deg 51deg,
      transparent 52deg 68deg,
      color-mix(in srgb, var(--gold) 60%, transparent) 69deg 71deg,
      transparent 72deg);
}

/* ---- MID-CENTURY: clean, optimistic. Thin single-line frame, small atomic
   corner dots, slight rounding. The bar-art is an atomic starburst. ---- */
:root[data-era="midcentury"] .map-mount { border-radius: 8px; }
:root[data-era="midcentury"] .map-mount-frame {
  border-radius: 6px;
  /* THICKEN-BORDERS-2026 — the clean single-line frame, given real weight.
     Outer rule 1.5px -> 3.5px; inner gold band pushed to 6px (and a little
     more saturated) so the optimistic single line reads as a confident
     border rather than a thin keyline. */
  border-width: 3.5px;
  box-shadow:
    0 0 0 2px color-mix(in srgb, var(--gold-deep, var(--gold)) 50%, transparent),
    inset 0 0 0 3px var(--surface),
    inset 0 0 0 6px color-mix(in srgb, var(--gold) 44%, transparent);
}
:root[data-era="midcentury"] .map-corner { width: 20px; height: 20px; }
/* Add a small jade/gold atomic dot at each corner. */
:root[data-era="midcentury"] .map-corner::after {
  content: "";
  position: absolute;
  width: 5px; height: 5px;
  border-radius: 50%;
  background: var(--gold);
}
:root[data-era="midcentury"] .map-corner--tl::after { top: -1px; left: -1px; }
:root[data-era="midcentury"] .map-corner--tr::after { top: -1px; right: -1px; }
:root[data-era="midcentury"] .map-corner--bl::after { bottom: -1px; left: -1px; }
:root[data-era="midcentury"] .map-corner--br::after { bottom: -1px; right: -1px; }
:root[data-era="midcentury"] .map-control-bar-art {
  background:
    radial-gradient(circle at 50% 50%, var(--gold) 0 2px, transparent 3px),
    conic-gradient(from 0deg,
      var(--gold) 0 1.5deg, transparent 1.5deg 43.5deg,
      var(--gold) 43.5deg 46.5deg, transparent 46.5deg 88.5deg,
      var(--gold) 88.5deg 91.5deg, transparent 91.5deg 133.5deg,
      var(--gold) 133.5deg 136.5deg, transparent 136.5deg 178.5deg,
      var(--gold) 178.5deg 181.5deg, transparent 181.5deg 223.5deg,
      var(--gold) 223.5deg 226.5deg, transparent 226.5deg 268.5deg,
      var(--gold) 268.5deg 271.5deg, transparent 271.5deg 313.5deg,
      var(--gold) 313.5deg 316.5deg, transparent 316.5deg);
  -webkit-mask: radial-gradient(circle at 50% 50%, #000 0 14px, transparent 15px);
  mask: radial-gradient(circle at 50% 50%, #000 0 14px, transparent 15px);
  opacity: 0.85;
}

/* ---- EDITORIAL: Swiss restraint. A single crisp hairline frame, true-square
   corners, minimal corner ticks, no flourish. The bar-art is a quiet tick. ---- */
:root[data-era="editorial"] .map-mount {
  border-radius: 2px;
  background: color-mix(in srgb, var(--bg-sunken, var(--surface)) 60%, var(--surface));
  box-shadow: 0 6px 22px rgba(0,0,0,0.10);
}
:root[data-era="editorial"] .map-mount-frame {
  border-radius: 1px;
  /* THICKEN-BORDERS-2026 — still the most restrained era, but the hairline
     was too thin once the others bulked up. Rule 1px -> 2.5px and the inner
     keyline given a hair more weight (5px -> 6px, 30% -> 42%) so it reads as
     a deliberate Swiss rule, not an accidental 1px line. Stays the quietest
     of the four. */
  border-width: 2.5px;
  box-shadow:
    0 0 0 1px color-mix(in srgb, var(--gold-deep, var(--gold)) 35%, transparent),
    inset 0 0 0 4px var(--surface),
    inset 0 0 0 6px color-mix(in srgb, var(--gold) 42%, transparent);
}
:root[data-era="editorial"] .map-corner {
  width: 16px; height: 16px;
  border-radius: 0 !important;
  opacity: 0.7;
}
:root[data-era="editorial"] .map-corner--tl,
:root[data-era="editorial"] .map-corner--tr,
:root[data-era="editorial"] .map-corner--bl,
:root[data-era="editorial"] .map-corner--br { border-radius: 0 !important; }
:root[data-era="editorial"] .map-control-bar-art {
  width: 2px; height: 18px;
  background: color-mix(in srgb, var(--gold) 60%, transparent);
  opacity: 0.8;
}
/* Editorial bar gets squared corners + the quietest gold. */
:root[data-era="editorial"] .map-control-bar { border-radius: 2px; }

/* ============================================================ */
/* RESPONSIVE — phones & small tablets                          */
/* The owner said the phone matters less; here we keep it clean: */
/* the bar wraps and scrolls its chips, the heavy frame thins.   */
/* ============================================================ */
@media (max-width: 760px) {
  .map-control-bar {
    margin-top: 6px;
    padding: 7px 12px;
    flex-direction: column;
    align-items: stretch;
  }
  .map-control-bar-art { display: none; }
  .map-control-bar-lead {
    flex-direction: row;
    align-items: baseline;
    gap: 8px;
    padding-right: 0;
    padding-bottom: 6px;
    border-right: none;
    border-bottom: 1px solid color-mix(in srgb, var(--gold) 22%, transparent);
    margin-bottom: 6px;
  }
  .map-control-bar .map-layer-toggles {
    flex-wrap: nowrap;
    overflow-x: auto;
    padding-bottom: 2px;
    -webkit-overflow-scrolling: touch;
  }
  .map-control-bar .map-layer-chip { flex: 0 0 auto; }
  .map-mount {
    margin-top: 6px;
    padding: 5px;
    border-radius: 4px;
  }
  .map-mount-frame { border-width: 1px; }
  .map-corner { width: 14px; height: 14px; }
  body.is-map-mode .results {
    padding-left: max(var(--map-edge-pad, 24px), 16px);
    padding-right: max(var(--map-edge-pad, 24px), 16px);
  }
  .map-poi-dropdown { min-width: min(96vw, 360px); }
}

/* Wide desktops: same gutter math as above — no low cap that clips filigrees. */
@media (min-width: 1500px) {
  body.is-map-mode .results {
    padding-left: max(var(--map-edge-pad, 24px), calc((100vw - var(--max-w)) / 2 + var(--map-edge-pad, 24px)));
    padding-right: max(var(--map-edge-pad, 24px), calc((100vw - var(--max-w)) / 2 + var(--map-edge-pad, 24px)));
  }
}

/* prefers-reduced-motion: nothing here animates heavily, but keep chip
   transitions tame. */
@media (prefers-reduced-motion: reduce) {
  .map-control-bar .map-layer-chip { transition: none; }
}

/* ============================================================================ */
/* ===== MAP-FRAME-2026 — END ===== */
/* ============================================================================ */

/* ============================================================================ */
/* ===== MAP-MINI-2026 — START =====                                           */
/* Modal "Neighborhood" mini-map + clickable address, plus the semi-transparent */
/* "Back" button that appears after jumping from the modal into Map Mode.       */
/* Self-contained / reversible. Reuses the era gold tokens so it recolors with  */
/* every era and light/dark theme automatically.                               */
/* ============================================================================ */

/* ---- Mini-map block (first thing inside "The Neighborhood") ---------------- */
.mini-map-block {
  display: flex;
  flex-direction: column;
  gap: var(--space-2, 8px);
  margin: 0 0 var(--space-4, 16px);
}

/* Clickable address line — gold accent, behaves like a link/button. */
.mini-map-addr {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  text-align: left;
  background: none;
  border: none;
  border-bottom: 1px solid var(--rule-gold, var(--gold));
  padding: 0 0 8px;
  margin: 0;
  cursor: pointer;
  color: var(--text);
  font: inherit;
  line-height: 1.4;
  transition: color 0.16s ease, border-color 0.16s ease;
}
.mini-map-addr:hover,
.mini-map-addr:focus-visible {
  color: var(--gold-bright);
  border-color: var(--gold-bright);
}
.mini-map-addr:focus-visible { outline: 2px solid var(--gold); outline-offset: 3px; }
.mini-map-addr-pin { color: var(--gold); flex-shrink: 0; }
.mini-map-addr-text {
  font-size: 0.92rem;
  letter-spacing: 0.01em;
}

/* The map shell is itself a click target (preview, not a pan toy). */
.mini-map-shell {
  position: relative;
  width: 100%;
  height: 200px;
  border-radius: 8px;
  overflow: hidden;
  cursor: pointer;
  border: 1px solid var(--rule-gold, var(--gold));
  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.12);
  background: #f2f2f2;
  transition: box-shadow 0.18s ease, transform 0.18s ease;
}
.mini-map-shell:hover { box-shadow: 0 4px 18px rgba(0, 0, 0, 0.2); }
.mini-map-shell:focus-visible { outline: 2px solid var(--gold); outline-offset: 2px; }
.mini-map-canvas {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}
/* Disable Leaflet's own grab cursor so the whole shell reads as a button. */
.mini-map-canvas,
.mini-map-canvas .leaflet-container { cursor: pointer !important; }

/* "View on full map" hint pinned bottom-right, above the attribution. */
.mini-map-hint {
  position: absolute;
  right: 8px;
  bottom: 8px;
  z-index: 5;
  padding: 4px 10px;
  border-radius: 999px;
  font-size: 0.72rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--text);
  background: color-mix(in srgb, var(--bg-sunken) 78%, transparent);
  border: 1px solid var(--rule-gold, var(--gold));
  backdrop-filter: blur(6px);
  pointer-events: none;
  transition: opacity 0.18s ease;
}
.mini-map-shell:hover .mini-map-hint { color: var(--gold-bright); }
/* Keep the mini-map's attribution legible but unobtrusive. */
.mini-map-canvas .leaflet-control-attribution {
  font-size: 9px;
  background: color-mix(in srgb, var(--bg-sunken) 70%, transparent);
}

/* ---- Semi-transparent "Back" button (top-left of framed map) ---------------- */
.map-back-button {
  position: absolute;
  top: 12px;
  left: 12px;
  /* Below hotel modal (z-index 200); above map tiles / POI (z-index 12). */
  z-index: 40;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 7px 14px 7px 11px;
  border-radius: 999px;
  cursor: pointer;
  font: inherit;
  font-size: 0.84rem;
  letter-spacing: 0.02em;
  color: var(--text);
  background: color-mix(in srgb, var(--bg-sunken) 62%, transparent);
  border: 1px solid var(--rule-gold, var(--gold));
  backdrop-filter: blur(10px);
  box-shadow: 0 2px 14px rgba(0, 0, 0, 0.18);
  /* enter/leave animation */
  opacity: 0;
  transform: translateX(-8px);
  transition: opacity 0.22s ease, transform 0.22s ease,
              color 0.16s ease, border-color 0.16s ease, background 0.16s ease;
}
.map-back-button[hidden] { display: none; }
.map-back-button.is-visible {
  opacity: 1;
  transform: translateX(0);
}
.map-back-button:hover,
.map-back-button:focus-visible {
  color: var(--gold-bright);
  border-color: var(--gold-bright);
  background: color-mix(in srgb, var(--bg-sunken) 80%, transparent);
}
.map-back-button:focus-visible { outline: 2px solid var(--gold); outline-offset: 2px; }
.map-back-arrow { color: var(--gold); flex-shrink: 0; }
.map-back-button:hover .map-back-arrow,
.map-back-button:focus-visible .map-back-arrow { color: var(--gold-bright); }

/* Desktop: stack Back above Leaflet +/- — never overlap the zoom control. */
body.is-map-mode .map-container .leaflet-top.leaflet-left {
  top: 12px;
  left: 12px;
  transition: top 0.22s ease;
}
.map-mount-frame:has(.map-back-button.is-visible) .map-back-button {
  border-radius: 8px;
  padding: 6px 12px 6px 10px;
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.22);
}
.map-mount-frame:has(.map-back-button.is-visible) .map-container .leaflet-top.leaflet-left {
  /* Back pill (~32px) + 12px top inset + 8px gap */
  top: 52px;
}

.map-mount-frame:has(.map-back-button.is-visible) .map-container .leaflet-top.leaflet-left {
  /* Back pill (~32px) + 12px top inset + 8px gap */
  top: 52px;
}

/* ---- MAP-PLAQUE-SIZE-2026: Apple-style bottom-left density stepper -------- */
.map-plaque-size-control {
  position: absolute;
  left: var(--map-frame-inset, 14px);
  bottom: var(--map-frame-inset-bottom, 14px);
  /* Must stay below .modal-backdrop (z-index 200). A high z-index here made
     the stepper paint on top of the hotel modal and stay clickable. */
  z-index: 40;
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 8px 10px 9px;
  border-radius: 14px;
  border: 1px solid color-mix(in srgb, var(--gold) 42%, transparent);
  background: color-mix(in srgb, var(--surface) 78%, transparent);
  backdrop-filter: blur(20px) saturate(1.35);
  -webkit-backdrop-filter: blur(20px) saturate(1.35);
  box-shadow:
    0 4px 18px rgba(0, 0, 0, 0.18),
    inset 0 1px 0 rgba(255, 255, 255, 0.35);
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", var(--font-body), system-ui, sans-serif;
  outline: none;
  transition: opacity 0.22s ease, visibility 0.22s ease;
}
/* Hotel modal open: fade map chrome with the rest of Map Mode (not clickable). */
body.hotel-modal-open .map-plaque-size-control,
body.hotel-modal-open .map-poi-anchor,
body.hotel-modal-open .map-plaque-dock,
body.hotel-modal-open .map-back-button {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}
.map-plaque-size-control[hidden] { display: none !important; }
.map-plaque-size-control:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 2px;
}
.map-plaque-size-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
}
.map-plaque-size-label {
  font-size: 0.62rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--text) 72%, var(--text-muted));
}
.map-plaque-size-dots {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}
.map-plaque-size-dot {
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: color-mix(in srgb, var(--text-muted) 45%, transparent);
  transition: transform 0.14s ease, background 0.14s ease;
}
.map-plaque-size-dot.is-active {
  background: var(--gold);
  transform: scale(1.35);
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--gold) 40%, transparent);
}
.map-plaque-size-stepper {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0;
  border-radius: 999px;
  overflow: hidden;
  border: 1px solid color-mix(in srgb, var(--border-strong, var(--gold)) 55%, transparent);
  background: color-mix(in srgb, var(--bg-sunken) 55%, transparent);
}
.map-plaque-size-btn {
  flex: 0 0 36px;
  height: 32px;
  border: none;
  background: transparent;
  color: var(--gold);
  font-size: 1.15rem;
  font-weight: 500;
  line-height: 1;
  cursor: pointer;
  transition: background 0.14s ease, color 0.14s ease, transform 0.1s ease;
}
.map-plaque-size-btn:hover:not(:disabled) {
  background: color-mix(in srgb, var(--gold) 14%, transparent);
  color: var(--gold-bright);
}
.map-plaque-size-btn:active:not(:disabled) { transform: scale(0.94); }
.map-plaque-size-btn:disabled {
  opacity: 0.28;
  cursor: default;
}
.map-plaque-size-num {
  flex: 0 0 28px;
  text-align: center;
  font-size: 0.92rem;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--text);
  border-left: 1px solid color-mix(in srgb, var(--border) 80%, transparent);
  border-right: 1px solid color-mix(in srgb, var(--border) 80%, transparent);
  line-height: 32px;
}
:root[data-era="belleepoque"] .map-plaque-size-control { border-radius: 16px; }
:root[data-era="artdeco"] .map-plaque-size-control { border-radius: 8px; }
:root[data-era="midcentury"] .map-plaque-size-control { border-radius: 12px; }

/* MAP-TIER-TINT-2026-09: carry the tier signal into each plaque surface while
   keeping the dark ink and cream base that make the labels readable.  The
   selector covers every map plaque size; larger plaques retain their existing
   tier-specific frames and top rails. */
:root[data-theme="light"] .atlas-pin-label--hotel .atlas-pin-label-plate--t4 {
  background: color-mix(in srgb, #1aa891 7%, rgba(255, 252, 246, 0.99));
}
:root[data-theme="light"] .atlas-pin-label--hotel .atlas-pin-label-plate--t5 {
  background: color-mix(in srgb, #3f5fd6 10%, rgba(255, 252, 246, 0.99));
}
:root[data-theme="light"] .atlas-pin-label--hotel .atlas-pin-label-plate--t6 {
  background: color-mix(in srgb, #8a4ec8 10%, rgba(255, 252, 246, 0.99));
}
:root[data-theme="dark"] .atlas-pin-label--hotel .atlas-pin-label-plate--t4 {
  background: color-mix(in srgb, #2ad4b8 8%, rgba(44, 46, 51, 0.96));
}
:root[data-theme="dark"] .atlas-pin-label--hotel .atlas-pin-label-plate--t5 {
  background: color-mix(in srgb, #7a96ff 10%, rgba(44, 46, 51, 0.96));
}
:root[data-theme="dark"] .atlas-pin-label--hotel .atlas-pin-label-plate--t6 {
  background: color-mix(in srgb, #b07aee 10%, rgba(44, 46, 51, 0.96));
}

/* ---- MAP-TIER-TOGGLE-2026: bottom-right LHA Tier visibility panel ---------
   Same chrome language as .map-plaque-size-control (opposite corner). Six
   chips, Tier I–VI; clicking one hides that tier's pins/pegs/boxes from Map
   Mode only (see renderMapPins() in app.js). Owner spec: simple, not showy —
   flat borders only, no box-shadow prestige rings. Each chip's border mirrors
   the real .atlas-pin-label-plate--tN treatment for that tier AT THE CURRENT
   Box Size: Tier 1 never gets a tier border (matches "blends in" reality);
   Tier 2 is a top-only stripe at every size; Tiers 3–6 are a top-only stripe
   at Box Size 2–3 and a full all-sides frame at Box Size 4–5. Border classes
   are swapped by _updateMapTierToggleUI() in app.js whenever Box Size changes. */
.map-tier-toggle-control {
  position: absolute;
  /* THIS HAS REGRESSED TWICE. Do NOT position TIERS with a magic `right: 12px`
     (or 14px, or 24px) that ignores frame inset + control width.
     Round 1: `right: 14px` matching BOX SIZE — Firefox shrink-to-fit sized the
     abspos flex column to the "TIERS" label; the I–VI row overflowed into
     `.map-mount-frame { overflow: hidden }` and the gold frame ate chip VI.
     Round 2: bumped to `right: 24px` + `max-width: calc(100% - 38px)` — still a
     magic offset, still not `width: max-content`, still clipped when T6's
     purple frame made the row wider. LAST TIME: inset is `--map-frame-inset`
     (same token as BOX SIZE, from the inner map pane, not the viewport);
     width is `max-content` so adding a chip grows the panel leftward. */
  right: var(--map-frame-inset, 14px);
  bottom: var(--map-frame-inset-bottom, 14px);
  width: max-content;
  max-width: calc(100% - 2 * var(--map-frame-inset, 14px));
  box-sizing: border-box;
  /* Must stay below .modal-backdrop (z-index 200); matches plaque-size-control. */
  z-index: 40;
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 8px 10px 9px;
  border-radius: 14px;
  border: 1px solid color-mix(in srgb, var(--gold) 42%, transparent);
  background: color-mix(in srgb, var(--surface) 78%, transparent);
  backdrop-filter: blur(20px) saturate(1.35);
  -webkit-backdrop-filter: blur(20px) saturate(1.35);
  box-shadow:
    0 4px 18px rgba(0, 0, 0, 0.18),
    inset 0 1px 0 rgba(255, 255, 255, 0.35);
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", var(--font-body), system-ui, sans-serif;
  transition: opacity 0.22s ease, visibility 0.22s ease;
}
body.hotel-modal-open .map-tier-toggle-control {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}
.map-tier-toggle-control[hidden] { display: none !important; }
.map-tier-toggle-head {
  display: flex;
  align-items: center;
  justify-content: center;
}
.map-tier-toggle-label {
  font-size: 0.62rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  white-space: nowrap;
  color: color-mix(in srgb, var(--text) 72%, var(--text-muted));
}
.map-tier-toggles {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 4px;
  width: max-content;
  max-width: 100%;
}
.map-tier-toggle {
  flex: 0 0 auto;
  width: 30px;
  min-width: 30px;
  height: 28px;
  border-radius: 6px;
  border: none;
  background: color-mix(in srgb, var(--bg-sunken) 55%, transparent);
  color: var(--text);
  font-size: 0.72rem;
  font-weight: 700;
  font-family: inherit;
  line-height: 1;
  cursor: pointer;
  transition: background 0.14s ease, color 0.14s ease, opacity 0.14s ease,
    border-color 0.14s ease, border-width 0.14s ease;
}
.map-tier-toggle:hover { background: color-mix(in srgb, var(--gold) 16%, transparent); }
.map-tier-toggle:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 1px;
}
/* OFF state: dimmed + desaturated — visually distinct, still simple (no
   strikethrough/badge chrome per owner's "not showy" note). */
.map-tier-toggle.is-off {
  opacity: 0.34;
  filter: grayscale(0.55);
  background: color-mix(in srgb, var(--bg-sunken) 30%, transparent);
  color: var(--text-muted);
}
.map-tier-toggle.is-off:hover { opacity: 0.5; }

/* Box Size 1: no tier ever carries a border (matches real Size-1 price pegs,
   which have no tier plate at all) — base .map-tier-toggle (border: none)
   already covers this; no override needed. */

/* Box Size 2 — top-only stripes (T1 gets none; see .atlas-pin-label--size-2). */
.map-tier-toggle-control--size-2 .map-tier-toggle[data-tier="2"] { border-top: 6px solid #b8964e; }
.map-tier-toggle-control--size-2 .map-tier-toggle[data-tier="3"] { border-top: 4.5px solid #e8b83a; }
.map-tier-toggle-control--size-2 .map-tier-toggle[data-tier="4"] { border-top: 4.5px solid #1aa891; }
.map-tier-toggle-control--size-2 .map-tier-toggle[data-tier="5"] { border-top: 5px solid #3f5fd6; }
.map-tier-toggle-control--size-2 .map-tier-toggle[data-tier="6"] { border-top: 6.5px solid #8a4ec8; }
:root[data-theme="dark"] .map-tier-toggle-control--size-2 .map-tier-toggle[data-tier="2"] { border-top-color: #d4b56a; }
:root[data-theme="dark"] .map-tier-toggle-control--size-2 .map-tier-toggle[data-tier="3"] { border-top-color: #f5c84a; }
:root[data-theme="dark"] .map-tier-toggle-control--size-2 .map-tier-toggle[data-tier="4"] { border-top-color: #5ef0d4; }
:root[data-theme="dark"] .map-tier-toggle-control--size-2 .map-tier-toggle[data-tier="5"] { border-top-color: #a8bcff; }
:root[data-theme="dark"] .map-tier-toggle-control--size-2 .map-tier-toggle[data-tier="6"] { border-top-color: #d4b8ff; }

/* Box Size 3 — top-only stripes, one notch heavier (see .atlas-pin-label--size-3). */
.map-tier-toggle-control--size-3 .map-tier-toggle[data-tier="2"] { border-top: 8px solid #b8964e; }
.map-tier-toggle-control--size-3 .map-tier-toggle[data-tier="3"] { border-top: 7.5px solid #e8b83a; }
.map-tier-toggle-control--size-3 .map-tier-toggle[data-tier="4"] { border-top: 9px solid #1aa891; }
.map-tier-toggle-control--size-3 .map-tier-toggle[data-tier="5"] { border-top: 10px solid #3f5fd6; }
.map-tier-toggle-control--size-3 .map-tier-toggle[data-tier="6"] { border-top: 12px solid #8a4ec8; }
:root[data-theme="dark"] .map-tier-toggle-control--size-3 .map-tier-toggle[data-tier="2"] { border-top-color: #d4b56a; }
:root[data-theme="dark"] .map-tier-toggle-control--size-3 .map-tier-toggle[data-tier="3"] { border-top-color: #f5c84a; }
:root[data-theme="dark"] .map-tier-toggle-control--size-3 .map-tier-toggle[data-tier="4"] { border-top-color: #5ef0d4; }
:root[data-theme="dark"] .map-tier-toggle-control--size-3 .map-tier-toggle[data-tier="5"] { border-top-color: #a8bcff; }
:root[data-theme="dark"] .map-tier-toggle-control--size-3 .map-tier-toggle[data-tier="6"] { border-top-color: #d4b8ff; }

/* Box Size 4 — T2 stays top-only; T3–6 get the real "all-sides frame" language
   (see .atlas-pin-label--size-4 .atlas-pin-label-plate--t3..t6). */
.map-tier-toggle-control--size-4 .map-tier-toggle[data-tier="2"] { border-top: 8px solid #b8964e; }
.map-tier-toggle-control--size-4 .map-tier-toggle[data-tier="3"] { border: 2.5px solid #b8964e; border-top-width: 4.5px; border-top-color: #f0d78a; }
.map-tier-toggle-control--size-4 .map-tier-toggle[data-tier="4"] { border: 3px solid #0b5049; border-top-width: 4.5px; border-top-color: #1aa891; }
.map-tier-toggle-control--size-4 .map-tier-toggle[data-tier="5"] { border: 3.5px solid #1b2c6b; border-top-width: 5px; border-top-color: #3f5fd6; }
.map-tier-toggle-control--size-4 .map-tier-toggle[data-tier="6"] { border: 5px solid #3c1a5c; border-top-width: 7px; border-top-color: #8a4ec8; }
:root[data-theme="dark"] .map-tier-toggle-control--size-4 .map-tier-toggle[data-tier="2"] { border-top-color: #d4b56a; }
:root[data-theme="dark"] .map-tier-toggle-control--size-4 .map-tier-toggle[data-tier="3"] { border-color: #c9a94f; border-top-color: #f0d78a; }
:root[data-theme="dark"] .map-tier-toggle-control--size-4 .map-tier-toggle[data-tier="4"] { border-color: #1ec9b0; border-top-width: 5px; border-top-color: #5ef0d4; }
:root[data-theme="dark"] .map-tier-toggle-control--size-4 .map-tier-toggle[data-tier="5"] { border-color: #6b8cff; border-top-width: 6px; border-top-color: #a8bcff; }
:root[data-theme="dark"] .map-tier-toggle-control--size-4 .map-tier-toggle[data-tier="6"] { border-color: #b07aee; border-top-width: 8px; border-top-color: #d4b8ff; }

/* Box Size 5 — T2 top-only (thickest whisper); T3–6 heaviest full frame
   (see .atlas-pin-label--size-5 .atlas-pin-label-plate--t3..t6). */
.map-tier-toggle-control--size-5 .map-tier-toggle[data-tier="2"] { border-top: 8.5px solid #b8964e; }
.map-tier-toggle-control--size-5 .map-tier-toggle[data-tier="3"] { border: 3.5px solid #b8964e; border-top-width: 6px; border-top-color: #f0d78a; }
.map-tier-toggle-control--size-5 .map-tier-toggle[data-tier="4"] { border: 4px solid #0b5049; border-top-width: 6px; border-top-color: #1aa891; }
.map-tier-toggle-control--size-5 .map-tier-toggle[data-tier="5"] { border: 5px solid #1b2c6b; border-top-width: 7px; border-top-color: #3f5fd6; }
.map-tier-toggle-control--size-5 .map-tier-toggle[data-tier="6"] { border: 6.5px solid #3c1a5c; border-top-width: 9px; border-top-color: #8a4ec8; }
:root[data-theme="dark"] .map-tier-toggle-control--size-5 .map-tier-toggle[data-tier="2"] { border-top-color: #d4b56a; }
:root[data-theme="dark"] .map-tier-toggle-control--size-5 .map-tier-toggle[data-tier="3"] { border-color: #c9a94f; border-top-width: 5px; border-top-color: #f0d78a; }
:root[data-theme="dark"] .map-tier-toggle-control--size-5 .map-tier-toggle[data-tier="4"] { border-color: #1ec9b0; border-top-width: 7px; border-top-color: #5ef0d4; }
:root[data-theme="dark"] .map-tier-toggle-control--size-5 .map-tier-toggle[data-tier="5"] { border-color: #6b8cff; border-top-width: 8px; border-top-color: #a8bcff; }
:root[data-theme="dark"] .map-tier-toggle-control--size-5 .map-tier-toggle[data-tier="6"] { border-color: #b07aee; border-top-width: 10px; border-top-color: #d4b8ff; }

:root[data-era="belleepoque"] .map-tier-toggle-control { border-radius: 16px; }
:root[data-era="artdeco"] .map-tier-toggle-control { border-radius: 8px; }
:root[data-era="midcentury"] .map-tier-toggle-control { border-radius: 12px; }

/* ---- Mobile: keep the mini-map legible & the Back button clear ------------- */
@media (max-width: 560px) {
  .mini-map-shell { height: 180px; }
  .mini-map-addr-text { font-size: 0.88rem; }
  .map-back-button {
    top: 8px;
    left: 8px;
    font-size: 0.8rem;
    padding: 6px 12px 6px 9px;
  }
}
@media (max-width: 390px) {
  .mini-map-shell { height: 160px; }
  .mini-map-hint { font-size: 0.66rem; padding: 3px 8px; }
}

/* ============================================================================ */
/* ===== MAP-MINI-2026 — END ===== */
/* ============================================================================ */

/* ===== HOTEL-POWER-MODAL-2026 — START =====
   Gold Hotel Power box in the hotel-modal Neighborhood section.
   Matches Night Atlas `.na-power` geometry (stacked Georgia number +
   7.5px uppercase label on #e3c98a). Do not fold this into green-flag
   label/font work — these selectors are Hotel Power / modal-neighborhood only. */
.modal-nb-stack { position: relative; }
.modal-nb-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
  margin: 0 0 12px;
}
.modal-nb-head-copy {
  min-width: 0;
  flex: 1 1 auto;
}
.modal-nb-name {
  display: block;
  font-family: var(--font-display, Georgia, "Times New Roman", serif);
  font-size: 1.05rem;
  line-height: 1.25;
  color: var(--text);
}
.modal-nb-place {
  display: block;
  margin-top: 2px;
  font-family: Helvetica, Arial, sans-serif;
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-muted, var(--muted));
}
.modal-hp-box {
  flex: 0 0 auto;
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  padding: 3px 9px 4px;
  border-radius: 7px;
  background: #e3c98a;
  box-shadow: 0 1px 0 rgba(7, 13, 24, 0.3);
  cursor: default;
}
.modal-hp-num {
  display: block;
  font-family: Georgia, "Times New Roman", serif;
  font-size: 1.1rem;
  font-weight: 700;
  line-height: 1;
  letter-spacing: 0;
  text-transform: none;
  color: #0b1220;
}
.modal-hp-lbl {
  display: block;
  margin-top: 2px;
  font-family: Helvetica, Arial, sans-serif;
  font-size: 7.5px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: #3c2f10;
}
.modal-hp-ctx {
  margin: -6px 0 12px;
  font-family: Helvetica, Arial, sans-serif;
  font-size: 11px;
  letter-spacing: 0.06em;
  line-height: 1.4;
  color: var(--text-muted, var(--muted));
}
@media (max-width: 560px) {
  .modal-nb-head { gap: 8px; }
  .modal-hp-box { min-width: 40px; padding: 3px 8px 4px; }
}
/* ===== HOTEL-POWER-MODAL-2026 — END ===== */

/* ===== COUNTRY-MODE-1-BROCHURE (A/B graft): retro travel-brochure — START =====
   A self-contained, fully reversible block. The brochure surface is
   #countryModeContainer (.cm-brochure), revealed when <body> has
   .is-country-mode. All color/type comes from the active era×theme CSS
   custom properties (--bg, --surface, --text, --gold, --font-wordmark …)
   so the brochure looks correct in all 8 looks; Belle Époque light is the
   owner's default and is tuned first. Antique-gold (champagne-bronze) only.
   Remove this block + the COUNTRY-MODE-1-BROCHURE (A/B graft) HTML/JS blocks to fully revert. */
/* ============================================================================ */

/* When Country Mode is on, hide the Card/Map surfaces + hero like Map Mode. */
body.is-country-mode .toolbar,
body.is-country-mode #cardGrid,
body.is-country-mode #emptyState,
body.is-country-mode .grid-lazy-sentinel,
body.is-country-mode #mapContainer,
body.is-country-mode #mapView,
body.is-country-mode #directoryPanel,
body.is-country-mode .hero,
body.is-country-mode .results-header {
  display: none !important;
}
body.is-country-mode main#top { padding-top: 0; }
body.is-country-mode .results { padding-top: 0; margin-top: 0; }
/* Active-mode emphasis on the Mode pill (mirrors is-map-mode treatment). */
body.is-country-mode .mode-select,
body.is-country-mode #modeButton {
  background: var(--gold);
  color: var(--bg-sunken);
  border-color: var(--gold);
}

/* ---- brochure surface + paper sheet ---------------------------------- */
.cm-brochure {
  --cm-ink: var(--text);
  --cm-ink-soft: var(--text-muted);
  --cm-gold: var(--gold);
  --cm-gold-bright: var(--gold-bright, var(--gold));
  --cm-rule: var(--rule-gold, var(--gold));
  --cm-paper: var(--surface);
  width: 100%;
  padding: clamp(14px, 3vw, 40px) 0 64px;
  display: flex;
  justify-content: center;
}
.cm-brochure[hidden] { display: none; }

.cm-sheet {
  position: relative;
  width: 100%;
  max-width: 1120px;
  margin: 0 auto;
  padding: clamp(20px, 4vw, 56px) clamp(18px, 4vw, 60px) clamp(28px, 4vw, 56px);
  background:
    linear-gradient(180deg, color-mix(in srgb, var(--surface) 92%, var(--bg)) 0%, var(--surface) 100%);
  border: 1px solid color-mix(in srgb, var(--cm-gold) 45%, transparent);
  border-radius: 6px;
  box-shadow:
    0 1px 0 color-mix(in srgb, var(--cm-gold) 30%, transparent) inset,
    0 24px 60px -30px rgba(0,0,0,0.55);
}
/* subtle paper grain — pure CSS, theme-aware, no image deps */
.cm-sheet::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 6px;
  pointer-events: none;
  opacity: 0.5;
  background-image:
    radial-gradient(color-mix(in srgb, var(--cm-gold) 6%, transparent) 0.5px, transparent 0.6px);
  background-size: 4px 4px;
  mix-blend-mode: multiply;
}
/* engraved double rule just inside the edge — the brochure frame */
.cm-deckle {
  position: absolute;
  inset: 10px;
  border: 1px solid color-mix(in srgb, var(--cm-gold) 38%, transparent);
  border-radius: 3px;
  pointer-events: none;
}
.cm-deckle::after {
  content: "";
  position: absolute;
  inset: 4px;
  border: 1px solid color-mix(in srgb, var(--cm-gold) 18%, transparent);
  border-radius: 2px;
}
.cm-sheet > * { position: relative; z-index: 1; }

/* Sticky exit chrome — always reachable while scrolling the brochure */
.cm-chrome {
  position: sticky;
  top: 0;
  z-index: 4;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  gap: 12px;
  margin: -8px 0 14px;
  padding: 8px 0 10px;
  background: color-mix(in srgb, var(--surface) 92%, var(--bg));
  border-bottom: 1px solid color-mix(in srgb, var(--cm-gold) 28%, transparent);
  backdrop-filter: blur(6px);
}
.cm-exit {
  font-family: var(--font-body, sans-serif);
  font-size: 0.78rem;
  letter-spacing: 0.04em;
  color: var(--cm-gold);
  background: color-mix(in srgb, var(--surface) 80%, var(--bg));
  border: 1px solid color-mix(in srgb, var(--cm-gold) 40%, transparent);
  border-radius: 999px;
  padding: 8px 14px;
  min-height: 36px;
  cursor: pointer;
  transition: background 0.16s ease, border-color 0.16s ease, color 0.16s ease;
}
.cm-exit:hover,
.cm-exit:focus-visible {
  background: var(--cm-gold);
  color: var(--bg-sunken, #fff);
  border-color: var(--cm-gold);
  outline: none;
}

/* ---- masthead -------------------------------------------------------- */
.cm-masthead { text-align: center; margin: 6px 0 22px; }
.cm-eyebrow {
  display: inline-block;
  font-family: var(--font-body, sans-serif);
  font-size: 0.7rem;
  letter-spacing: var(--eyebrow-spacing, 0.28em);
  text-transform: uppercase;
  color: var(--cm-gold);
  margin-bottom: 10px;
}
.cm-title {
  font-family: var(--font-wordmark, var(--font-serif, serif));
  font-weight: 500;
  font-size: clamp(2rem, 5.5vw, 3.4rem);
  line-height: 1.05;
  color: var(--cm-ink);
  margin: 0 0 6px;
  letter-spacing: 0.01em;
}
.cm-dek {
  font-family: var(--font-serif, serif);
  font-style: italic;
  font-size: clamp(1rem, 2.4vw, 1.25rem);
  color: var(--cm-ink-soft);
  max-width: 46ch;
  margin: 4px auto 0;
}
.cm-proto-note {
  font-family: var(--font-body, sans-serif);
  font-size: 0.74rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--cm-ink-soft);
  margin-top: 14px;
  opacity: 0.85;
}
/* gold flourish under the masthead */
.cm-masthead::after {
  content: "❦";
  display: block;
  color: var(--cm-gold);
  font-size: 1.1rem;
  margin: 14px auto 0;
}

/* ---- continent: country plates --------------------------------------- */
.cm-country-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(14px, 2vw, 26px);
  margin-top: 8px;
}
.cm-country-plate {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  text-align: left;
  gap: 6px;
  padding: 0 0 18px;
  background: color-mix(in srgb, var(--surface) 80%, var(--bg));
  border: 1px solid color-mix(in srgb, var(--cm-gold) 32%, transparent);
  border-radius: 4px;
  cursor: pointer;
  overflow: hidden;
  transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease;
  color: var(--cm-ink);
  font: inherit;
}
.cm-country-plate:hover {
  transform: translateY(-3px);
  border-color: var(--cm-gold);
  box-shadow: 0 16px 34px -22px rgba(0,0,0,0.6);
}
.cm-plate-eyebrow {
  font-family: var(--font-body, sans-serif);
  font-size: 0.62rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--cm-gold);
  padding: 14px 18px 0;
}
.cm-plate-name {
  font-family: var(--font-wordmark, var(--font-serif, serif));
  font-size: clamp(1.3rem, 2.4vw, 1.7rem);
  line-height: 1.1;
  color: var(--cm-ink);
  padding: 0 18px;
}
.cm-plate-tag {
  font-family: var(--font-serif, serif);
  font-style: italic;
  font-size: 0.96rem;
  color: var(--cm-ink-soft);
  padding: 0 18px;
}
.cm-plate-stat {
  font-family: var(--font-body, sans-serif);
  font-size: 0.74rem;
  letter-spacing: 0.03em;
  color: var(--cm-ink-soft);
  padding: 6px 18px 0;
}
.cm-plate-go {
  margin-top: auto;
  font-family: var(--font-body, sans-serif);
  font-size: 0.78rem;
  letter-spacing: 0.04em;
  color: var(--cm-gold);
  padding: 10px 18px 0;
}

/* ---- map-hero: hand-drawn illustrated travel-brochure maps ------------ */
.cm-map-hero {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 7;
  margin: 0 0 6px;
  overflow: hidden;
  display: grid;
  place-items: center;
  background:
    repeating-linear-gradient(45deg,
      color-mix(in srgb, var(--cm-gold) 7%, transparent) 0 2px,
      transparent 2px 12px),
    color-mix(in srgb, var(--bg-sunken, var(--bg)) 70%, var(--surface));
  border-bottom: 1px solid color-mix(in srgb, var(--cm-gold) 30%, transparent);
}
.cm-map-hero-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  display: block;
}
/* dark theme: the warm paper maps stay readable; nudge them to sit on the
   sheet with a faint sepia multiply so they don't glare on a dark page. */
:root[data-theme="dark"] .cm-map-hero-img { filter: saturate(0.92) brightness(0.97); }

/* country & city spreads get the full wide banner treatment */
.cm-sheet--country .cm-map-hero,
.cm-sheet--city .cm-map-hero {
  aspect-ratio: 21 / 7;
  max-height: 280px;
  margin: 0 auto 26px;
  border: 1px solid color-mix(in srgb, var(--cm-gold) 36%, transparent);
  border-radius: 4px;
  box-shadow:
    0 1px 0 color-mix(in srgb, var(--cm-gold) 26%, transparent) inset,
    0 6px 22px color-mix(in srgb, var(--cm-ink) 12%, transparent);
}

/* engraved caption plate (only on country/city banners) */
.cm-map-hero-plate { display: none; }
.cm-sheet--country .cm-map-hero-plate,
.cm-sheet--city .cm-map-hero-plate {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  padding: 26px 16px 9px;
  background: linear-gradient(to top,
    color-mix(in srgb, var(--cm-paper, var(--surface)) 92%, transparent) 0%,
    color-mix(in srgb, var(--cm-paper, var(--surface)) 70%, transparent) 46%,
    transparent 100%);
  pointer-events: none;
}
.cm-map-hero-plate-name {
  font-family: var(--font-wordmark, var(--font-serif, serif));
  font-size: clamp(1rem, 2.4vw, 1.5rem);
  letter-spacing: 0.04em;
  color: var(--cm-ink);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 70%;
}
.cm-map-hero-plate-rule {
  flex: 1 1 auto;
  max-width: 96px;
  height: 1px;
  background: linear-gradient(to var(--_d, right),
    transparent, color-mix(in srgb, var(--cm-gold) 70%, transparent));
}
.cm-map-hero-plate-rule:last-child { --_d: left; }

/* engraved placeholder shown only if a map image fails to load */
.cm-map-hero--fallback { background:
    repeating-linear-gradient(45deg,
      color-mix(in srgb, var(--cm-gold) 7%, transparent) 0 2px,
      transparent 2px 12px),
    color-mix(in srgb, var(--bg-sunken, var(--bg)) 70%, var(--surface)); }
.cm-map-hero-inner { text-align: center; display: grid; gap: 4px; padding: 12px; }
.cm-map-hero-compass { color: var(--cm-gold); font-size: 1.6rem; }
.cm-map-hero-cap {
  font-family: var(--font-wordmark, var(--font-serif, serif));
  font-size: clamp(1rem, 2.2vw, 1.4rem);
  color: var(--cm-ink);
}
.cm-map-hero-note {
  font-family: var(--font-body, sans-serif);
  font-size: 0.66rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--cm-ink-soft);
}

/* ---- A1: engraved index-map cartouche call-outs ---------------------- */
/* The mapcue-layer is an absolutely-positioned overlay on .cm-map-hero.  */
.cm-mapcue-layer {
  position: absolute;
  inset: 0;
  pointer-events: none; /* layer itself is transparent; individual anchors handle events */
  z-index: 2;
}
/* Each call-out: gold-on-sepia engraved cartouche label with hairline leader. */
a.cm-mapcue {
  position: absolute;
  display: inline-flex;
  align-items: center;
  gap: 0;
  pointer-events: auto;
  cursor: pointer;
  transform: translate(-50%, -50%); /* centre on the % coord */
  text-decoration: none;
  color: var(--cm-gold);
  transition: transform 0.15s ease, opacity 0.15s ease;
  /* Engraved cartouche chip: tiny serif label on a sepia tile */
  background: color-mix(in srgb, var(--cm-paper, var(--surface)) 88%, var(--bg));
  border: 1px solid color-mix(in srgb, var(--cm-gold) 55%, transparent);
  border-radius: 2px;
  padding: 2px 5px 2px 3px;
  line-height: 1.1;
  white-space: nowrap;
  box-shadow: 0 1px 3px rgba(0,0,0,0.28);
  max-width: 120px; /* clip overly long labels on small banners */
}
a.cm-mapcue:hover,
a.cm-mapcue:focus-visible {
  transform: translate(-50%, -50%) translateY(-2px);
  border-color: var(--cm-gold);
  box-shadow: 0 4px 10px rgba(0,0,0,0.38);
  outline: none;
}
a.cm-mapcue:focus-visible {
  outline: 1px dotted color-mix(in srgb, var(--cm-gold) 65%, transparent);
  outline-offset: 1px;
}
/* The engraved index numeral glyph */
.cm-mapcue-num {
  font-family: var(--font-wordmark, var(--font-serif, serif));
  font-size: 0.58rem;
  line-height: 1;
  color: var(--cm-gold);
  background: color-mix(in srgb, var(--cm-gold) 14%, transparent);
  border-right: 1px solid color-mix(in srgb, var(--cm-gold) 38%, transparent);
  padding: 1px 4px 1px 3px;
  margin-right: 4px;
  border-radius: 1px 0 0 1px;
  flex-shrink: 0;
}
/* Hairline leader rule between numeral and label */
.cm-mapcue-rule {
  display: none; /* Numeral + label is enough; suppress ruler to avoid clutter at small scale */
}
/* The place label */
.cm-mapcue-label {
  font-family: var(--font-body, sans-serif);
  font-size: 0.58rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--cm-ink);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 96px;
}
/* Dark theme: paper is dark, so lighten the chip slightly */
:root[data-theme="dark"] a.cm-mapcue {
  background: color-mix(in srgb, var(--surface) 78%, var(--bg));
  border-color: color-mix(in srgb, var(--cm-gold) 50%, transparent);
}
/* Phones: hide call-out labels on very small banners to avoid clutter */
@media (max-width: 480px) {
  .cm-mapcue-label { display: none; }
  a.cm-mapcue { padding: 2px 4px; max-width: none; }
}

/* ---- back link + section subheads ------------------------------------ */
.cm-back {
  font-family: var(--font-body, sans-serif);
  font-size: 0.8rem;
  letter-spacing: 0.04em;
  color: var(--cm-gold);
  background: none;
  border: none;
  cursor: pointer;
  padding: 0 0 14px;
}
.cm-back:hover { color: var(--cm-gold-bright); text-decoration: underline; }
.cm-sub {
  font-family: var(--font-body, sans-serif);
  font-size: 0.72rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--cm-gold);
  text-align: center;
  margin: 0 0 12px;
}

/* ---- scene prose ----------------------------------------------------- */
.cm-scene { max-width: 70ch; margin: 0 auto 34px; text-align: center; }
.cm-scene-prose {
  font-family: var(--font-serif, serif);
  font-size: clamp(1.02rem, 1.7vw, 1.2rem);
  line-height: 1.7;
  color: var(--cm-ink);
}
.cm-scene-prose::first-letter {
  font-family: var(--font-wordmark, var(--font-serif, serif));
  font-size: 3.1em;
  float: left;
  line-height: 0.78;
  padding: 6px 10px 0 0;
  color: var(--cm-gold);
}

/* ---- A4: in-prose hotel hotlinks + footnote-style guest-rating chips -- */
/* Printed cross-reference: antique-gold hairline underline, ink-on-paper feel. */
a.cm-prose-link {
  color: var(--cm-gold);
  text-decoration: none;
  border-bottom: 1px solid color-mix(in srgb, var(--cm-gold) 55%, transparent);
  cursor: pointer;
  font-style: inherit;
  transition: color 0.14s ease, border-color 0.14s ease;
  /* No background — reads as ink cross-reference, not a web button */
}
a.cm-prose-link:hover,
a.cm-prose-link:focus-visible {
  color: color-mix(in srgb, var(--cm-gold) 85%, var(--cm-ink));
  border-bottom-color: color-mix(in srgb, var(--cm-gold) 90%, transparent);
  outline: none;
}
a.cm-prose-link:focus-visible {
  outline: 1px dotted color-mix(in srgb, var(--cm-gold) 70%, transparent);
  outline-offset: 1px;
}
/* Footnote chip: small superscript marginal annotation, not a modern pill. */
sup.cm-prose-cite {
  font-family: var(--font-body, sans-serif);
  font-size: 0.58em;
  font-style: normal;
  font-weight: normal;
  letter-spacing: 0.04em;
  vertical-align: super;
  line-height: 1;
  color: color-mix(in srgb, var(--cm-gold) 78%, var(--cm-ink));
  margin-left: 0.12em;
  /* Hairline-rule separator — brochure footnote dagger idiom */
  padding: 0 0.18em;
  border-left: 1px solid color-mix(in srgb, var(--cm-gold) 45%, transparent);
}

/* ---- city strip ------------------------------------------------------ */
.cm-citystrip { margin: 0 auto 34px; text-align: center; }
.cm-city-chips {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 8px;
  max-width: 880px;
  margin: 0 auto;
}
.cm-city-chip {
  font-family: var(--font-body, sans-serif);
  font-size: 0.82rem;
  letter-spacing: 0.02em;
  color: var(--cm-ink);
  background: color-mix(in srgb, var(--surface) 70%, var(--bg));
  border: 1px solid color-mix(in srgb, var(--cm-gold) 34%, transparent);
  border-radius: 999px;
  padding: 7px 15px;
  cursor: pointer;
  transition: background 0.16s ease, color 0.16s ease, border-color 0.16s ease;
}
.cm-city-chip:hover {
  background: var(--cm-gold);
  color: var(--bg-sunken, #fff);
  border-color: var(--cm-gold);
}

/* ---- the Top-30 list ------------------------------------------------- */
.cm-toplist { margin-top: 8px; }
.cm-toplist-head { text-align: center; margin-bottom: 22px; }
.cm-toplist-kicker {
  font-family: var(--font-body, sans-serif);
  font-size: 0.7rem;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--cm-gold);
}
.cm-toplist-title {
  font-family: var(--font-wordmark, var(--font-serif, serif));
  font-size: clamp(1.5rem, 3.4vw, 2.2rem);
  color: var(--cm-ink);
  margin: 6px 0 4px;
}
.cm-toplist-dek {
  font-family: var(--font-serif, serif);
  font-style: italic;
  color: var(--cm-ink-soft);
  font-size: 0.98rem;
}
.cm-ranked { display: block; }
.cm-tier {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 16px;
  margin-bottom: 16px;
}
.cm-tier[hidden] { display: none; }
@media (prefers-reduced-motion: no-preference) {
  .cm-tier--revealed { animation: cmFade 0.5s ease both; }
}
@keyframes cmFade {
  from { opacity: 0; transform: translateY(10px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* ---- a hotel plate --------------------------------------------------- */
.cm-hotel-plate {
  position: relative;
  display: grid;
  grid-template-columns: 54px 1fr;
  gap: 0;
  text-align: left;
  background: color-mix(in srgb, var(--surface) 86%, var(--bg));
  border: 1px solid color-mix(in srgb, var(--cm-gold) 26%, transparent);
  border-radius: 4px;
  overflow: hidden;
  font: inherit;
  color: var(--cm-ink);
}
.cm-hotel-plate.is-matched { cursor: pointer; }
.cm-hotel-plate.is-matched:hover {
  border-color: var(--cm-gold);
  box-shadow: 0 14px 30px -22px rgba(0,0,0,0.6);
  transform: translateY(-2px);
  transition: transform 0.16s ease, box-shadow 0.16s ease, border-color 0.16s ease;
}
.cm-hotel-plate.is-wishlist {
  background:
    repeating-linear-gradient(135deg,
      color-mix(in srgb, var(--cm-gold) 5%, transparent) 0 1px,
      transparent 1px 9px),
    color-mix(in srgb, var(--surface) 70%, var(--bg));
  border-style: dashed;
  opacity: 0.92;
}
.cm-rank {
  grid-row: 1 / -1;
  display: grid;
  place-items: center;
  font-family: var(--font-wordmark, var(--font-serif, serif));
  font-size: 1.5rem;
  color: var(--cm-gold);
  background: color-mix(in srgb, var(--cm-gold) 12%, transparent);
  border-right: 1px solid color-mix(in srgb, var(--cm-gold) 24%, transparent);
}
.cm-plate-photo {
  grid-column: 2;
  width: 100%;
  height: 132px;
  overflow: hidden;
  border-bottom: 1px solid color-mix(in srgb, var(--cm-gold) 18%, transparent);
}
.cm-plate-photo img { width: 100%; height: 100%; object-fit: cover; display: block; filter: saturate(0.92); }
.cm-plate-body { grid-column: 2; padding: 12px 15px 14px; display: grid; gap: 5px; align-content: start; }
.cm-hotel-name {
  font-family: var(--font-wordmark, var(--font-serif, serif));
  font-size: 1.12rem;
  line-height: 1.2;
  color: var(--cm-ink);
}
.cm-hotel-meta {
  font-family: var(--font-body, sans-serif);
  font-size: 0.76rem;
  letter-spacing: 0.02em;
  color: var(--cm-ink-soft);
}
.cm-hotel-note {
  font-family: var(--font-serif, serif);
  font-size: 0.9rem;
  line-height: 1.5;
  color: var(--cm-ink);
  opacity: 0.92;
}
.cm-plate-rating { display: flex; gap: 14px; margin-top: 2px; }
.cm-rate { display: inline-flex; align-items: baseline; gap: 5px; }
.cm-rate-num {
  font-family: var(--font-wordmark, var(--font-serif, serif));
  font-size: 1rem;
  color: var(--cm-gold);
}
.cm-rate-lab {
  font-family: var(--font-body, sans-serif);
  font-size: 0.64rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--cm-ink-soft);
}
.cm-plate-link {
  font-family: var(--font-body, sans-serif);
  font-size: 0.74rem;
  letter-spacing: 0.03em;
  color: var(--cm-gold);
  margin-top: 2px;
}
.cm-plate-wish {
  font-family: var(--font-body, sans-serif);
  font-size: 0.66rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--cm-ink-soft);
  margin-top: 2px;
}

/* ---- reveal buttons (letterpress) ------------------------------------ */
.cm-reveal-wrap { display: flex; justify-content: center; gap: 14px; margin: 10px 0 6px; flex-wrap: wrap; }
.cm-reveal {
  font-family: var(--font-body, sans-serif);
  font-size: 0.82rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--cm-ink);
  background: color-mix(in srgb, var(--surface) 60%, var(--bg));
  border: 1px solid var(--cm-gold);
  border-radius: 3px;
  padding: 12px 26px;
  cursor: pointer;
  box-shadow:
    0 1px 0 color-mix(in srgb, var(--cm-gold) 50%, transparent) inset,
    0 2px 0 color-mix(in srgb, var(--cm-gold) 26%, transparent);
  transition: background 0.16s ease, color 0.16s ease, transform 0.1s ease;
}
.cm-reveal[hidden] { display: none; }
.cm-reveal:hover { background: var(--cm-gold); color: var(--bg-sunken, #fff); }
.cm-reveal:active { transform: translateY(1px); box-shadow: 0 1px 0 color-mix(in srgb, var(--cm-gold) 40%, transparent) inset; }

/* ---- watch list (collapsible) ---------------------------------------- */
.cm-watch {
  max-width: 880px;
  margin: 30px auto 0;
  border-top: 1px solid color-mix(in srgb, var(--cm-gold) 30%, transparent);
  padding-top: 18px;
}
.cm-watch summary {
  cursor: pointer;
  list-style: none;
  text-align: center;
  display: grid;
  gap: 3px;
}
.cm-watch summary::-webkit-details-marker { display: none; }
.cm-watch-title {
  font-family: var(--font-wordmark, var(--font-serif, serif));
  font-size: 1.2rem;
  color: var(--cm-ink);
}
.cm-watch-sub {
  font-family: var(--font-body, sans-serif);
  font-size: 0.72rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--cm-gold);
}
.cm-watch-list {
  list-style: none;
  padding: 16px 0 0;
  margin: 0;
  columns: 2;
  column-gap: 34px;
}
.cm-watch-list li {
  break-inside: avoid;
  padding: 6px 0;
  font-family: var(--font-serif, serif);
  font-size: 0.96rem;
  color: var(--cm-ink);
  border-bottom: 1px dotted color-mix(in srgb, var(--cm-gold) 22%, transparent);
}
.cm-watch-list li.is-matched button {
  font: inherit;
  color: var(--cm-gold);
  background: none;
  border: none;
  cursor: pointer;
  text-align: left;
  padding: 0;
}
.cm-watch-list li.is-matched button:hover { text-decoration: underline; }
.cm-watch-loc { color: var(--cm-ink-soft); font-style: italic; font-size: 0.86em; }
.cm-empty-note {
  text-align: center;
  font-family: var(--font-serif, serif);
  font-style: italic;
  color: var(--cm-ink-soft);
}

/* ---- loading / error state ------------------------------------------- */
.cm-loading { text-align: center; padding: 80px 20px; color: var(--cm-ink-soft); }
.cm-loading-mark { display: block; font-size: 2rem; color: var(--cm-gold); margin-bottom: 12px; }
.cm-loading p { font-family: var(--font-serif, serif); font-style: italic; font-size: 1.1rem; }
.cm-loading-sub { font-size: 0.8rem; opacity: 0.8; }

/* ---- responsive: phones ---------------------------------------------- */
@media (max-width: 720px) {
  .cm-country-grid { grid-template-columns: 1fr; }
  .cm-tier { grid-template-columns: 1fr; }
  .cm-watch-list { columns: 1; }
  .cm-sheet { padding: 22px 14px 26px; border-radius: 4px; }
  .cm-deckle { inset: 7px; }
  .cm-reveal { width: 100%; padding: 15px 20px; }
  .cm-reveal-wrap { gap: 10px; }
  a.cm-mapcue {
    min-width: 28px;
    min-height: 28px;
    padding: 4px 6px;
  }
  .cm-mapcue-label { display: inline; font-size: 0.62rem; max-width: 88px; overflow: hidden; text-overflow: ellipsis; }
}

/* ============================================================================ */
/* ===== COUNTRY-MODE-1-BROCHURE (A/B graft) — END ===== */

/* ── #5 Condition & upkeep callout (#5c, 2026-06-05) ─────────────────────────
   Prominent, visually distinct from the generic category bars.
   Sits inside the RF-SENT flag detail block.
   Both dark-theme (default) and light-theme variants. ──────────────────────── */
.condition-callout {
  margin: 10px 0 4px;
  padding: 10px 14px 10px 12px;
  border-left: 3px solid #c0392b;
  background: rgba(192, 57, 43, 0.10);
  border-radius: 0 6px 6px 0;
}
.condition-callout-head {
  font-family: var(--font-body);
  font-size: 0.76rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: #e05c4b;
  margin-bottom: 4px;
  white-space: nowrap;
}
.condition-callout-desc {
  font-family: var(--font-body);
  font-size: 0.82rem;
  color: var(--text-primary);
  margin: 0 0 6px;
  line-height: 1.45;
}
.condition-quotes {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 5px;
}
.condition-quote {
  font-family: var(--font-body);
  font-size: 0.78rem;
  color: var(--text-secondary);
  line-height: 1.45;
  padding-left: 10px;
  border-left: 2px solid rgba(192, 57, 43, 0.35);
  font-style: italic;
}

/* Light theme overrides */
[data-theme="light"] .condition-callout {
  background: rgba(192, 57, 43, 0.07);
  border-left-color: #c0392b;
}
[data-theme="light"] .condition-callout-head { color: #9b2316; }
[data-theme="light"] .condition-callout-desc { color: var(--text-primary); }
[data-theme="light"] .condition-quote { color: var(--text-secondary); }

/* ── #4 Rating trend line (#4d, 2026-06-05) ──────────────────────────────────
   Subtle single-line trend note inside the modal flags section.
   Renders only for real declining/improving trends (never insufficient_history). */
.modal-flag-trend-line {
  font-family: var(--font-body);
  font-size: 0.78rem;
  margin: 8px 0 0;
  padding: 5px 10px;
  border-radius: 4px;
  line-height: 1.4;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.modal-flag-trend-line--declining {
  color: #e05c4b;
  background: rgba(192, 57, 43, 0.08);
  border-left: 2px solid #c0392b;
}
.modal-flag-trend-line--improving {
  color: #2e7d50;
  background: rgba(46, 125, 80, 0.08);
  border-left: 2px solid #2e7d50;
}
[data-theme="light"] .modal-flag-trend-line--declining {
  color: #9b2316;
  background: rgba(192, 57, 43, 0.07);
}
[data-theme="light"] .modal-flag-trend-line--improving {
  color: #1a5c35;
  background: rgba(46, 125, 80, 0.07);
}

/* ============================================================================
   MOBILE-IPHONE-2026 — iPhone portrait (375–430px; SE through 15/16 width band)
   Targets Safari on iOS: safe areas, compact hero, thumb-zone nav, map edge-to-edge.
   Reversible: delete this block + index.html #mobileTabbar + app.js tabbar hooks.
   ============================================================================ */

.mobile-tabbar {
  display: none;
}
.mobile-header-brand {
  display: none;
}
/* MOBILE-SEARCH-DOCK-2026: phone-only chrome — hidden everywhere by default,
   revealed inside the phone media query when the Search tab is open. */
.mobile-search-dock {
  display: none;
}

@media (max-width: 699.98px) {
  /* IOS-LANG-2026 — phone-only tokens (modern sheet/control radii; desktop untouched). */
  :root {
    --ios-sheet-radius: 14px;
    --ios-control-radius: 12px;
    --ios-pill-radius: 999px;
    --ios-tabbar-float: 8px;
    --ios-tabbar-h-phone: 52px;
    --ios-sheet-gap: 8px;
    /* TABBAR-THICKNESS-FIX-2026: the home-indicator safe area lives in this
       floating offset (how high the pill sits above the true screen edge),
       NOT in the pill's own bottom padding. Baking it into the padding
       instead (as before) left a lopsided blank strip under the icon row on
       every notched/Dynamic-Island iPhone — the pill's box grew taller than
       its Pro Max sibling for no visual reason ("bottom nav gets thicker").
       Total reserved space (see --ios-chrome-above-tab) is unchanged; only
       where the safe area is spent (floor gap vs. internal padding) moved. */
    --ios-tabbar-bottom: calc(
      var(--ios-tabbar-float) + env(safe-area-inset-bottom, 0px) + var(--vv-bottom-gap, 0px)
    );
    --ios-chrome-above-tab: calc(
      var(--ios-tabbar-h-phone) + var(--ios-tabbar-float) + var(--ios-sheet-gap)
      + env(safe-area-inset-bottom, 0px) + var(--vv-bottom-gap, 0px)
    );
  }
  body {
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    padding-bottom: var(--ios-chrome-above-tab);
  }
  .mobile-tabbar {
    display: flex;
    position: fixed;
    left: max(10px, env(safe-area-inset-left, 0px));
    right: max(10px, env(safe-area-inset-right, 0px));
    bottom: var(--ios-tabbar-bottom);
    z-index: 1200;
    align-items: stretch;
    justify-content: space-around;
    gap: 4px;
    /* Safe area is spent by --ios-tabbar-bottom's floor gap above, so this
       stays a plain symmetric pad — see TABBAR-THICKNESS-FIX-2026 above. */
    padding: 4px 6px;
    /* IOS-TABBAR-GLUE-2026: opaque fill — blur breaks fixed glue on WebKit. */
    background: color-mix(in srgb, var(--bg-sunken) 96%, var(--surface));
    /* TABBAR-UNIFY-2026: echo the header controls (region / mode / filters) —
       a subtle gold-tinted frame + the same inset gold sheen so the floating
       bar reads as part of the same family as the top chrome. */
    border: 1.5px solid color-mix(in srgb, var(--gold) 40%, var(--border-strong));
    border-radius: var(--ios-sheet-radius);
    box-shadow:
      0 4px 22px rgba(0, 0, 0, 0.14),
      0 0 0 0.5px color-mix(in srgb, var(--gold) 20%, transparent),
      inset 0 1px 0 rgba(198, 167, 102, 0.18);
    transform: translate3d(0, 0, 0);
    -webkit-transform: translate3d(0, 0, 0);
    backface-visibility: hidden;
    -webkit-backface-visibility: hidden;
    will-change: transform;
  }
  body.is-map-mode {
    padding-bottom: 0;
  }
  body.is-map-mode .map-view {
    padding-bottom: var(--ios-chrome-above-tab);
    box-sizing: border-box;
  }
  body.is-map-mode .map-mount {
    margin-top: 0;
    padding: 0;
    border-radius: 0;
    box-shadow: none;
  }
  /* Full-screen overlays supply their own chrome — hide the tab bar + search dock. */
  html.im-open .mobile-tabbar,
  html.bz-open .mobile-tabbar,
  html.nm-open .mobile-tabbar,
  html.hi-open .mobile-tabbar,
  html.am-open .mobile-tabbar,
  html.bq-open .mobile-tabbar,
  html.na-open .mobile-tabbar,
  html.sb-open .mobile-tabbar,
  html.na-open .mobile-mode-cue,
  html.sb-open .mobile-mode-cue,
  html.hi-open .mobile-mode-cue,
  html.am-open .mobile-mode-cue,
  body:has(.maison-open) .mobile-tabbar,
  body:has(.rv-open) .mobile-tabbar,
  body:has(.bd-open) .mobile-tabbar,
  body.atlas-lightbox-open .mobile-tabbar,
  html.im-open .mobile-search-dock,
  html.bz-open .mobile-search-dock,
  html.nm-open .mobile-search-dock,
  html.hi-open .mobile-search-dock,
  html.am-open .mobile-search-dock,
  html.bq-open .mobile-search-dock,
  html.na-open .mobile-search-dock,
  html.sb-open .mobile-search-dock,
  body:has(.maison-open) .mobile-search-dock,
  body:has(.rv-open) .mobile-search-dock,
  body:has(.bd-open) .mobile-search-dock,
  body.atlas-lightbox-open .mobile-search-dock {
    display: none !important;
  }
  .mobile-tab {
    flex: 1 1 0;
    min-width: 0;
    min-height: 44px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 2px;
    padding: 4px 4px;
    border: none;
    border-radius: 10px;
    background: transparent;
    /* TABBAR-UNIFY-2026: inactive tabs carry a faint warm-gold tint (label +
       icon inherit currentColor) so the whole bar shares the header's gold
       accent and quietly signals "this is tappable" without competing with the
       fully-gold active tab. */
    color: color-mix(in srgb, var(--gold) 26%, var(--text-muted));
    font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", var(--font-display), system-ui, sans-serif;
    font-size: 0.625rem;
    font-weight: 600;
    letter-spacing: 0.02em;
    text-transform: uppercase;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
    transition: background 0.16s ease, color 0.16s ease;
  }
  .mobile-tab svg { flex-shrink: 0; opacity: 0.82; }
  .mobile-tab.is-active {
    color: var(--gold-bright);
    background: color-mix(in srgb, var(--gold) 14%, var(--surface));
    box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--gold) 22%, transparent);
  }
  .mobile-tab.is-active svg { opacity: 1; }
  /* Press feedback echoes the gold family (region/filters hover) rather than a
     neutral gray, reinforcing the shared clickable-color cue. */
  .mobile-tab:active:not(.is-active) {
    background: color-mix(in srgb, var(--gold) 12%, transparent);
    color: var(--gold-bright);
  }

  .site-header {
    padding-left: max(var(--space-3), env(safe-area-inset-left, 0px));
    padding-right: max(var(--space-3), env(safe-area-inset-right, 0px));
    border-bottom: 1px solid color-mix(in srgb, var(--border-strong) 55%, transparent);
  }

  /* Single-row header: region + filters | branding (mode/look live in tab bar). */
  .header-grid {
    grid-template-columns: minmax(0, 1fr) auto;
    grid-template-areas: "region right";
    row-gap: 0;
    padding: var(--space-2) var(--space-3);
    align-items: center;
  }
  .wordmark { display: none; }
  .mode-select-wrap { display: none; }
  .header-right {
    gap: 0;
    flex-wrap: nowrap;
    align-items: center;
  }
  /* Jewel + sun/moon move to Look sheet — not duplicated in the header on phone.
     Scope to the HEADER control only. `.theme-toggle` is also used on
     #mobileThemeBtn in the Look sheet; a blanket hide made that orb
     `display:none !important` so light/dark could not be tapped. */
  .jewel-toggle,
  #themeToggle {
    display: none !important;
  }
  .mobile-header-brand {
    display: flex;
    align-items: center;
    gap: 9px;
    min-width: 0;
    max-width: min(56vw, 168px);
    padding: 1px 0;
    color: var(--text);
    text-decoration: none;
    -webkit-tap-highlight-color: transparent;
  }
  .mobile-header-brand-icon {
    flex-shrink: 0;
    width: 34px;
    height: 34px;
    display: block;
  }
  .mobile-header-brand-text {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    justify-content: center;
    gap: 0;
    min-width: 0;
    line-height: 1;
  }
  .mobile-header-brand-line {
    font-family: var(--font-wordmark);
    font-size: clamp(0.95rem, 4.15vw, 1.12rem);
    font-weight: 600;
    letter-spacing: 0.015em;
    text-transform: none;
    color: var(--text);
    white-space: nowrap;
    line-height: 1.04;
  }
  .region-select-wrap .region-select {
    min-height: 44px;
    padding: 8px 12px;
    font-size: 0.875rem;
    font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", var(--font-body), system-ui, sans-serif;
    border-radius: var(--ios-control-radius);
  }
  /* HEADER-FIT-2026: never let a long region name (e.g. "Mexico – Pacific &
     Los Cabos") push the filters button / branding off the screen. The region
     pill shrinks and its label ellipsizes; the pin + chevron + filters stay put. */
  .region-select-wrap {
    min-width: 0;
    max-width: 100%;
  }
  .region-select-wrap .region-select {
    min-width: 0;
    max-width: 100%;
    overflow: hidden;
  }
  .region-select #regionButtonLabel {
    min-width: 0;
    flex: 0 1 auto;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .region-select .pin-icon,
  .region-select .chev { flex-shrink: 0; }
  /* HEADER-BRAND-FIT-2026: the compact "Luxury Hotels Atlas" wordmark is dropped
     when the region label would otherwise be squeezed by it (JS toggles the
     class), and reinstated once there's room again. */
  .site-header.header-brand-hidden .mobile-header-brand { display: none; }
  .filters-button {
    width: 44px;
    min-height: 44px;
    border-radius: var(--ios-control-radius);
  }

  /* Overlay modes hide the tab bar — show a mode cue in the thumb zone that
     always taps back to Card Mode (bug: this used to be pointer-events:none
     for every mode except Country Mode 1, so News/Brands/Boutique/Booking
     Brief/Experience/Independents 2 all stranded users with no bottom nav
     at all — see setupMobileModeCueExit() in app.js). */
  .mobile-mode-cue {
    display: none;
  }
  .mobile-mode-cue:not([hidden]) {
    display: flex;
    position: fixed;
    left: max(10px, env(safe-area-inset-left, 0px));
    right: max(10px, env(safe-area-inset-right, 0px));
    bottom: var(--ios-tabbar-bottom);
    /* Must outrank every full-screen overlay root (Boutique/Maison/Experience 1/
       Dev/Independents 2 etc. all sit at z-index:1400) so their own bottom-of-
       screen chrome (e.g. .bq-counter) can never physically cover this tap
       target — otherwise the cue is clickable in theory but unreachable by a
       real finger. Stays below the 1500/1600 sub-dialog tier (confirmation
       modals, toasts) so those still take priority when open. */
    z-index: 1450;
    align-items: center;
    justify-content: center;
    /* Safe area already lives in --ios-tabbar-bottom's floor gap (see
       TABBAR-THICKNESS-FIX-2026) — don't add it again here, or this cue
       balloons taller than the tab bar it replaces. */
    min-height: var(--ios-tabbar-h-phone);
    padding: 8px 12px;
    background: color-mix(in srgb, var(--bg-sunken) 96%, var(--surface));
    /* TABBAR-UNIFY-2026: same gold-tinted frame as the tab bar it replaces. */
    border: 1.5px solid color-mix(in srgb, var(--gold) 40%, var(--border-strong));
    border-radius: var(--ios-sheet-radius);
    box-shadow:
      0 4px 22px rgba(0, 0, 0, 0.14),
      inset 0 1px 0 rgba(198, 167, 102, 0.18);
    pointer-events: auto;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
  }
  .mobile-mode-cue-label {
    font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", var(--font-display), system-ui, sans-serif;
    font-size: 0.625rem;
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--gold-bright);
  }
  .mobile-mode-cue-label::after {
    content: " · tap to exit";
    font-weight: 500;
    letter-spacing: 0.04em;
    opacity: 0.82;
  }

  /* CUE-CLEARANCE-2026: the read-only mode cue is a fixed bar (~60px + safe
     area) in the bottom thumb zone. Overlay-mode scroll roots that didn't
     reserve room for it (News .nm, Booking Brief .im) let their last line
     slide UNDER the cue. Reserve bottom padding equal to the cue's height so
     the final content clears it. (The Bazaar's .bz-scroll already pads
     120px, so it's left alone. The Maison's .maison-scroll no longer shows
     the bottom cue — it has its own always-visible close X — so it doesn't
     need this reserve either.) */
  .nm,
  .im {
    padding-bottom: calc(var(--ios-tabbar-h-phone, 54px) + env(safe-area-inset-bottom, 0px) + 28px) !important;
  }

  /* PERF-LCP-2026: phone wordmark must stay small — Netlify Lighthouse is
     mobile. Also kill desktop fill min/max so they cannot win on ≤700px. */
  :root[data-era="belleepoque"] .hero-wordmark-art,
  :root[data-era="artdeco"] .hero-wordmark-art,
  :root[data-era="midcentury"] .hero-wordmark-art,
  :root[data-era="editorial"] .hero-wordmark-art {
    --wordmark-art-h: clamp(64px, 17vw, 96px);
    margin: 0 auto 0.1rem;
  }
  :root[data-era="belleepoque"][data-theme="light"] .hero-wordmark-art {
    --wordmark-art-h: clamp(70px, 18vw, 100px);
  }
  .hero-lead-brand {
    flex: 0 1 auto;
    padding: 0.05rem 0 0.1rem;
  }
  .hero-gazette {
    width: 100%;
    margin-top: 0.35rem;
  }
  .hero-gazette-item:nth-child(n+3) {
    display: none;
  }
  .hero-gazette-hl {
    font-size: 0.78rem;
    -webkit-line-clamp: 2;
  }
  .hero-gazette-place {
    display: none;
  }
  .hero-lead-brand .hero-wordmark-art {
    flex: 0 1 auto;
    min-height: 0;
    max-height: min(var(--wordmark-art-h, 96px), 20vh);
    height: var(--wordmark-art-h, clamp(64px, 17vw, 96px));
  }
  .hero.hero--editorial {
    padding: 0.55rem var(--space-3) calc(0.65rem + env(safe-area-inset-bottom, 0px));
  }
  .hero--editorial .hero-inner.hero-grid {
    gap: 0.55rem;
  }
  .hero-rail .hero-filigree { display: none; }
  .hero-rail {
    border-top: 1px solid var(--rule-gold);
    padding-top: 0.45rem;
    margin-top: 0;
  }
  /* Two weekend lists side-by-side — half the vertical scroll. */
  .hero-rail .cheapest-teaser {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    grid-template-rows: auto 1fr;
    column-gap: 0.75rem;
    row-gap: 0.35rem;
    align-items: start;
  }
  .hero-rail .cheapest-teaser-section {
    min-width: 0;
    overflow: hidden;
  }
  .hero-rail .cheapest-teaser > .cheapest-teaser-section:nth-of-type(1) { grid-column: 1; grid-row: 1; }
  .hero-rail .cheapest-teaser > .cheapest-teaser-section:nth-of-type(2) { grid-column: 2; grid-row: 1; }
  /* Phone: top 4 deals per weekend (owner-mandated minimum). */
  .hero-rail .cheapest-teaser-list li:nth-child(n+5) {
    display: none;
  }
  .hero-rail .cheapest-teaser-divider { display: none; }
  .hero-rail .cheapest-teaser-head {
    flex-direction: column;
    align-items: flex-start;
    gap: 0.12rem;
    margin-bottom: 0.25rem;
    padding: 0.25rem 0 0.35rem;
  }
  .hero-rail .cheapest-teaser-from {
    font-size: 0.58rem;
    letter-spacing: 0.08em;
    align-self: flex-start;
    max-width: 100%;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .hero-rail .cheapest-teaser-title {
    font-size: 0.72rem;
    letter-spacing: 0.03em;
    line-height: 1.2;
  }
  .hero-rail .cheapest-teaser-dates {
    font-size: 0.66rem;
    margin-top: 0.15rem;
    white-space: normal;
    line-height: 1.2;
  }
  /* CHEAPEST-COMPACT-2026: name/location on the left, price pinned to the top
     right on the SAME row. The old single-column template pushed the price onto
     its own line (dead space between the location and a far-right price), which
     read as broken. Two columns keep each row tight and legible. */
  .hero-rail .cheapest-teaser-item {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    grid-template-rows: auto;
    column-gap: 0.4rem;
    row-gap: 0;
    padding: 4px 0 5px;
    align-items: start;
  }
  .hero-rail .cheapest-teaser-namecell {
    grid-column: 1;
    grid-row: 1;
    min-width: 0;
    width: 100%;
  }
  .hero-rail .cheapest-teaser-name,
  .hero-rail .cheapest-teaser-name--link {
    font-size: 0.82rem;
    font-weight: 600;
    line-height: 1.22;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    overflow: hidden;
    min-width: 0;
  }
  .hero-rail .cheapest-teaser-loc {
    font-size: 0.68rem;
    line-height: 1.2;
    white-space: normal;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 1;
    overflow: hidden;
    min-width: 0;
    margin-top: 0.05rem;
  }
  .hero-rail .cheapest-teaser-price {
    grid-column: 2;
    grid-row: 1;
    justify-self: end;
    align-self: start;
    font-size: 0.78rem;
    font-weight: 700;
    white-space: nowrap;
    padding-left: 0;
    margin-top: 0;
    min-width: max-content;
    color: var(--gold-bright);
    line-height: 1.3;
  }
  .hero-scroll-nudge {
    position: relative;
    bottom: auto;
    margin: 0.35rem auto 0;
    padding: 3px 12px 2px;
  }
  .hero-scroll-nudge-label { font-size: 0.56rem; }

  /* HOTELS | BRANDS | FROM — three equal columns, zero bleed (first phone impression). */
  .hero--editorial .hero-lead .hero-stats--masthead,
  .hero-lead .hero-stats--masthead {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    grid-template-rows: auto;
    align-items: stretch;
    justify-items: stretch;
    max-width: 100%;
    width: 100%;
    column-gap: 0;
    row-gap: 0;
    padding: 0.35rem 0 0;
    box-sizing: border-box;
  }
  .hero-lead .hero-stats--masthead > .hero-stat:nth-child(1) {
    grid-column: 1;
    grid-row: 1;
  }
  .hero-lead .hero-stats--masthead > .hero-stat-divider {
    display: none;
  }
  .hero-lead .hero-stats--masthead > .hero-stat:nth-child(3) {
    grid-column: 2;
    grid-row: 1;
    border-left: 1px solid color-mix(in srgb, var(--gold) 32%, transparent);
  }
  .hero-lead .hero-stats--masthead > .hero-stat--from {
    grid-column: 3;
    grid-row: 1;
    border-left: 1px solid color-mix(in srgb, var(--gold) 32%, transparent);
  }
  .hero-lead .hero-stats--masthead .hero-stat {
    flex-direction: column;
    align-items: center;
    justify-content: flex-start;
    text-align: center;
    min-width: 0;
    width: 100%;
    padding: 0 0.28rem;
    box-sizing: border-box;
    gap: 0.14rem;
  }
  .hero-lead .hero-stats--masthead .hero-stat-num {
    font-size: clamp(1.28rem, 5.2vw, 1.48rem);
    line-height: 1;
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .hero-lead .hero-stats--masthead .hero-stat-label {
    font-size: clamp(0.56rem, 2.35vw, 0.64rem);
    letter-spacing: 0.1em;
    line-height: 1.2;
    max-width: 100%;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }

  .results {
    padding: 0.35rem var(--space-3) var(--space-6);
    display: flex;
    flex-direction: column;
  }
  .results-header { order: 2; }
  .toolbar { order: 1; }
  #cardGrid,
  .empty-state { order: 4; }
  /* .grid-lazy-sentinel has no order rule of its own, so it defaulted to
     order: 0 and rendered ABOVE the toolbar/header/grid instead of after the
     last card — decoupling the lazy-load IntersectionObserver/scroll
     catch-up from real scroll position and causing blank card slots to
     linger after a big scroll on phones. Keep it grouped with #cardGrid so
     DOM order (sentinel immediately follows the grid) breaks the tie and it
     stays right after the last rendered card. */
  .grid-lazy-sentinel { order: 4; }
  .map-view { order: 5; }
  /* FULL-ATLAS-FULLBLEED-2026: the "THE FULL ATLAS" context band was centered
     and narrower than the screen (auto side margins). Break it out of the
     .results 12px gutter so the band + its gold hairline rule span edge to
     edge, while the eyebrow/heading text keeps the standard gutter so it stays
     aligned with the toolbar and cards below. */
  .results-header {
    margin-bottom: 0.65rem;
    margin-left: calc(-1 * var(--space-3));
    margin-right: calc(-1 * var(--space-3));
    max-width: none;
    width: auto;
    padding-left: 0;
    padding-right: 0;
  }
  .results-header .results-eyebrow,
  .results-header .results-heading,
  .results-header .results-clear-wrap {
    padding-left: var(--space-3);
    padding-right: var(--space-3);
  }
  .results-header .results-heading {
    font-size: clamp(1.15rem, 5vw, 1.45rem);
  }

  /* MOBILE-SEARCH-DOCK-2026: search now lives in the bottom "Search" tab, so the
     phone toolbar is SORT-ONLY (full width). The old sticky ¾ sort/search focus
     juggling is gone. .toolbar-search is relocated into #mobileSearchDock by JS;
     hide any pre-relocation flash while it is still inside .toolbar. */
  .toolbar-inner {
    padding: 8px 10px;
    gap: 8px;
    flex-wrap: nowrap;
    align-items: center;
    background: color-mix(in srgb, var(--surface) 90%, var(--bg));
    border: 1px solid color-mix(in srgb, var(--border-strong) 70%, transparent);
    border-radius: var(--ios-control-radius);
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
  }
  .toolbar .toolbar-search { display: none; }
  .toolbar-sort {
    order: 1;
    flex: 1 1 100%;
    min-width: 0;
    width: 100%;
    gap: var(--space-2);
  }
  .toolbar-sort .toolbar-label {
    display: inline;
    flex-shrink: 0;
  }
  .toolbar .filter-select-wrap--always {
    max-width: none;
    flex: 1 1 auto;
    min-width: 0;
    width: 100%;
  }
  .toolbar .filter-select {
    width: 100%;
    min-width: 0;
    font-size: 0.8125rem;
    font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", var(--font-body), system-ui, sans-serif;
    padding: 9px 28px 9px 10px;
    border-radius: 10px;
  }
  .toolbar .filter-search-icon {
    display: block;
    left: 7px;
    width: 20px;
    height: 20px;
    color: #ffffff;
    opacity: 1;
    filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.45));
  }
  :root[data-theme="light"] .toolbar .filter-search-icon {
    color: #1d1d1d;
    filter: none;
  }
  .toolbar .filter-search-input {
    padding: 9px 24px 9px 34px;
    font-size: 0.875rem;
    font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", var(--font-body), system-ui, sans-serif;
    border-radius: 10px;
  }
  .toolbar .filter-search-input::placeholder {
    color: var(--text-faint);
    opacity: 0.55;
    font-style: normal;
    letter-spacing: 0.04em;
    transition: opacity 120ms ease;
  }
  .toolbar .filter-search-input:focus::placeholder {
    opacity: 0;
  }
  .toolbar-label { font-size: 0.58rem; letter-spacing: 0.16em; }
  .toolbar-filigree { display: none; }

  /* ===== MOBILE-SEARCH-DOCK-2026 — full-width search bar above the tab bar =====
     Hidden until the Search tab is tapped (body.mobile-search-open). It floats
     directly above the tab bar, "attached" to it, spanning the phone width, and
     shares the tab bar's gold-framed language. */
  .mobile-search-dock { display: none; }
  body.mobile-search-open .mobile-search-dock {
    display: block;
    position: fixed;
    left: max(10px, env(safe-area-inset-left, 0px));
    right: max(10px, env(safe-area-inset-right, 0px));
    bottom: calc(
      var(--ios-tabbar-h-phone) + var(--ios-tabbar-float)
      + env(safe-area-inset-bottom, 0px) + var(--vv-bottom-gap, 0px) + 6px
    );
    z-index: 1201;
    padding: 10px;
    background: color-mix(in srgb, var(--bg-sunken) 96%, var(--surface));
    border: 1.5px solid color-mix(in srgb, var(--gold) 40%, var(--border-strong));
    border-radius: var(--ios-sheet-radius);
    box-shadow:
      0 8px 26px rgba(0, 0, 0, 0.20),
      inset 0 1px 0 rgba(198, 167, 102, 0.18);
  }
  .mobile-search-dock .toolbar-search {
    display: block;
    width: 100%;
    margin: 0;
    flex: none;
  }
  .mobile-search-dock .filter-search-wrap {
    width: 100%;
    max-width: none;
    min-width: 0;
  }
  .mobile-search-dock .filter-search-icon {
    left: 13px;
    width: 20px;
    height: 20px;
  }
  .mobile-search-dock .filter-search-input {
    width: 100%;
    min-height: 46px;
    padding: 11px 42px 11px 42px;
    font-size: 1rem;
    font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", var(--font-body), system-ui, sans-serif;
    border-radius: var(--ios-control-radius);
    border: 1.5px solid color-mix(in srgb, var(--gold) 45%, var(--border-strong));
    background: var(--surface);
  }
  .mobile-search-dock .filter-search-input:focus {
    border-color: var(--gold-bright);
    background: var(--surface);
  }
  .mobile-search-dock .filter-search-clear {
    right: 10px;
    width: 30px;
    height: 30px;
  }
  /* Active Search tab reads like the other active tabs. */
  body.mobile-search-open .mobile-tab#mobileSearchBtn {
    color: var(--gold-bright);
    background: color-mix(in srgb, var(--gold) 14%, var(--surface));
    box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--gold) 22%, transparent);
  }
  body.mobile-search-open .mobile-tab#mobileSearchBtn svg { opacity: 1; }

  .card-grid { gap: var(--space-3); }
  .card {
    border-radius: var(--ios-sheet-radius);
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.07);
  }
  :root[data-theme="dark"] .card {
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.22);
  }
  .card:active {
    transform: scale(0.985);
    transition-duration: 0.1s;
  }

  /* Bottom sheets — inset float + grab handle (iOS sheet idiom). */
  #modeMenu.dropdown-menu,
  .mode-select-wrap .dropdown-menu {
    position: fixed;
    left: max(10px, env(safe-area-inset-left, 0px));
    right: max(10px, env(safe-area-inset-right, 0px));
    top: auto;
    bottom: var(--ios-chrome-above-tab);
    max-height: min(52vh, 420px);
    min-width: 0;
    width: auto;
    z-index: 1300;
    border-radius: var(--ios-sheet-radius);
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18);
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    overscroll-behavior: contain;
    padding: 6px 8px 10px;
  }
  #modeMenu.dropdown-menu::before,
  .mobile-look-sheet::before {
    content: "";
    display: block;
    width: 36px;
    height: 5px;
    margin: 2px auto 8px;
    border-radius: var(--ios-pill-radius);
    background: color-mix(in srgb, var(--text-muted) 32%, transparent);
  }
  #modeMenu.dropdown-menu li,
  .mode-select-wrap .dropdown-menu li {
    min-height: 44px;
    border-radius: 10px;
    font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", var(--font-display), system-ui, sans-serif;
    font-size: 0.9375rem;
    font-weight: 500;
  }
  .region-select-wrap .dropdown-menu {
    position: fixed;
    left: max(10px, env(safe-area-inset-left, 0px));
    right: max(10px, env(safe-area-inset-right, 0px));
    top: calc(var(--header-h, 120px) + 8px);
    bottom: auto;
    max-height: min(58vh, 480px);
    min-width: 0;
    width: auto;
    z-index: 1300;
    border-radius: var(--ios-sheet-radius);
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18);
    padding: 6px 8px 10px;
  }
  .region-select-wrap .dropdown-menu::before {
    content: "";
    display: block;
    width: 36px;
    height: 5px;
    margin: 2px auto 8px;
    border-radius: var(--ios-pill-radius);
    background: color-mix(in srgb, var(--text-muted) 32%, transparent);
  }
  /* Two columns at phone width — long labels wrap with a hanging indent so
     the continuation line reads as the same entry, not a new row. */
  .region-select-wrap .region-columns {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 2px 8px;
    align-items: start;
  }
  .region-select-wrap .region-column {
    flex: unset;
    min-width: 0;
    width: auto;
  }
  .region-select-wrap .dropdown-menu li {
    min-height: 0;
    border-radius: 10px;
    padding-top: 7px;
    padding-bottom: 7px;
    line-height: 1.28;
  }
  .region-select-wrap .dropdown-menu li.is-meta {
    display: flex;
    align-items: center;
    min-height: 36px;
    padding-top: 8px;
    padding-bottom: 8px;
    font-size: 0.68rem;
    letter-spacing: 0.12em;
  }
  .region-select-wrap .dropdown-menu li.is-region {
    display: block;
    padding-left: 10px;
    padding-right: 8px;
    padding-top: 6px;
    padding-bottom: 6px;
    font-size: 0.8125rem;
    white-space: normal;
    overflow-wrap: break-word;
    word-break: normal;
    hyphens: manual;
  }
  .region-select-wrap .dropdown-menu li.is-region > span {
    display: block;
    /* Same small hang as desktop — first line flush, wraps inset. */
    padding-left: 0.7em;
    text-indent: -0.7em;
    line-height: 1.22;
  }
  /* Entry-to-entry gap larger than wrap-line gap (1.22 × font). */
  .region-select-wrap .dropdown-menu li.is-region + li.is-region {
    margin-top: 3px;
  }
  .region-select-wrap .dropdown-menu li.is-meta + li.is-region {
    margin-top: 3px;
  }

  /* Map: edge-to-edge, layer panel compact. */
  body.is-map-mode .results {
    padding: 0;
    --map-edge-pad: 0px;
  }
  body.is-map-mode .map-view .map-container,
  body.is-map-mode .map-container {
    border-radius: 0;
    border-left: none;
    border-right: none;
    min-height: 0;
    flex: 1 1 auto;
    height: auto;
  }
  .map-layer-panel {
    top: 6px;
    left: 6px;
    right: 6px;
    max-width: none;
    max-height: 38vh;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    padding: 6px 8px 7px;
  }
  .map-layer-panel-title { font-size: 0.62rem; margin-bottom: 5px; }
  .map-layer-chip { font-size: 0.72rem; padding: 4px 8px; gap: 4px; }
  .map-layer-chip-dot { width: 8px; height: 8px; }

  /* Map POI control — 44px thumb target; dropdown scrolls above tab bar. */
  .map-poi-anchor { top: 8px; right: 8px; left: auto; }
  .map-poi-button {
    min-height: 44px;
    padding: 10px 14px;
    font-size: 0.75rem;
  }
  .map-poi-button-label { max-width: 8.25rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .map-poi-dropdown {
    right: 0;
    left: auto;
    min-width: min(94vw, 340px);
    max-height: min(34vh, calc(100dvh - var(--header-h, 120px) - var(--ios-chrome-above-tab) - 32px));
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
  }
  .map-poi-dropdown-head {
    font-size: 0.72rem;
    margin-bottom: 6px;
  }
  .map-poi-dropdown .map-layer-chip {
    min-height: 44px;
    padding: 8px 10px;
  }

  /* Pinch-to-zoom is standard on iOS — hide +/- to reclaim the top-left corner. */
  body.is-map-mode .leaflet-control-zoom {
    display: none !important;
  }
  body.is-map-mode .leaflet-control-attribution {
    font-size: 0.58rem;
    line-height: 1.25;
    max-width: calc(100% - 6px);
  }

  /* Map Mode on narrow phones: icon-only header brand so region label fits. */
  @media (max-width: 374px) {
    body.is-map-mode .mobile-header-brand-text {
      display: none;
    }
    body.is-map-mode .mobile-header-brand {
      max-width: 32px;
      gap: 0;
      padding: 0;
    }
    .map-poi-button {
      padding: 8px 11px;
      font-size: 0.7rem;
    }
    .map-poi-button-label { max-width: 6.75rem; }
  }

  /* Edge-to-edge map on phone — drop decorative frame corners. */
  body.is-map-mode .map-corner { display: none; }
  body.is-map-mode .map-mount-frame { border-width: 0; }

  /* Hotel pin plates — narrower on small screens to reduce overlap crowding. */
  body.atlas-pin-labels-on .atlas-pin-label--hotel .atlas-pin-label-plate {
    max-width: min(200px, calc(100vw - 48px));
    padding: 4px 9px 6px;
  }
  body.atlas-pin-labels-on .atlas-poi-label .atlas-poi-label-plate {
    max-width: min(158px, calc(100vw - 56px));
  }
  body.atlas-pin-labels-on .atlas-poi-label .atlas-poi-label-name {
    font-size: 0.68rem;
    line-height: 1.12;
  }
  body.atlas-pin-labels-on .atlas-pin-label .atlas-pin-label-name {
    font-size: 0.78rem;
    line-height: 1.15;
  }
  body.atlas-pin-labels-on .atlas-pin-label .atlas-pin-label-meta {
    font-size: 0.62rem;
  }
  @media (max-width: 374px) {
    body.atlas-pin-labels-on .atlas-pin-label--hotel .atlas-pin-label-plate {
      max-width: min(172px, calc(100vw - 40px));
      padding: 3px 8px 5px;
    }
    body.atlas-pin-labels-on .atlas-poi-label .atlas-poi-label-plate {
      max-width: min(138px, calc(100vw - 48px));
    }
    body.atlas-pin-labels-on .atlas-pin-label .atlas-pin-label-name {
      font-size: 0.74rem;
    }
  }

  /* Modal: full viewport + safe areas (iOS sheet feel). */
  .modal-backdrop { padding: 0; align-items: stretch; }
  .modal {
    width: 100%;
    max-width: 100%;
    max-height: 100dvh;
    height: 100dvh;
    margin: 0;
    border-radius: 0;
  }
  .modal-content {
    padding:
      calc(var(--space-4) + env(safe-area-inset-top, 0px))
      var(--space-4)
      calc(var(--space-5) + env(safe-area-inset-bottom, 0px));
  }
  .filters-backdrop {
    z-index: 1240;
    backdrop-filter: blur(3px);
    -webkit-backdrop-filter: blur(3px);
  }

  .filters-panel {
    top: calc(var(--header-h, 120px) + 8px);
    left: max(10px, env(safe-area-inset-left, 0px));
    right: max(10px, env(safe-area-inset-right, 0px));
    width: auto;
    max-height: calc(100dvh - var(--header-h, 120px) - var(--ios-chrome-above-tab) - 8px);
    z-index: 1250;
    border-radius: var(--ios-sheet-radius);
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18);
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
  }
  .filters-panel-inner {
    padding: 8px 14px 16px;
  }
  .filters-panel-head {
    padding-top: 4px;
  }
  .filters-panel::before {
    content: "";
    display: block;
    width: 36px;
    height: 5px;
    margin: 8px auto 4px;
    border-radius: var(--ios-pill-radius);
    background: color-mix(in srgb, var(--text-muted) 32%, transparent);
  }
  .filter-chip {
    border-radius: var(--ios-pill-radius);
    min-height: 36px;
    padding: 8px 14px;
    font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", var(--font-body), system-ui, sans-serif;
    font-size: 0.8125rem;
    font-weight: 500;
  }
  .filters-active-pill {
    border-radius: var(--ios-pill-radius);
    font-size: 0.75rem;
    padding: 0.35rem 0.65rem;
  }

  /* Look sheet — compact iPhone-style taps (theme orb + era grid). */
  .mobile-look-panel[hidden] {
    display: none !important;
  }
  .mobile-look-panel:not([hidden]) {
    display: block;
  }
  .mobile-look-scrim {
    position: fixed;
    inset: 0;
    z-index: 1295;
    background: rgba(0, 0, 0, 0.42);
    backdrop-filter: blur(4px);
    -webkit-backdrop-filter: blur(4px);
  }
  .mobile-look-sheet {
    position: fixed;
    left: max(10px, env(safe-area-inset-left, 0px));
    right: max(10px, env(safe-area-inset-right, 0px));
    bottom: var(--ios-chrome-above-tab);
    z-index: 1301;
    padding: 6px 12px 12px;
    border: 1px solid color-mix(in srgb, var(--border-strong) 70%, transparent);
    border-radius: var(--ios-sheet-radius);
    background: color-mix(in srgb, var(--bg-sunken) 97%, var(--surface));
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18);
  }
  .mobile-look-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
    margin-bottom: 8px;
    padding-bottom: 6px;
    border-bottom: 1px solid var(--hairline);
  }
  .mobile-look-title {
    margin: 0;
    font-family: var(--font-display);
    font-size: 0.72rem;
    font-weight: 800;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--gold-bright);
  }
  .mobile-look-close {
    min-width: 44px;
    min-height: 44px;
    padding: 0;
    border: none;
    border-radius: var(--ios-pill-radius);
    background: color-mix(in srgb, var(--text) 8%, transparent);
    color: var(--text-muted);
    font-size: 1.25rem;
    line-height: 1;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
  }
  .mobile-look-control + .mobile-look-control {
    margin-top: 10px;
  }
  .mobile-look-control-label {
    display: block;
    margin-bottom: 6px;
    font-family: var(--font-display);
    font-size: 0.58rem;
    font-weight: 700;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--text-muted);
  }
  /* Compact sun/moon orb — same family as header .theme-toggle */
  .mobile-look-theme-row {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    min-height: 44px;
    padding: 4px 8px;
    margin: 0 auto;
    border-radius: var(--ios-control-radius);
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
    user-select: none;
    touch-action: manipulation;
  }
  .mobile-look-theme-btn.theme-toggle {
    display: inline-flex !important;
    width: 44px;
    height: 44px;
    flex-shrink: 0;
    pointer-events: auto;
    -webkit-tap-highlight-color: transparent;
    touch-action: manipulation;
    border: 1.5px solid var(--gold);
    box-shadow:
      0 1px 0 color-mix(in srgb, #fff 20%, transparent) inset,
      0 2px 5px color-mix(in srgb, var(--text) 12%, transparent);
    transition: transform 0.12s ease, box-shadow 0.12s ease, background 0.14s ease, border-color 0.14s ease;
  }
  /* Kill sticky-hover rotate on touch so the press state can land. */
  .mobile-look-theme-btn.theme-toggle:hover {
    transform: none;
    background: var(--surface);
    box-shadow:
      0 1px 0 color-mix(in srgb, #fff 20%, transparent) inset,
      0 2px 5px color-mix(in srgb, var(--text) 12%, transparent);
  }
  .mobile-look-theme-row.is-pressed .mobile-look-theme-btn.theme-toggle,
  .mobile-look-theme-btn.theme-toggle:active,
  .mobile-look-theme-btn.theme-toggle.is-pressed {
    transform: scale(0.88);
    background: color-mix(in srgb, var(--text) 10%, var(--surface));
    box-shadow: inset 0 2px 8px color-mix(in srgb, var(--text) 28%, transparent);
  }
  .mobile-look-theme-hint {
    font-family: var(--font-body);
    font-size: 0.8125rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    color: var(--text);
    min-width: 2.5rem;
    pointer-events: none;
  }
  /* Era style — 2×2 pressable tiles (iOS Settings–like) */
  .mobile-look-era-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 8px;
  }
  .mobile-look-era-btn {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 3px;
    min-height: 52px;
    padding: 8px 6px;
    border: 2px solid color-mix(in srgb, var(--gold) 78%, var(--text) 22%);
    border-radius: var(--ios-control-radius);
    background: var(--surface);
    color: var(--text);
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
    touch-action: manipulation;
    user-select: none;
    box-shadow:
      0 1px 0 color-mix(in srgb, #fff 18%, transparent),
      0 2px 5px color-mix(in srgb, var(--text) 10%, transparent);
    transition: border-color 0.14s ease, background 0.14s ease, transform 0.12s ease, box-shadow 0.12s ease;
  }
  .mobile-look-era-btn:active,
  .mobile-look-era-btn.is-pressed {
    transform: scale(0.94);
    box-shadow: inset 0 2px 8px color-mix(in srgb, var(--text) 22%, transparent);
  }
  .mobile-look-era-btn.is-active {
    border-color: var(--gold-bright);
    background: color-mix(in srgb, var(--gold) 16%, var(--surface));
    box-shadow:
      0 0 0 1px color-mix(in srgb, var(--gold) 45%, transparent),
      0 1px 0 color-mix(in srgb, #fff 18%, transparent);
  }
  .mobile-look-era-btn.is-active:active,
  .mobile-look-era-btn.is-active.is-pressed {
    box-shadow: inset 0 2px 8px color-mix(in srgb, var(--text) 22%, transparent);
  }
  .mobile-look-era-jewel {
    display: block;
    width: 22px;
    height: 22px;
    object-fit: contain;
    filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.22));
    pointer-events: none;
  }
  .mobile-look-era-name {
    font-family: var(--font-body);
    font-size: 0.62rem;
    font-weight: 600;
    letter-spacing: 0.02em;
    line-height: 1.2;
    text-align: center;
    color: var(--text-muted);
  }
  .mobile-look-era-btn.is-active .mobile-look-era-name {
    color: var(--gold-bright);
  }
  body.mobile-look-open .mobile-tab#mobileLookBtn {
    color: var(--gold-bright);
    background: color-mix(in srgb, var(--gold) 12%, transparent);
  }

  /* DIRECTORY-MODE mobile — thumb targets, scroll region, compact chrome */
  body.is-directory-mode .results {
    padding-left: max(8px, env(safe-area-inset-left, 0px));
    padding-right: max(8px, env(safe-area-inset-right, 0px));
  }
  body.is-directory-mode .site-footer {
    display: none !important;
  }
  body.is-directory-mode .directory-view {
    padding-top: 2px;
    padding-bottom: 0;
    max-width: none;
  }
  body.is-directory-mode .directory-frame {
    display: flex;
    flex-direction: column;
    max-height: calc(100dvh - var(--header-h, 56px) - var(--ios-chrome-above-tab) - 4px);
    overflow: hidden;
    padding: 10px 10px 12px;
    border-radius: 10px;
  }
  body.is-directory-mode .directory-header {
    flex-shrink: 0;
    margin-bottom: 8px;
    gap: 8px;
  }
  body.is-directory-mode .directory-header-actions {
    gap: 6px;
  }
  body.is-directory-mode .directory-toolbar {
    flex-shrink: 0;
  }
  body.is-directory-mode .directory-filigree-top,
  body.is-directory-mode .directory-filigree-bottom {
    display: none;
  }
  /* DIRECTORY-TITLE-REMOVE-2026: eyebrow now carries the header (title is
     visually hidden at all widths), so it stays visible on phone too — the
     old display:none here would leave a blank header band. */
  body.is-directory-mode .directory-eyebrow {
    font-size: 0.875rem;
    padding-bottom: 6px;
    margin-bottom: 4px;
  }
  body.is-directory-mode .directory-eyebrow::after {
    width: 34px;
  }
  body.is-directory-mode .directory-context {
    font-size: 0.75rem;
    letter-spacing: 0.03em;
    margin-top: 2px;
  }
  body.is-directory-mode .directory-count {
    font-size: 0.72rem;
    text-align: left;
    margin: 0;
  }
  body.is-directory-mode .directory-toolbar {
    flex-direction: column;
    align-items: stretch;
    gap: 8px;
    margin-bottom: 8px;
  }
  body.is-directory-mode .directory-layout-toggle {
    width: 100%;
  }
  body.is-directory-mode .directory-layout-btn {
    flex: 1;
    justify-content: center;
    font-size: 0.8125rem;
    padding: 0 10px;
    min-height: 44px;
  }
  body.is-directory-mode .directory-filter-wrap {
    flex: 1 1 auto;
    max-width: none;
    width: 100%;
    margin-left: 0;
  }
  body.is-directory-mode .directory-filter {
    font-size: 1rem;
  }
  body.is-directory-mode .directory-filter-clear {
    width: 44px;
    height: 44px;
  }
  body.is-directory-mode .directory-scroll {
    flex: 1 1 auto;
    min-height: 0;
    max-height: none;
    -webkit-overflow-scrolling: touch;
    overscroll-behavior-y: contain;
    margin: 0;
    padding: 6px 6px 8px;
    border-radius: 8px;
  }
  body.is-directory-mode .directory-tree {
    font-size: 1rem;
  }
  body.is-directory-mode .directory-folder--depth-0 > .directory-folder-summary {
    font-size: 1.05rem;
  }
  body.is-directory-mode .directory-folder--depth-1 > .directory-folder-summary {
    font-size: 0.975rem;
  }
  body.is-directory-mode .directory-folder-summary {
    min-height: 44px;
    align-items: center;
    padding-top: 8px;
    padding-bottom: 8px;
    -webkit-tap-highlight-color: transparent;
  }
  body.is-directory-mode .directory-folder-namegroup {
    flex: 1;
    min-width: 0;
    overflow: hidden;
  }
  body.is-directory-mode .directory-folder-label {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    min-width: 0;
  }
  body.is-directory-mode .directory-tree-action {
    min-height: 44px;
    padding: 10px 8px;
    display: inline-flex;
    align-items: center;
    -webkit-tap-highlight-color: transparent;
  }
  body.is-directory-mode .directory-hotel-row {
    padding: 10px 12px;
    margin: 6px 0;
    gap: 6px 10px;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
  }
  body.is-directory-mode .directory-hotel-headline {
    width: 100%;
    align-items: center;
  }
  body.is-directory-mode .directory-hotel-name {
    min-height: 44px;
    display: flex;
    align-items: center;
    padding: 4px 0;
    font-size: 1rem;
    -webkit-tap-highlight-color: transparent;
  }
  body.is-directory-mode .directory-hotel-meta {
    font-size: 0.8125rem;
  }
  body.is-directory-mode .directory-hotel-stats {
    font-size: 0.8125rem;
    gap: 4px 8px;
  }
  body.is-directory-mode .directory-stat--founded,
  body.is-directory-mode .directory-stat--award {
    display: none;
  }
  body.is-directory-mode .directory-folder-children {
    padding-left: 8px;
    margin-left: 4px;
  }

  /* COUNTRY-MODE-1 mobile — brochure scrolls above mode cue, not under tab bar */
  body.is-country-mode .mobile-tabbar {
    display: none !important;
  }
  body.is-country-mode {
    padding-bottom: 0;
  }
  body.is-country-mode .results {
    padding-left: max(8px, env(safe-area-inset-left, 0px));
    padding-right: max(8px, env(safe-area-inset-right, 0px));
  }
  body.is-country-mode .cm-exit {
    min-height: 44px;
    padding: 10px 16px;
    -webkit-tap-highlight-color: transparent;
  }
  body.is-country-mode .cm-chrome {
    margin: 0 0 10px;
    padding: 6px 0 8px;
  }
  body.is-country-mode .cm-brochure {
    padding: 6px 0 calc(52px + env(safe-area-inset-bottom, 0px));
  }
  body.is-country-mode .cm-sheet {
    padding: 14px 12px 18px;
    border-radius: 0;
    border-left: none;
    border-right: none;
    max-width: none;
  }
  body.is-country-mode .cm-deckle {
    display: none;
  }
  body.is-country-mode .cm-masthead {
    margin: 0 0 12px;
  }
  body.is-country-mode .cm-title {
    font-size: clamp(1.3rem, 5.2vw, 1.65rem);
    line-height: 1.15;
  }
  body.is-country-mode .cm-dek {
    font-size: 0.86rem;
    line-height: 1.45;
    padding: 0 4px;
  }
  body.is-country-mode .cm-proto-note {
    font-size: 0.7rem;
    line-height: 1.4;
  }
  body.is-country-mode .cm-map-hero-img {
    width: 100%;
    max-height: min(42vh, 280px);
    object-fit: cover;
  }
  body.is-country-mode .cm-country-plate {
    text-align: left;
  }
  body.is-country-mode .cm-plate-name {
    font-size: 1.05rem;
  }
  body.is-country-mode .cm-back {
    min-height: 44px;
    display: inline-flex;
    align-items: center;
    padding: 10px 0;
    -webkit-tap-highlight-color: transparent;
  }
  body.is-country-mode .cm-city-chip {
    min-height: 44px;
    padding: 10px 16px;
    -webkit-tap-highlight-color: transparent;
  }
  body.is-country-mode .cm-reveal {
    min-height: 44px;
  }
  body.is-country-mode .cm-scene {
    text-align: left;
    max-width: none;
    margin-bottom: 22px;
    padding: 0 2px;
  }
  body.is-country-mode .cm-scene-prose {
    font-size: 0.92rem;
    line-height: 1.55;
    text-align: left;
  }
  body.is-country-mode .cm-toplist-title {
    font-size: clamp(1.25rem, 5vw, 1.55rem);
  }
  body.is-country-mode .cm-hotel-plate.is-matched {
    -webkit-tap-highlight-color: transparent;
  }
  body.is-country-mode .cm-hotel-plate.is-matched .cm-plate-body {
    min-height: 44px;
  }
  body.is-country-mode .cm-watch summary {
    min-height: 44px;
    display: flex;
    align-items: center;
  }

  /* COUNTRY-MODE-2 mobile — full-screen overlay hides tab bar + cue */
  html.cm2-open .mobile-tabbar,
  html.cm2-open .mobile-mode-cue {
    display: none !important;
  }

  /* ── MOBILE-IPHONE-EXTREMES-2026 ─────────────────────────────────────────
     Tailored polish for iPhone SE (375×667) and iPhone 16 Pro Max (440×763).
     ─────────────────────────────────────────────────────────────────────── */

  /* MAP-CONTROLS-PHONE-2026: POI chooser sits TOP-RIGHT (matching desktop); the
     Box Size stepper sits BOTTOM-LEFT (matching desktop). `.map-view` already
     insets the canvas by `--ios-chrome-above-tab`, so these overlays only need
     a small slice of padding above the floating tab bar — do not add the
     chrome offset again (that stacked a large empty band of map).
     MOBILE-IPHONE-2026: override the shared --map-frame-inset tokens rather
     than a one-off `right:` on TIERS (that is how desktop clipped twice). */
  body.is-map-mode .map-mount-frame {
    --map-frame-inset: max(10px, env(safe-area-inset-left, 0px), env(safe-area-inset-right, 0px));
    --map-frame-inset-bottom: 4px;
  }
  body.is-map-mode .map-poi-anchor {
    top: 10px;
    bottom: auto;
    right: max(10px, env(safe-area-inset-right, 0px));
    left: auto;
  }
  body.is-map-mode .map-plaque-size-control {
    padding: 7px 9px 8px;
  }
  body.is-map-mode .map-plaque-size-btn {
    flex: 0 0 44px;
    min-width: 44px;
    width: 44px;
    min-height: 44px;
    height: 44px;
  }
  body.is-map-mode .map-plaque-dock {
    bottom: calc(var(--ios-chrome-above-tab) + 12px);
    width: min(calc(100% - 24px), 300px);
  }
  body.is-map-mode .map-plaque-dock__close {
    width: 44px;
    height: 44px;
    top: -14px;
    right: -10px;
    font-size: 1.28rem;
  }
  /* MAP-TIER-TOGGLE-2026: stays bottom-right (matching desktop). Same 4px
     slice as Box Size — `.map-view` already clears the tab bar. Phone chips
     sit in a 3×2 grid (not 4-then-2 wrap) and are a hair larger than the
     previous 28×26 so the Roman numerals stay thumb-legible on SE.
     MOBILE-IPHONE-2026: position comes from --map-frame-inset on the frame. */
  body.is-map-mode .map-tier-toggle-control {
    padding: 6px 8px 7px;
  }
  body.is-map-mode .map-tier-toggles {
    display: grid;
    grid-template-columns: repeat(3, auto);
    justify-content: center;
    gap: 5px;
    max-width: none;
  }
  body.is-map-mode .map-tier-toggle {
    flex: none;
    width: 32px;
    min-width: 32px;
    height: 30px;
    min-height: 30px;
    font-size: 0.72rem;
  }
  body.is-map-mode .map-poi-button {
    min-height: 44px;
    padding: 10px 16px;
    font-size: 0.875rem;
    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2);
  }
  body.is-map-mode .map-poi-dropdown {
    top: calc(100% + 8px);
    bottom: auto;
    right: 0;
    left: auto;
    min-width: min(calc(100vw - 20px), 360px);
    max-height: min(60vh, 440px);
    overflow-y: auto;
  }

  /* Short viewports (SE class height) — compress hero so first card peeks above tab bar. */
  @media (max-height: 700px) {
    .hero.hero--editorial {
      padding: 0.42rem var(--space-3) 0.48rem;
    }
    .hero--editorial .hero-inner.hero-grid {
      gap: 0.42rem;
    }
    /* Owner-mandated: keep a minimum of 4 deals even on short SE-class
       viewports (the base phone rule already caps at 4 — no extra hiding). */
    .hero-scroll-nudge {
      margin-top: 0.25rem;
    }
  }

  /* Narrow width (SE / mini band) — tighter teaser + toolbar legibility. */
  @media (max-width: 375px) {
    .hero-rail .cheapest-teaser {
      column-gap: 0.45rem;
    }
    .hero-rail .cheapest-teaser-name,
    .hero-rail .cheapest-teaser-name--link {
      font-size: 0.78rem;
      -webkit-line-clamp: 1;
    }
    .hero-rail .cheapest-teaser-loc {
      -webkit-line-clamp: 1;
      font-size: 0.64rem;
    }
    .toolbar-inner {
      padding: 7px 8px;
      gap: 6px;
    }
    .toolbar .filter-select {
      font-size: 0.75rem;
      padding: 8px 22px 8px 8px;
    }
    .toolbar .filter-search-input {
      font-size: 0.8125rem;
      padding: 8px 20px 8px 30px;
    }
    body.is-directory-mode .directory-eyebrow {
      font-size: 0.8125rem;
    }
    body.is-directory-mode .directory-frame {
      padding: 8px 8px 10px;
    }
  }

  /* Large iPhone portrait (Plus / Pro Max — 428px+ width band). */
  @media (min-width: 428px) {
    :root {
      --ios-tabbar-h-phone: 56px;
    }
    .mobile-tab {
      font-size: 0.68rem;
      gap: 3px;
      padding: 5px 6px;
    }
    .mobile-tab svg {
      width: 22px;
      height: 22px;
    }
    .mobile-header-brand {
      max-width: min(54vw, 160px);
    }
    .mobile-header-brand-icon {
      width: 36px;
      height: 36px;
    }
    .mobile-header-brand-line {
      font-size: clamp(1.02rem, 3.75vw, 1.18rem);
    }
    .hero-lead .hero-stats--masthead .hero-stat-num {
      font-size: clamp(1.38rem, 4.6vw, 1.65rem);
    }
    .hero-lead .hero-stats--masthead .hero-stat-label {
      font-size: clamp(0.6rem, 2.1vw, 0.68rem);
      letter-spacing: 0.11em;
    }
    .hero-rail .cheapest-teaser-title {
      font-size: 0.76rem;
    }
    .results {
      padding-left: max(14px, env(safe-area-inset-left, 0px));
      padding-right: max(14px, env(safe-area-inset-right, 0px));
    }
    .card-grid {
      gap: var(--space-4);
    }
    .results-header .results-heading {
      font-size: clamp(1.18rem, 4.5vw, 1.48rem);
    }
    body.is-directory-mode .directory-eyebrow {
      font-size: 0.9375rem;
    }
    body.is-directory-mode .directory-frame {
      padding: 12px 14px 14px;
      border-radius: 12px;
    }
    body.is-directory-mode .directory-tree {
      font-size: 1.02rem;
    }
    body.is-map-mode .map-poi-button-label {
      max-width: 11rem;
    }
  }
}

@media (max-width: 390px) {
  :root[data-era="belleepoque"] .hero-wordmark-art,
  :root[data-era="artdeco"] .hero-wordmark-art,
  :root[data-era="midcentury"] .hero-wordmark-art,
  :root[data-era="editorial"] .hero-wordmark-art {
    --wordmark-art-h: clamp(56px, 16vw, 88px);
  }
  .hero-lead-brand .hero-wordmark-art {
    max-height: min(var(--wordmark-art-h, 88px), 18vh);
  }
  .mobile-header-brand { max-width: min(56vw, 160px); }
  .mobile-header-brand-icon { width: 32px; height: 32px; }
  .mobile-header-brand-line { font-size: clamp(0.9rem, 4vw, 1.02rem); }
}

/* ============================================================================
   IPAD-TABLET-2026 — iPad / tablet only (700px–1380px; phone + desktop untouched)
   Apple-first UI chrome: SF Pro controls, 44pt taps, sheet radii, safe areas.
   Tuned for iPad Pro 11"/12.9"/13" portrait and landscape.
   ============================================================================ */

@media (min-width: 700px) and (max-width: 1380px) {
  :root {
    --ipad-sheet-radius: 16px;
    --ipad-control-radius: 12px;
    --ipad-content-gutter: max(20px, env(safe-area-inset-left, 0px));
    --font-ui: -apple-system, BlinkMacSystemFont, "SF Pro Text", "SF Pro Display", system-ui, sans-serif;
  }

  html {
    -webkit-text-size-adjust: 100%;
  }
  body {
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
  }

  /* Navigation bar — iOS material + safe-area side inset */
  .site-header {
    padding-left: env(safe-area-inset-left, 0px);
    padding-right: env(safe-area-inset-right, 0px);
    background: color-mix(in srgb, var(--bg-sunken) 86%, transparent);
    backdrop-filter: saturate(180%) blur(20px);
    -webkit-backdrop-filter: saturate(180%) blur(20px);
  }
  .header-grid {
    padding-left: max(var(--space-4), var(--ipad-content-gutter));
    padding-right: max(var(--space-4), env(safe-area-inset-right, 0px), var(--ipad-content-gutter));
  }

  /* Chrome controls — rounded rects, system type, 44pt minimum */
  .region-select,
  .mode-select,
  .filters-button,
  .view-toggle {
    border-radius: var(--ipad-control-radius);
    font-family: var(--font-display);
    font-size: var(--header-control-fs);
    min-height: var(--header-control-h);
    height: var(--header-control-h);
    -webkit-tap-highlight-color: transparent;
  }
  .region-select {
    padding: 0 var(--header-control-pad-x);
    font-weight: 600;
    letter-spacing: 0.02em;
    box-shadow: none;
  }
  .theme-toggle,
  .jewel-toggle {
    width: var(--header-control-h);
    height: var(--header-control-h);
    min-width: var(--header-control-h);
    min-height: var(--header-control-h);
    -webkit-tap-highlight-color: transparent;
  }

  /* Popovers — inset grouped lists (region / mode menus) */
  .dropdown-menu {
    border-radius: var(--ipad-sheet-radius);
    padding: 8px;
    box-shadow:
      0 8px 32px rgba(0, 0, 0, 0.18),
      0 0 0 0.5px color-mix(in srgb, var(--border-strong) 35%, transparent);
  }
  .dropdown-menu li {
    min-height: 44px;
    border-radius: 10px;
    font-family: var(--font-ui);
    font-size: 0.9375rem;
    padding: 10px 14px;
  }

  /* Filters sheet — grab handle + softer shadow */
  .filters-backdrop {
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
  }
  .filters-panel {
    border-radius: var(--ipad-sheet-radius);
    box-shadow: 0 12px 40px rgba(0, 0, 0, 0.2);
    width: min(680px, calc(100vw - max(32px, env(safe-area-inset-left, 0px) + env(safe-area-inset-right, 0px) + 16px)));
    left: max(16px, calc((100vw - min(680px, 100vw - 32px)) / 2));
  }
  .filters-panel::before {
    content: "";
    display: block;
    width: 36px;
    height: 5px;
    margin: 10px auto 4px;
    border-radius: 999px;
    background: color-mix(in srgb, var(--text-muted) 28%, transparent);
  }
  .filters-panel-inner {
    padding-top: 2px;
  }
  /* This is the iPad/tablet TOUCH breakpoint (see "44pt minimum" comment
     above and the sibling .dropdown-menu li / .theme-toggle rules in this
     same @media block, which all keep a 44px touch target) — a real finger
     taps these chips here, unlike the desktop chip above which has no
     min-height override at all because a mouse pointer has no minimum
     target-size requirement. Shrinking padding/font-size for visual density
     is fine; dropping below the WCAG 44\u00d744px touch-target minimum is not,
     so min-height stays at 44px here (bug fix: filter-chip touch-target
     regression review, 2026-08).  */
  .filter-chip {
    min-height: 44px;
    padding: 6px 10px;
    font-family: var(--font-ui);
    font-size: 0.75rem;
    font-weight: 500;
    -webkit-tap-highlight-color: transparent;
  }
  .filters-panel-close {
    min-width: 44px;
    min-height: 44px;
  }

  /* Sort/search shelf */
  .toolbar {
    border-bottom-left-radius: var(--ipad-sheet-radius);
    border-bottom-right-radius: var(--ipad-sheet-radius);
    backdrop-filter: saturate(180%) blur(20px);
    -webkit-backdrop-filter: saturate(180%) blur(20px);
  }
  .toolbar-inner {
    padding-left: max(var(--space-5), var(--ipad-content-gutter));
    padding-right: max(var(--space-5), env(safe-area-inset-right, 0px), var(--ipad-content-gutter));
  }
  .toolbar .filter-select,
  .toolbar .filter-search-input {
    min-height: 44px;
    border-radius: var(--ipad-control-radius);
    font-family: var(--font-ui);
    font-size: 0.9375rem;
  }

  /* Hero — tablet proportions (desktop min-heights fill entire viewport on iPad) */
  :root[data-era="belleepoque"] .hero-wordmark-art,
  :root[data-era="artdeco"] .hero-wordmark-art,
  :root[data-era="midcentury"] .hero-wordmark-art,
  :root[data-era="editorial"] .hero-wordmark-art {
    --wordmark-art-h: clamp(112px, 20vw, 200px);
  }
  :root[data-era="belleepoque"][data-theme="light"] .hero-wordmark-art {
    --wordmark-art-h: clamp(124px, 22vw, 216px);
  }
  .hero.hero--editorial {
    padding: clamp(0.5rem, 1.2vh, 0.85rem) max(var(--space-5), var(--ipad-content-gutter)) clamp(0.45rem, 1vh, 0.75rem);
  }
  .hero--editorial .hero-inner.hero-grid {
    gap: clamp(0.65rem, 1.8vw, 1.25rem);
  }
  .hero-lead-brand .hero-wordmark-art {
    min-height: 0;
    max-height: min(var(--wordmark-art-h, 200px), 36vh);
    height: var(--wordmark-art-h, clamp(112px, 20vw, 200px));
    flex: 0 1 auto;
  }
  .hero-lead-brand {
    flex: 0 1 auto;
    padding: 0.1rem 0 0.15rem;
  }
  .hero-rail .hero-filigree {
    height: clamp(32px, 4vw, 48px);
  }
  .hero-rail {
    border-top: 1px solid var(--rule-gold);
    padding-top: 0.4rem;
    margin-top: 0;
  }
  /* CHEAPEST-MIDWIDTH-2026: stack both weekend lists full-rail width.
     Side-by-side in a ~42% rail made columns ~180–220px — names wrapped to
     4+ lines and nowrap locations spilled across columns. Prefer two thicker
     stacked lists over one list or two squished columns. */
  .hero-rail .cheapest-teaser {
    display: block;
    max-width: none;
  }
  .hero-rail .cheapest-teaser > .cheapest-teaser-section:nth-of-type(1),
  .hero-rail .cheapest-teaser > .cheapest-teaser-section:nth-of-type(2) {
    grid-column: auto;
    grid-row: auto;
  }
  .hero-rail .cheapest-teaser-divider {
    display: block;
    height: 0;
    margin: clamp(0.45rem, 0.9vh, 0.7rem) 0;
  }
  .hero-rail .cheapest-teaser-section {
    overflow: hidden; /* contain name/loc wrapping inside soft panels */
  }
  .hero-scroll-nudge {
    position: relative;
    bottom: auto;
    margin: 0.3rem auto 0;
    padding: 3px 12px 2px;
  }
  .hero-scroll-nudge-label { font-size: 0.58rem; }
  .hero-lead .hero-stats--masthead .hero-stat-num {
    font-size: clamp(1.22rem, 3.2vw, 1.55rem);
  }
  .hero-lead .hero-stats--masthead .hero-stat-label {
    font-size: clamp(0.58rem, 1.6vw, 0.68rem);
  }

  /* Map — tighter inset frame; more canvas on tablet */
  body.is-map-mode {
    --map-edge-pad: 14px;
  }
  body.is-map-mode .map-mount {
    padding: 6px;
  }
  body.is-map-mode .map-corner {
    opacity: 0.88;
  }

  /* Directory — iPad-specific padding kept; viewport-lock itself now lives in
     DIRECTORY-VIEWPORT-LOCK-2026 (min-width: 700px, above) so it also covers
     this 700–1380px tablet band. The old min-height rule here fought that
     flex chain's min-height:0 (same specificity, later source order silently
     won), reintroducing slack that let the double scrollbar creep back in on
     iPad — removed rather than layered. */
  body.is-directory-mode .directory-view {
    padding-bottom: max(20px, env(safe-area-inset-bottom, 0px));
  }

  /* Brands Bazaar — full-bleed on tablet (no double header chrome) */
  html.bz-open .site-header,
  html.bz-open .toolbar {
    display: none !important;
  }
  html.bz-open .bz {
    top: 0 !important;
    z-index: 1400 !important;
  }

  /* Results gutter follows safe areas on large iPad */
  .results {
    padding-left: max(var(--space-5), var(--ipad-content-gutter));
    padding-right: max(var(--space-5), env(safe-area-inset-right, 0px), var(--ipad-content-gutter));
  }

  /* Cards — rounded plates, 2-up portrait / 3-up landscape iPad */
  .card {
    border-radius: var(--ipad-sheet-radius);
  }
  .card-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--space-4);
  }

  /* Modal — form-sheet inset (not edge-to-edge) */
  .modal-backdrop {
    padding:
      max(20px, env(safe-area-inset-top, 0px))
      max(20px, env(safe-area-inset-right, 0px))
      max(20px, env(safe-area-inset-bottom, 0px))
      max(20px, env(safe-area-inset-left, 0px));
  }
  .modal {
    border-radius: var(--ipad-sheet-radius);
    max-height: min(90vh, calc(100dvh - env(safe-area-inset-top, 0px) - env(safe-area-inset-bottom, 0px) - 40px));
  }
  .modal-close {
    width: 44px;
    height: 44px;
    min-width: 44px;
    min-height: 44px;
  }

  /* Map — soft inset frame; POI control matches iOS pill */
  body.is-map-mode .map-mount {
    border-radius: var(--ipad-sheet-radius);
    padding: 8px;
  }
  .map-poi-button {
    min-height: 44px;
    border-radius: 999px;
    font-family: var(--font-ui);
    font-size: 0.8125rem;
  }
  .map-poi-dropdown {
    border-radius: var(--ipad-sheet-radius);
  }
  body.is-map-mode .map-mount-frame {
    --map-frame-inset: max(14px, env(safe-area-inset-left, 0px), env(safe-area-inset-right, 0px));
    --map-frame-inset-bottom: max(14px, env(safe-area-inset-bottom, 0px));
  }
  body.is-map-mode .map-plaque-size-btn {
    flex: 0 0 44px;
    min-width: 44px;
    width: 44px;
    min-height: 44px;
    height: 44px;
  }
  body.is-map-mode .map-plaque-dock {
    bottom: max(20px, env(safe-area-inset-bottom, 0px));
    width: min(calc(100% - 40px), 320px);
  }
  body.is-map-mode .map-plaque-dock__close {
    width: 44px;
    height: 44px;
    top: -14px;
    right: -10px;
  }
}

/* iPad portrait / mini width — single-column hero so cards peek on first screen */
@media (min-width: 700px) and (max-width: 899.98px) {
  .hero--editorial .hero-inner.hero-grid {
    grid-template-columns: minmax(0, 1fr);
    gap: 0.55rem;
  }
  .hero-lead-brand .hero-wordmark-art {
    max-height: min(var(--wordmark-art-h, 168px), 28vh);
  }
  .card-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--space-4);
  }
}

/* iPad landscape / Pro width — third card column + side-by-side hero */
@media (min-width: 900px) and (max-width: 1380px) {
  .card-grid {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--space-5);
  }
  /* CHEAPEST-MIDWIDTH-2026: give the rail more horizontal room so stacked
     cheapest panels read thicker (was 58/42 — lists felt pencil-thin). */
  .hero--editorial .hero-inner.hero-grid {
    grid-template-columns: minmax(0, 46fr) minmax(0, 54fr);
  }
  :root[data-era="belleepoque"] .hero-wordmark-art,
  :root[data-era="artdeco"] .hero-wordmark-art,
  :root[data-era="midcentury"] .hero-wordmark-art,
  :root[data-era="editorial"] .hero-wordmark-art {
    --wordmark-art-h: clamp(128px, 16vw, 220px);
  }
  :root[data-era="belleepoque"][data-theme="light"] .hero-wordmark-art {
    --wordmark-art-h: clamp(140px, 18vw, 236px);
  }
  .hero-lead-brand .hero-wordmark-art {
    max-height: min(var(--wordmark-art-h, 220px), 42vh);
  }
}

/* CHEAPEST-MIDWIDTH-2026: do NOT reinstate side-by-side weekend columns below
   1380px — even at 1280 each column was ~260px and still felt squished.
   Stacked full-rail lists stay thicker; desktop >1380 already stacks. */

/* iPad landscape short height — compress hero rail so cards stay in view */
@media (min-width: 700px) and (max-width: 1380px) and (max-height: 860px) {
  .hero.hero--editorial {
    padding-top: 0.35rem;
    padding-bottom: 0.35rem;
  }
  .hero--editorial .hero-inner.hero-grid {
    gap: 0.5rem;
  }
  :root[data-era="belleepoque"] .hero-wordmark-art,
  :root[data-era="artdeco"] .hero-wordmark-art,
  :root[data-era="midcentury"] .hero-wordmark-art,
  :root[data-era="editorial"] .hero-wordmark-art {
    --wordmark-art-h: clamp(96px, 14vw, 168px);
  }
  .hero-lead-brand .hero-wordmark-art {
    max-height: min(var(--wordmark-art-h, 168px), 32vh);
  }
  .hero-rail .hero-filigree {
    height: clamp(28px, 3.5vw, 40px);
  }
}

/* Touch-primary tablet — skip hover lift (trackpad iPads still get hover) */
@media (min-width: 700px) and (max-width: 1380px) and (hover: none) {
  .region-select:hover,
  .card:hover,
  .theme-toggle:hover {
    transform: none;
  }
}

/* ============================================================================
   UC-AUTH-2026 — Under construction login gate (era × theme tokens).
   Overlay is created in app.js; credentials are never in CSS or client JS.
   Class names remain lha-dev-auth (cookie /api/dev-auth unchanged).
   ============================================================================ */
.lha-dev-auth {
  position: fixed;
  inset: 0;
  z-index: 1500;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px 16px;
  background: rgba(20, 17, 13, 0.82);
  background: color-mix(in srgb, var(--bg, #14110d) 78%, black);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  color: var(--text, #e9e2d3);
  font-family: var(--font-body, system-ui, sans-serif);
  box-sizing: border-box;
}
.lha-dev-auth[hidden] { display: none !important; }
html.dev-auth-open,
html.dev-auth-open body { overflow: hidden; }
.lha-dev-auth-card {
  width: min(420px, 100%);
  background: var(--surface, var(--bg-elevated, #1d1810));
  border: 1px solid var(--rule, var(--border-strong, #3a342a));
  border-radius: var(--radius-lg, 10px);
  box-shadow: var(--shadow-lg, 0 18px 48px rgba(0, 0, 0, 0.35));
  padding: 28px 24px 22px;
}
.lha-dev-auth-card h2 {
  font-family: var(--font-wordmark, Georgia, serif);
  font-size: clamp(22px, 4vw, 30px);
  font-weight: 700;
  margin: 0 0 6px;
  letter-spacing: 0.01em;
  line-height: 1.1;
}
.lha-dev-auth-sub {
  color: var(--muted, #a99f8c);
  font-size: 13px;
  line-height: 1.45;
  margin: 0 0 18px;
}
.lha-dev-auth-field {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin-bottom: 12px;
}
.lha-dev-auth-field label {
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--muted, #a99f8c);
}
.lha-dev-auth-field input {
  font: inherit;
  font-size: 16px; /* iOS: avoid zoom on focus */
  color: var(--text, #e9e2d3);
  background: var(--bg, #14110d);
  border: 1px solid var(--rule, #3a342a);
  border-radius: var(--radius-md, 6px);
  padding: 10px 12px;
  width: 100%;
  box-sizing: border-box;
}
.lha-dev-auth-field input:focus {
  outline: 2px solid var(--gold, #c6a766);
  outline-offset: 1px;
  border-color: var(--gold, #c6a766);
}
.lha-dev-auth-error {
  min-height: 1.3em;
  font-size: 13px;
  color: #d4795f;
  margin: 2px 0 12px;
}
.lha-dev-auth-error:empty { min-height: 0; margin-bottom: 8px; }
.lha-dev-auth-actions {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  align-items: center;
}
.lha-dev-auth-submit {
  font: inherit;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  cursor: pointer;
  border: 1px solid var(--gold, #c6a766);
  background: var(--gold, #c6a766);
  color: #1a160f;
  border-radius: var(--radius-md, 6px);
  padding: 10px 16px;
}
.lha-dev-auth-submit:hover { filter: brightness(1.05); }
.lha-dev-auth-submit:disabled { opacity: 0.45; cursor: not-allowed; }
.lha-dev-auth-cancel {
  font: inherit;
  font-size: 13px;
  cursor: pointer;
  border: 1px solid var(--rule, #3a342a);
  background: transparent;
  color: var(--text, #e9e2d3);
  border-radius: var(--radius-md, 6px);
  padding: 10px 16px;
}
.lha-dev-auth-cancel:hover { border-color: var(--gold, #c6a766); }

@media (max-width: 699.98px) {
  /* UC-AUTH-2026: keep fields above the floating tab bar on 375px iPhone. */
  .lha-dev-auth {
    align-items: flex-start;
    padding-top: max(24px, env(safe-area-inset-top, 0px));
    padding-bottom: calc(var(--ios-chrome-above-tab, 80px) + 16px);
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
  }
  .lha-dev-auth-card {
    margin-top: 12px;
    margin-bottom: 12px;
  }
}


/* ==========================================================================
   TIER-LEDGER-HOME-2026 — Card Mode landing
   ========================================================================== */
.hero--tier-home{min-height:auto;padding:clamp(1.5rem,3vw,3rem) max(var(--space-5),calc((100vw - var(--max-w))/2)) clamp(1rem,2.4vw,2rem)}
.home-landing-grid{width:100%;max-width:var(--max-w);margin:0 auto;display:grid;grid-template-columns:minmax(280px,.72fr) minmax(560px,1.28fr);gap:clamp(1.1rem,2.6vw,2.5rem);align-items:start}
.hero-field-guide{min-height:100%;display:flex;flex-direction:column;gap:clamp(.85rem,2vw,1.35rem);padding:clamp(.7rem,1.3vw,1rem);color:#f8f2e4;background:linear-gradient(145deg,rgba(255,255,255,.025),transparent 48%),#273a32;border:1px solid color-mix(in srgb,#d6bd82 35%,transparent);box-shadow:0 16px 38px color-mix(in srgb,#17241f 18%,transparent)}
:root[data-theme="dark"] .hero-field-guide{background:linear-gradient(145deg,rgba(255,255,255,.035),transparent 50%),#172720;border-color:color-mix(in srgb,#d6bd82 28%,transparent)}
.hero-field-guide-copy{display:flex;flex-direction:column;align-items:stretch}
.hero-field-guide-kicker,.tier-ledger-kicker,.home-gazette-kicker{font-family:var(--font-body);font-size:clamp(.65rem,.74vw,.76rem);font-weight:700;letter-spacing:.2em;line-height:1.2;text-transform:uppercase}
.hero-field-guide-kicker{color:#e0c173;margin-bottom:clamp(1rem,2.5vw,1.8rem)}
.hero-field-guide h1{max-width:none;margin:0;color:#fffaf0;font-family:var(--font-display);font-size:clamp(1.55rem,2.2vw,2.25rem);font-weight:500;letter-spacing:-.025em;line-height:.98;text-align:left}
.hero-field-guide p{max-width:none;margin:clamp(1rem,1.8vw,1.45rem) 0 0;color:#f6f0e2;font-family:var(--font-display);font-size:clamp(1.08rem,1.36vw,1.24rem);font-weight:500;line-height:1.55;text-align:left}
.hero-field-guide .hero-field-guide-note{margin-top:1rem;color:#e2d6b8;font-size:clamp(.84rem,.96vw,.96rem);font-style:italic;text-align:left}
.hero-field-guide .hero-field-guide-region{display:block;width:100%;max-width:none;margin:.55rem 0 0;color:#dfc16f;font-family:var(--font-wordmark,var(--font-serif,Georgia,serif));font-size:calc(var(--header-control-fs) * 1.38);font-style:normal;font-weight:700;letter-spacing:.01em;line-height:1.2;text-align:center}
.home-guide-stats{width:100%;margin-top:auto;display:grid;grid-template-columns:1fr auto 1fr auto 1fr;align-items:center;padding:.55rem 0;border-top:1px solid rgba(224,193,115,.42);border-bottom:1px solid rgba(224,193,115,.2);background:transparent}
.home-guide-stats .hero-stat{display:flex;flex-direction:column;align-items:center;gap:.12rem;min-width:0}
.hero--tier-home .home-guide-stats .hero-stat-num{color:#fff8e9;font-size:clamp(1.55rem,2.4vw,2.35rem);line-height:1}
.hero--tier-home .home-guide-stats .hero-stat-total{color:#cbb892;font-family:var(--font-display);font-size:clamp(.68rem,.82vw,.8rem);font-weight:500;letter-spacing:.04em;line-height:1.15}
.hero--tier-home .home-guide-stats .hero-stat-label{color:#d9caab;font-size:.88rem;letter-spacing:.06em;white-space:nowrap}
.home-guide-stats .hero-stat-divider{width:1px;height:3.35rem;margin:0;background:rgba(224,193,115,.28)}
.hero-tier-rail{min-width:0;display:grid;gap:clamp(1rem,1.8vw,1.5rem)}
.tier-ledger-panel{min-width:0;padding:clamp(.9rem,1.4vw,1.25rem);border:1px solid var(--rule-gold);background:color-mix(in srgb,var(--bg) 92%,white 8%);box-shadow:0 8px 24px color-mix(in srgb,var(--text) 7%,transparent)}
:root[data-theme="dark"] .tier-ledger-panel{background:color-mix(in srgb,var(--bg) 88%,white 4%)}
.tier-ledger-head{display:grid;grid-template-columns:minmax(190px,.75fr) minmax(230px,1.25fr);gap:1rem;align-items:end;padding:.15rem .25rem .8rem}
.tier-ledger-kicker{display:block;margin-bottom:.35rem;color:var(--gold)}
.tier-ledger-head h2{margin:0;color:var(--text);font-family:var(--font-display);font-size:clamp(1.65rem,2.35vw,2.4rem);font-weight:500;letter-spacing:-.02em;line-height:1.02}
.tier-ledger-head-meta{justify-self:stretch;text-align:right}
.tier-ledger-head-meta p{margin:0;color:var(--text-muted);font-family:var(--font-body);font-size:clamp(.72rem,.82vw,.84rem);line-height:1.4}
.tier-ledger-dates,.tier-ledger-status{display:inline-block;margin-top:.35rem;font-family:var(--font-body);font-size:.66rem;letter-spacing:.09em;text-transform:uppercase}
.tier-ledger-dates{color:var(--text-muted)}.tier-ledger-status{margin-left:.55rem;color:var(--gold)}.tier-ledger-status.is-zero{color:var(--text-faint)}
.tier-ledger-list{display:grid;gap:.42rem;margin:0;padding:0;list-style:none}
.tier-ledger-row{--tier-ledger-color:#6a4f17;min-width:0;display:grid;grid-template-columns:minmax(82px,.48fr) minmax(0,1.55fr) minmax(86px,auto);gap:clamp(.7rem,1.35vw,1.25rem);align-items:center;min-height:58px;padding:.55rem .75rem .55rem .9rem;border:1px solid color-mix(in srgb,var(--rule-gold) 72%,transparent);border-left:5px solid var(--tier-ledger-color);background:color-mix(in srgb,var(--bg) 95%,white 5%)}
:root[data-theme="dark"] .tier-ledger-row{background:color-mix(in srgb,var(--bg) 93%,white 3%)}
.tier-ledger-row--t1{--tier-ledger-color:#6a4f17}.tier-ledger-row--t2{--tier-ledger-color:#b8964e}.tier-ledger-row--t3{--tier-ledger-color:#e8b83a}.tier-ledger-row--t4{--tier-ledger-color:#1aa891}.tier-ledger-row--t5{--tier-ledger-color:#3f5fd6}.tier-ledger-row--t6{--tier-ledger-color:#8a4ec8}
:root[data-theme="dark"] .tier-ledger-row--t1{--tier-ledger-color:#d4c4a0}:root[data-theme="dark"] .tier-ledger-row--t2{--tier-ledger-color:#d4b56a}:root[data-theme="dark"] .tier-ledger-row--t3{--tier-ledger-color:#f5c84a}:root[data-theme="dark"] .tier-ledger-row--t4{--tier-ledger-color:#5ef0d4}:root[data-theme="dark"] .tier-ledger-row--t5{--tier-ledger-color:#a8bcff}:root[data-theme="dark"] .tier-ledger-row--t6{--tier-ledger-color:#d4b8ff}
.tier-ledger-row--t3{background:color-mix(in srgb,#e8b83a 11%,#fffdf8)}
.tier-ledger-row--t4{background:color-mix(in srgb,#1aa891 12%,#fffdf8)}
.tier-ledger-row--t5{background:color-mix(in srgb,#3f5fd6 16%,#fffdf8)}
.tier-ledger-row--t6{background:color-mix(in srgb,#8a4ec8 17%,#fffdf8)}
:root[data-theme="dark"] .tier-ledger-row--t3{background:color-mix(in srgb,#f5c84a 10%,#2a2c31)}
:root[data-theme="dark"] .tier-ledger-row--t4{background:color-mix(in srgb,#5ef0d4 12%,#2a2c31)}
:root[data-theme="dark"] .tier-ledger-row--t5{background:color-mix(in srgb,#a8bcff 16%,#2a2c31)}
:root[data-theme="dark"] .tier-ledger-row--t6{background:color-mix(in srgb,#d4b8ff 17%,#2a2c31)}
.tier-ledger-tier,.tier-ledger-hotel,.tier-ledger-price{min-width:0}.tier-ledger-tier{display:flex;flex-direction:column;gap:.1rem}
.tier-ledger-tier-no{color:var(--tier-ledger-color);font-family:var(--font-body);font-size:.7rem;font-weight:800;letter-spacing:.12em;line-height:1.15;text-transform:uppercase}
.tier-ledger-tier-name{color:var(--text-muted);font-family:var(--font-display);font-size:clamp(.78rem,.88vw,.9rem);line-height:1.15}
.tier-ledger-hotel{display:flex;flex-direction:column;align-items:flex-start}.tier-ledger-hotel-name,.tier-ledger-place{appearance:none;border:0;background:transparent;cursor:pointer}
.tier-ledger-hotel-name{max-width:100%;padding:0;color:var(--text);font-family:var(--font-display);font-size:clamp(.98rem,1.18vw,1.16rem);font-weight:500;line-height:1.12;text-align:left}
.tier-ledger-hotel-name:hover,.tier-ledger-hotel-name:focus-visible{color:var(--gold);text-decoration:underline;text-underline-offset:.18em}
.tier-ledger-hotel-meta,.tier-ledger-empty-meta{margin-top:.2rem;color:var(--text-muted);font-family:var(--font-body);font-size:clamp(.68rem,.76vw,.76rem);line-height:1.25}
.tier-ledger-place{padding:0;color:inherit;font:inherit;text-decoration:underline;text-decoration-color:color-mix(in srgb,var(--gold) 65%,transparent);text-underline-offset:.16em}
.tier-ledger-place:hover,.tier-ledger-place:focus-visible,.tier-ledger-place.is-active{color:var(--gold);text-decoration-thickness:2px}
.tier-ledger-basis{color:var(--text-faint);white-space:normal}
.tier-ledger-price{justify-self:end;display:flex;flex-direction:column;align-items:flex-end;white-space:nowrap}.tier-ledger-price strong{color:var(--text);font-family:var(--font-display);font-size:clamp(1.25rem,1.75vw,1.7rem);font-weight:500;line-height:.95}.tier-ledger-price span{margin-top:.18rem;color:var(--text-muted);font-family:var(--font-body);font-size:.62rem;line-height:1}
.tier-ledger-empty-name{color:var(--text-muted);font-family:var(--font-display);font-size:.92rem;font-style:italic}.tier-ledger-row.is-empty{opacity:.7}
.home-gazette.hero-gazette{width:100%;max-width:var(--max-w);margin:clamp(1.1rem,2.5vw,2.25rem) auto 0;display:grid;grid-template-columns:minmax(18.5rem,1.05fr) minmax(0,2.95fr);border:1px solid color-mix(in srgb,#d6bd82 26%,transparent);background:linear-gradient(90deg,#273a32 0%,#31463d 48%,#3d544a 100%);color:#fff8e9;box-shadow:0 10px 28px color-mix(in srgb,#17241f 16%,transparent)}
:root[data-theme="dark"] .home-gazette.hero-gazette{background:linear-gradient(90deg,#172720 0%,#1d3229 48%,#2a4036 100%)}
.home-gazette .hero-gazette-head{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;min-width:0;padding:1.1rem 1.25rem;border-right:1px solid rgba(255,255,255,.12)}
.home-gazette-kicker{color:#dfc16f;margin-bottom:.4rem;letter-spacing:.1em;white-space:nowrap}.home-gazette .hero-gazette-kicker{padding:0;border:0;background:transparent;color:#fff8e9;font-family:var(--font-wordmark,var(--font-serif,Georgia,serif));font-size:clamp(1.35rem,1.9vw,1.85rem);font-weight:700;letter-spacing:.005em;line-height:.94;text-align:left;white-space:nowrap;cursor:pointer}
.home-gazette .hero-gazette-kicker:hover,.home-gazette .hero-gazette-kicker:focus-visible{color:#dfc16f}
.home-gazette .hero-gazette-list{min-width:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));margin:0;padding:0;list-style:none}.home-gazette .hero-gazette-item{min-width:0;border-left:1px solid rgba(255,255,255,.1)}.home-gazette .hero-gazette-item:first-child{border-left:0}
.home-gazette .hero-gazette-link{width:100%;min-height:100%;display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;padding:1rem 1.1rem;border:0;background:transparent;color:#fff8e9;text-align:left;cursor:pointer}
.home-gazette .hero-gazette-link:hover,.home-gazette .hero-gazette-link:focus-visible{background:rgba(255,255,255,.055)}
.home-gazette .hero-gazette-meta{display:flex;align-items:center;flex-wrap:nowrap;gap:.28rem .4rem;color:#dfc16f;font-family:var(--font-body);font-size:.62rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;white-space:nowrap}
.home-gazette .hero-gazette-place,.home-gazette .hero-gazette-date{color:inherit;font:inherit;letter-spacing:inherit;text-transform:inherit}
.home-gazette .hero-gazette-sep{display:inline-block;width:.34rem;height:.34rem;margin:0 .02rem;background:#dfc16f;opacity:.85}
.home-gazette .hero-gazette-hl{color:inherit;font-family:var(--font-body);font-size:clamp(.78rem,.9vw,.9rem);font-weight:700;line-height:1.32}.home-gazette .hero-gazette-dek{display:none}
.hero--tier-home .hero-scroll-nudge{position:relative;bottom:auto;margin:clamp(.75rem,1.5vw,1.25rem) auto 0}
@media(max-width:1180px){.home-landing-grid{grid-template-columns:minmax(260px,.78fr) minmax(500px,1.22fr);gap:1rem}.hero-field-guide{padding:.8rem}.tier-ledger-panel{padding:.75rem}.tier-ledger-row{grid-template-columns:74px minmax(0,1fr) auto;gap:.65rem;padding-left:.7rem}}
@media(max-width:899.98px){.hero--tier-home{padding:1rem max(var(--space-4),var(--ipad-content-gutter,1rem)) .9rem}.home-landing-grid{grid-template-columns:minmax(0,1fr);gap:.9rem}.hero-field-guide{min-height:0;gap:.95rem}.hero-field-guide h1{max-width:none;font-size:clamp(1.5rem,4.2vw,2.15rem)}.hero-field-guide p{max-width:none}}
@media(max-width:699.98px){.hero--tier-home{padding:.65rem var(--space-3) .85rem}.hero-field-guide{padding:.7rem}.hero-field-guide h1{font-size:clamp(1.4rem,6.2vw,1.85rem);line-height:.98}.hero-field-guide p{margin-top:.75rem;font-size:1.02rem}.home-guide-stats{padding:.45rem 0}.tier-ledger-panel{padding:.6rem}.tier-ledger-head{grid-template-columns:1fr;gap:.45rem;padding:.2rem .15rem .65rem}.tier-ledger-head-meta{text-align:left}.tier-ledger-head-meta p{max-width:42rem}.tier-ledger-row{grid-template-columns:58px minmax(0,1fr) auto;gap:.55rem;min-height:54px;padding:.5rem;border-left-width:4px}.tier-ledger-tier-no{font-size:.61rem}.tier-ledger-tier-name{font-size:.68rem}.tier-ledger-hotel-name{font-size:.9rem}.tier-ledger-hotel-meta,.tier-ledger-empty-meta{font-size:.62rem}.tier-ledger-basis{display:none}.tier-ledger-price strong{font-size:1.05rem}.tier-ledger-price span{font-size:.54rem}.home-gazette.hero-gazette{grid-template-columns:1fr}.home-gazette .hero-gazette-head{padding:.9rem 1rem;border-right:0;border-bottom:1px solid rgba(255,255,255,.12)}.home-gazette .hero-gazette-list{grid-template-columns:1fr}.home-gazette .hero-gazette-item{border-left:0;border-top:1px solid rgba(255,255,255,.1)}.home-gazette .hero-gazette-item:first-child{border-top:0}.home-gazette .hero-gazette-link{padding:.8rem 1rem}}
@media(max-width:410px){.tier-ledger-row{grid-template-columns:52px minmax(0,1fr) auto;gap:.4rem}.tier-ledger-tier-name{display:none}.tier-ledger-price strong{font-size:.98rem}}

/* HOME-MODE-EXPLORE-2026: Field Guide mode doors under the live counters. */
.home-mode-explore {
  width: 100%;
  display: flex;
  flex-direction: column;
  gap: 0.85rem;
}
.home-mode-explore-lead {
  max-width: none !important;
  margin: 0 !important;
  color: #efe6cf;
  font-family: var(--font-display);
  font-size: clamp(0.92rem, 1.15vw, 1.05rem);
  font-weight: 500;
  line-height: 1.45;
  text-align: left !important;
}
.home-mode-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0.7rem;
}
.home-mode-btn {
  position: relative;
  isolation: isolate;
  min-height: 3.55rem;
  padding: 0.62rem 0.7rem;
  overflow: hidden;
  border: 1px solid rgba(224, 193, 115, 0.72);
  border-radius: 3px;
  background:
    linear-gradient(180deg, rgba(255, 248, 233, 0.24), rgba(255, 248, 233, 0.08)),
    #3f5a4e;
  font-family: var(--font-display);
  box-shadow:
    0 10px 22px rgba(12, 20, 16, 0.22),
    inset 0 1px 0 rgba(255, 248, 233, 0.16);
  color: #fff8e9;
  cursor: pointer;
  transition:
    background var(--dur-fast) var(--ease),
    border-color var(--dur-fast) var(--ease),
    box-shadow var(--dur-fast) var(--ease),
    transform var(--dur-fast) var(--ease);
}
.home-mode-btn-label,
.home-mode-btn-desc {
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
}
.home-mode-btn-label {
  min-height: 1.85rem;
  color: #fff8e9;
  font-family: var(--font-display);
  font-size: clamp(0.92rem, 1.15vw, 1.08rem);
  font-weight: 650;
  letter-spacing: 0.045em;
  line-height: 1.15;
  transition: opacity var(--dur-fast) var(--ease);
}
.home-mode-btn-desc {
  position: absolute;
  inset: 0;
  z-index: 1;
  padding: 0.7rem 0.8rem;
  background: rgba(12, 20, 16, 0.42);
  color: #fffaf0;
  font-family: var(--font-display);
  font-size: clamp(0.82rem, 1.02vw, 0.94rem);
  font-weight: 550;
  letter-spacing: 0.01em;
  line-height: 1.3;
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--dur-fast) var(--ease);
}
.home-mode-btn:hover,
.home-mode-btn:focus-visible {
  transform: translateY(-1px);
  border-color: rgba(224, 193, 115, 0.88);
  background:
    linear-gradient(180deg, rgba(12, 20, 16, 0.28), rgba(12, 20, 16, 0.5)),
    #24362f;
  box-shadow:
    0 14px 26px rgba(12, 20, 16, 0.32),
    inset 0 1px 0 rgba(255, 248, 233, 0.08);
}
.home-mode-btn:hover .home-mode-btn-label,
.home-mode-btn:focus-visible .home-mode-btn-label {
  opacity: 0;
}
.home-mode-btn:hover .home-mode-btn-desc,
.home-mode-btn:focus-visible .home-mode-btn-desc {
  opacity: 1;
}
.home-mode-btn:focus-visible {
  outline: 2px solid #e0c173;
  outline-offset: 2px;
}
@media (max-width: 699.98px) {
  .home-mode-grid { gap: 0.55rem; }
  .home-mode-btn { min-height: 3.25rem; }
  .home-mode-btn-label { font-size: 0.86rem; }
  .home-mode-btn-desc { font-size: 0.78rem; padding: 0.55rem 0.6rem; }
}
@media (max-width: 410px) {
  .home-mode-grid { grid-template-columns: 1fr; }
}

/* ===== CARD-TIER-BRIEF-WEEKEND-LEDGER-2026 ============================== */
.card-tier-brief{--card-tier-color:var(--text-faint);--card-tier-ink:var(--text-muted);--card-tier-strength:5%;margin:8px 0 2px;padding:.8rem .85rem .78rem;border-left:4px solid var(--card-tier-color);background:color-mix(in srgb,var(--card-tier-color) var(--card-tier-strength),transparent)}
.card-tier-brief--t1{--card-tier-color:#6a4f17;--card-tier-ink:#6a4f17;--card-tier-strength:4%}.card-tier-brief--t2{--card-tier-color:#b8964e;--card-tier-ink:#6a4f17;--card-tier-strength:7%}.card-tier-brief--t3{--card-tier-color:#e8b83a;--card-tier-ink:#80600e;--card-tier-strength:11%}.card-tier-brief--t4{--card-tier-color:#1aa891;--card-tier-ink:#0f6e63;--card-tier-strength:16%}.card-tier-brief--t5{--card-tier-color:#3f5fd6;--card-tier-ink:#2a3f9e;--card-tier-strength:24%}.card-tier-brief--t6{--card-tier-color:#8a4ec8;--card-tier-ink:#5a2d8a;--card-tier-strength:30%}
.card-tier-brief__label{color:var(--card-tier-ink);font-family:var(--font-body);font-size:.66rem;font-weight:700;letter-spacing:.12em;line-height:1.25;text-transform:uppercase}.card-tier-brief .card-pitch{margin:.55rem 0 0}
:root[data-theme="dark"] .card-tier-brief--t1{--card-tier-ink:#d4c4a0}:root[data-theme="dark"] .card-tier-brief--t2{--card-tier-ink:#d4b56a}:root[data-theme="dark"] .card-tier-brief--t3{--card-tier-ink:#f5c84a}:root[data-theme="dark"] .card-tier-brief--t4{--card-tier-ink:#5ef0d4}:root[data-theme="dark"] .card-tier-brief--t5{--card-tier-ink:#a8bcff}:root[data-theme="dark"] .card-tier-brief--t6{--card-tier-ink:#d4b8ff}
.card-price-block--weekend-ledger{padding-top:var(--space-3)}.card-weekend-ledger{min-width:0;border-top:1px solid var(--border);padding-top:var(--space-3)}:root[data-theme="dark"] .card-weekend-ledger{border-top-color:var(--card-line-soft)}
.card-weekend-ledger__head{display:flex;align-items:baseline;justify-content:space-between;gap:.75rem;margin-bottom:.65rem;color:var(--gold-bright,var(--gold));font-family:var(--font-body);font-size:.62rem;font-weight:700;letter-spacing:.14em;line-height:1.2;text-transform:uppercase}.card-weekend-ledger__head span:last-child{color:var(--text-muted);font-size:.66rem;font-weight:400;letter-spacing:0;text-transform:none}
.card-weekend-ledger__grid{display:grid;gap:6px;min-width:0}.card-weekend-ledger__grid--1{grid-template-columns:1fr}.card-weekend-ledger__grid--2{grid-template-columns:repeat(2,minmax(0,1fr))}.card-weekend-ledger__grid--3{grid-template-columns:repeat(3,minmax(0,1fr))}
.card-weekend-tile{min-width:0;min-height:116px;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;padding:.7rem .35rem .55rem;background:color-mix(in srgb,var(--text) 6%,transparent);text-align:center}.card-weekend-tile--lowest{background:color-mix(in srgb,var(--flag-green,#16a37a) 17%,transparent)}
.card-weekend-tile .card-price-wrap{width:100%;align-items:center;text-align:center}.card-weekend-tile .card-price{font-size:clamp(1.05rem,1.8vw,1.35rem);line-height:1.05;white-space:nowrap}.card-weekend-tile .card-price-unit{display:none}.card-weekend-tile .card-price-dates{order:-1;width:100%;margin:0 0 .48rem;color:var(--text);font-family:var(--font-body);font-size:.58rem;font-weight:600;letter-spacing:.08em;line-height:1.2;text-align:center;text-transform:uppercase;white-space:nowrap}
.card-weekend-tile>.card-price-native,.card-weekend-tile>.card-price-spike-context{max-width:100%;margin-top:.15rem;font-size:.58rem;text-align:center}.card-weekend-tile .card-price-lead-note{display:none}.card-weekend-tile .card-stay-price-pending{width:100%;min-height:54px;flex-direction:column;align-items:center;justify-content:center;gap:.15rem;text-align:center}
.card-weekend-tile__role{margin-top:.3rem;color:var(--text-muted);font-family:var(--font-body);font-size:.62rem;line-height:1.2}.card-weekend-tile__best{margin-top:auto;padding-top:.42rem;color:var(--flag-green,#16a37a);font-family:var(--font-body);font-size:.56rem;font-weight:700;letter-spacing:.06em;line-height:1.15;text-transform:uppercase}.card-weekend-tile__best--placeholder{visibility:hidden}
.card-weekend-ledger__notes{margin-top:.55rem;padding-top:.5rem;border-top:1px dashed var(--border);color:var(--text-muted);font-family:var(--font-body);font-size:.62rem;line-height:1.35;overflow-wrap:anywhere}.card-weekend-ledger__notes .card-price-lead-note{display:inline;margin:0;color:inherit;font:inherit;white-space:normal;overflow:visible;text-overflow:unset}.card-weekend-ledger__note-sep{color:var(--text-faint)}
@media(max-width:410px){.card-tier-brief{padding:.72rem .72rem .7rem}.card-weekend-ledger__grid{gap:4px}.card-weekend-tile{min-height:110px;padding-left:.2rem;padding-right:.2rem}.card-weekend-tile .card-price{font-size:1.02rem}}
/* Status words share .card-price, so they were inheriting the numeric size
   (up to 1.35rem, nowrap) and painting past the tile. Keep dollar amounts
   at the price size; only shrink placeholders and cap anything still wider
   than the tile. */
.card-weekend-tile{overflow:hidden;container-type:inline-size;container-name:weekend-tile}
.card-weekend-tile .card-price-wrap{max-width:100%;overflow:hidden}
.card-weekend-tile .card-price-wrap .card-price{width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis;text-align:center}
.card-weekend-tile .card-price--pending,
.card-weekend-tile .card-price--quirk{display:block;width:100%;max-width:100%;box-sizing:border-box;font-family:var(--font-body);font-size:.62rem;font-weight:650;font-style:normal;letter-spacing:.01em;line-height:1.15;text-transform:none;white-space:normal;overflow:hidden}
.card-weekend-tile .card-price--quirk{padding:.08rem .22rem;letter-spacing:.02em;text-transform:uppercase;font-size:.56rem;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}
@container weekend-tile (max-width: 80px) {
  .card-weekend-tile .card-price--pending { font-size: .54rem; }
}
.card-weekend-tile>.card-price,
.card-weekend-tile>.card-price-native,
.card-weekend-tile>.card-price-spike-context,
.card-weekend-tile .card-price-trust-banner,
.card-weekend-tile .card-price-dates,
.card-weekend-tile .card-weekend-tile__role,
.card-weekend-tile .card-weekend-tile__best{max-width:100%;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis}
.card-weekend-tile>.card-price-native,
.card-weekend-tile .card-price-trust-banner,
.card-weekend-tile .card-weekend-tile__role,
.card-weekend-tile .card-weekend-tile__best{display:block;width:100%}
.card-weekend-tile>.card-price-spike-context{width:100%;white-space:normal}
.card-weekend-tile>.card-price-native,
.card-weekend-tile .card-price-trust-banner{white-space:normal;line-height:1.2}
.card-weekend-tile>.card-price-native--pending{white-space:normal;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;line-height:1.25}
.card-weekend-tile .card-price-trust-banner{padding:.12rem .18rem;font-size:.48rem;letter-spacing:.04em;white-space:normal}
/* ===== /CARD-TIER-BRIEF-WEEKEND-LEDGER-2026 ============================= */

