/* Tomara · brand system v1.0.1 · the sun tile · 2026-07-07
   Five colors, two shapes. Flat bands, never gradients; dark dusk grounds are
   home; photography-led. Spec: identity-2026-07/ + tomara-brand-sheet.pdf.
   (v1.0.1: content bump to rotate the ?v= hash after a deploy-race edge-cache
   poisoning cached the old file under the new versioned URL, 2026-07-07.) */
:root {
  /* the system */
  --sand: #f7efe4;      /* paper, light grounds */
  --dusk: #1b2432;      /* ink + dark grounds (home) */
  --burnt: #bf3f1c;     /* the sun, primary CTAs */
  --amber: #f2a25c;     /* sky band, highlights on dark */
  --sea: #2e5158;       /* sea band, secondary panels */
  --vermelho: #d1401f;  /* copy accents, urgent edges only */
  /* roles (legacy token names kept so every surface swaps mechanically) */
  --ink: var(--dusk);
  --ink-soft: #4d5a66;
  --teal: var(--sea);
  --teal-dark: #223d43;
  --teal-tint: #e4ecec;
  --sand-deep: #efe3d0;
  --coral: var(--burnt);
  --coral-dark: #a53517;
  --white: #ffffff;
  --line: #e6dcc7;
  --radius: 18px;
  --radius-sm: 12px;
  --shadow: 0 6px 24px rgba(27, 36, 50, 0.08);
  --shadow-lift: 0 12px 40px rgba(27, 36, 50, 0.14);
  --font: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --font-tight: "Inter Tight", "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
  --font-claim: "Barlow Condensed", "Arial Narrow", sans-serif;
}

/* Self-hosted webfonts (2026-07-12): replaces the Google-Fonts <link> pair
   (preconnect + stylesheet) that used to sit in every template's <head>, so
   visitor IPs stop flowing to a third-party font host. Subsetted latin +
   latin-ext (via google-webfonts-helper) so PT-BR accents (ã, ç, é, í, õ,
   ú...) still render. Only the weights the CSS below actually uses are
   vendored -- Barlow Condensed (--font-claim above) is declared but never
   applied anywhere in this file or the templates, so it was dropped rather
   than self-hosted. Files: static/fonts/*.woff2 -> served at /fonts/*.woff2
   (static/ passthrough in build.py). */
@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("/fonts/inter-400.woff2") format("woff2");
}
@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("/fonts/inter-500.woff2") format("woff2");
}
@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("/fonts/inter-600.woff2") format("woff2");
}
@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url("/fonts/inter-700.woff2") format("woff2");
}
@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url("/fonts/inter-800.woff2") format("woff2");
}
@font-face {
  font-family: "Inter Tight";
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url("/fonts/inter-tight-700.woff2") format("woff2");
}
@font-face {
  font-family: "Inter Tight";
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url("/fonts/inter-tight-800.woff2") format("woff2");
}

* { margin: 0; padding: 0; box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
  font-family: var(--font);
  background: var(--sand);
  color: var(--ink);
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
}
img { display: block; max-width: 100%; }
a { color: var(--teal); text-decoration: none; }
button { font-family: var(--font); cursor: pointer; border: none; }

/* text selection: amber background, dusk text (amplify #13). */
::selection { background: var(--amber); color: var(--dusk); }

/* restrained scrollbar accent, desktop only: mobile browsers own their
   native scrollbar and fighting it causes more harm than the accent is
   worth, so this is gated to pointer:fine (mouse/trackpad) input. */
@media (pointer: fine) {
  html { scrollbar-width: thin; scrollbar-color: var(--sea) var(--sand); }
  ::-webkit-scrollbar { width: 10px; height: 10px; }
  ::-webkit-scrollbar-track { background: var(--sand); }
  ::-webkit-scrollbar-thumb { background: var(--sea); border-radius: 999px; }
  ::-webkit-scrollbar-thumb:hover { background: var(--teal-dark); }
}

.wrap { max-width: 1080px; margin: 0 auto; padding: 0 20px; }

/* screen-reader-only: visually hidden but present for assistive tech.
   Used for pages where no visible heading fits the design at load time. */
.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}

/* skip link: first tab stop, visually hidden until focused. */
.skip-link {
  position: absolute; left: -9999px; top: 12px; z-index: 2000;
  background: var(--white); color: var(--ink); font-weight: 600;
  padding: 10px 16px; border-radius: 999px; box-shadow: var(--shadow);
}
.skip-link:focus { left: 12px; }

/* ---------- header ---------- */
.topbar {
  display: flex; align-items: center; justify-content: space-between;
  padding: 18px 0;
}
.brand { display: flex; align-items: center; gap: 9px; color: var(--ink); }
.brand svg { display: block; border-radius: 6px; }
.brand .word {
  font-family: var(--font-tight);
  font-size: 1.35rem; font-weight: 800; letter-spacing: -0.03em; color: var(--ink);
}
/* desktop: the lockup was reading undersized and stranded against the nav
   pills (Scot 2026-07-12) — scale it up; mobile proportions stay as-is */
@media (min-width: 761px) {
  .topbar .brand { gap: 11px; }
  .topbar .brand svg { width: 46px; height: 46px; border-radius: 8px; }
  .topbar .brand .word { font-size: 1.62rem; }
}
.topbar .actions { display: flex; align-items: center; gap: 10px; }

.lang-toggle {
  display: flex; border: 1.5px solid var(--line); border-radius: 999px;
  overflow: hidden; background: var(--white);
}
.lang-toggle button {
  padding: 6px 13px; background: transparent; font-size: 0.82rem; font-weight: 600;
  color: var(--ink-soft);
}
.lang-toggle button.on { background: var(--teal); color: var(--white); }

.brand-group { display: flex; align-items: center; gap: 11px; min-width: 0; }
.demo-pill {
  font-size: 0.72rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase;
  background: var(--sand-deep); color: var(--ink-soft);
  padding: 5px 11px; border-radius: 999px; border: 1px solid var(--line);
  white-space: nowrap;
}
.btn.btn-sm { padding: 8px 16px; font-size: 0.9rem; }
.sm-text { display: none; }

@media (max-width: 560px) {
  .topbar { flex-wrap: wrap; row-gap: 10px; padding: 14px 0; }
  .topbar .actions { gap: 6px; flex-wrap: wrap; }
  .brand-group { gap: 8px; }
  .demo-pill { font-size: 0.64rem; padding: 4px 8px; letter-spacing: 0.05em; }
  .btn.btn-sm { padding: 7px 12px; font-size: 0.82rem; }
  .lang-toggle button { padding: 5px 10px; font-size: 0.76rem; }
  .lg-text { display: none; }
  .sm-text { display: inline; }
}

@media (max-width: 480px) {
  /* de-pill the mobile header (amplify #14): ordinary nav links go plain
     text, with a horizon underline marking the CURRENT page only. The pill
     shape stays for the language toggle (separate .lang-toggle markup,
     untouched) and any real primary action button (.btn-coral/.btn-teal,
     not mixed into these topbars today, excluded on purpose). Border-width
     is kept and just turned transparent so the box model does not shift
     between breakpoints. */
  .topbar .actions a.btn-ghost {
    background: transparent; border-color: transparent; color: var(--ink);
    padding: 12px 8px; min-height: 44px; border-radius: 0; font-weight: 600;
  }
  .topbar .actions a.btn-ghost:hover { border-color: transparent; }
  .topbar .actions a.btn-ghost[aria-current="page"] { position: relative; }
  .topbar .actions a.btn-ghost[aria-current="page"]::after {
    content: ""; position: absolute; left: 8px; right: 8px; bottom: 2px;
    height: 2px; background: var(--amber);
  }
}

/* ---------- type ---------- */
h1 { font-family: var(--font-tight); font-size: clamp(1.7rem, 4.2vw, 2.6rem); font-weight: 800; letter-spacing: -0.02em; line-height: 1.12; }
h2 { font-family: var(--font-tight); font-size: clamp(1.25rem, 2.6vw, 1.6rem); font-weight: 800; letter-spacing: -0.01em; margin-bottom: 14px; }
h3 { font-size: 1.05rem; font-weight: 600; }
.muted { color: var(--ink-soft); }
.small { font-size: 0.85rem; }

/* claim-period (amplify #12): the terminal period of a major promise line,
   burnt. Language-neutral (the character is the same in PT and EN). Each
   template paints this at render time by wrapping the last "." of the
   already-approved copy string, so the copy itself never changes. */
.claim-period { color: var(--burnt); }

/* ---------- buttons ---------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  padding: 13px 24px; border-radius: 999px; font-size: 1rem; font-weight: 600;
  white-space: nowrap;
  transition: transform 0.08s ease, box-shadow 0.2s ease, background 0.2s ease;
}
.btn:active { transform: scale(0.98); }
.btn:focus-visible { outline: 2px solid var(--amber); outline-offset: 2px; }
/* Horizon ring (Scot 2026-07-11, replaces the base-edge experiment): the
   solid button sits INSIDE a horizon — a thin two-tone orbit, amber above
   the midline, sea below (the tile's sky/sea split drawn as an outline),
   held off the pill by a small gap so it reads as a ring, not a border.
   Buttons are otherwise FLAT: no elevation shadows, no base edge, no
   press-settle. Hard-stop bands only. If the ring gets cut, delete the
   two ::before blocks and the focus overrides below — the pills are
   already flat underneath. */
.btn-coral, .btn-teal { position: relative; z-index: 0; }
.btn-coral::before, .btn-teal::before {
  content: ""; position: absolute; inset: -6px; border-radius: 999px;
  padding: 2px; z-index: -1;
  background: linear-gradient(to bottom, var(--amber) 0 50%, var(--sea) 50% 100%);
  -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
  -webkit-mask-composite: xor;
  mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
  mask-composite: exclude;
}
.btn-coral { background: var(--coral); color: var(--white); }
.btn-coral:hover { background: var(--coral-dark); }
.btn-teal { background: var(--teal); color: var(--white); }
.btn-teal:hover { background: var(--teal-dark); }
/* focus: the ring flips solid burnt — one clear signal on any ground; the
   generic amber outline is redundant next to the ring on solid buttons. */
.btn-coral:focus-visible, .btn-teal:focus-visible { outline: none; }
.btn-coral:focus-visible::before, .btn-teal:focus-visible::before { background: var(--burnt); }
.btn-coral:disabled::before, .btn-teal:disabled::before { content: none; }
/* BTN3: secondary/outline unified — sea outline + dusk text on light
   grounds; hover flips to a flat sand fill (dusk text stays readable
   either way). Pill shape unchanged. */
.btn-ghost { background: var(--white); color: var(--dusk); border: 1.5px solid var(--sea); }
.btn-ghost:hover { background: var(--sand); border-color: var(--sea); color: var(--dusk); }
/* dark-ground variant (same naming idiom as .tick-list.on-dark): sea reads
   at ~1.7:1 on dusk, under the 3:1 non-text contrast bar, so amber takes
   the resting outline instead — it's already the token's documented role
   ("highlights on dark"). Hover still flips to the same sand fill. */
.btn-ghost.on-dark { background: transparent; color: var(--sand); border-color: var(--amber); }
.btn-ghost.on-dark:hover { background: var(--sand); border-color: var(--sand); color: var(--dusk); }
/* BTN5: disabled — flat sand, softened ink text, no base band (the sun has
   set below the horizon: nothing left to sit on). Declared last so it
   outranks every :hover/.on-dark rule above at matching specificity. */
.btn-coral:disabled, .btn-teal:disabled, .btn-ghost:disabled, .btn-ghost.on-dark:disabled {
  background: var(--sand); color: var(--ink-soft); box-shadow: none; border-color: var(--line);
  cursor: default;
}

/* (cta-sun glyph removed 2026-07-11 — Scot: buttons read too busy with an
   icon inside; the horizon ring carries the identity on its own.) */

/* ---------- cards ---------- */
.card {
  background: var(--white); border-radius: var(--radius);
  box-shadow: var(--shadow); padding: 26px;
}

/* ---------- prop-card: shared property card (amplify #5) ----------
   One card component for the marketplace grid, a destination page, and the
   painel's own listing grid — replaces each page hand-rolling its own
   .lcard. Untreated photo on top (no scrim: a real gradient there violated
   the flat-bands-never-gradients rule), a flat dusk caption rail BENEATH
   the photo holding the name + meta line in sand/white text, and the seam
   between photo and rail is a thin amber-over-sea horizon line (same 2px
   amber / 3px sea geometry as .divider-horizon). Consumers keep their own
   .ph (height, background flavor, badge) and .body (tag/price/CTA) markup
   layered around this shell. */
.prop-card {
  border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow);
  display: flex; flex-direction: column; text-decoration: none; color: inherit;
  transition: box-shadow .15s, transform .15s;
}
a.prop-card.live { cursor: pointer; }
.prop-card.live:hover { box-shadow: var(--shadow-lift); transform: translateY(-3px); }
.prop-card .ph { position: relative; }
.prop-card .ph img { display: block; width: 100%; height: 100%; object-fit: cover; }
.prop-card .seam { position: relative; height: 5px; overflow: hidden; }
.prop-card .seam::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: var(--amber); }
.prop-card .seam::after { content: ""; position: absolute; top: 2px; left: 0; right: 0; height: 3px; background: var(--sea); }
/* rail is a single row: name + meta left, price right (Scot 2026-07-11:
   the old white sub-panel under the rail duplicated it; one block now). */
/* flex-grow so the rail absorbs the grid's equal-height stretch — without
   it, one-line cards in a row with two-line neighbors show a sand gap
   under the rail (Scot 2026-07-11). */
.prop-card .rail { background: var(--dusk); color: var(--sand); padding: 12px 16px; display: flex; justify-content: space-between; align-items: baseline; gap: 12px; flex: 1 0 auto; }
.prop-card .rail .rail-price { white-space: nowrap; font-weight: 800; font-size: 1.02rem; }
.prop-card .rail .rail-price span { font-weight: 400; font-size: .76rem; color: #b9c4c6; }
.prop-card .rail .rail-name { font-weight: 700; font-size: 1.05rem; line-height: 1.25; }
.prop-card .rail .rail-meta { font-size: .78rem; color: #b9c4c6; margin-top: 2px; }

/* ---------- ph-tile: generic photo placeholder (amplify #18) ----------
   Flat tile composition (amber sky / dusk horizon hairline / sea band,
   hard-stop bands, no real gradient) for the space behind or before a
   property photo. The marketplace's own destination-flavored
   ph-floripa/ph-smokies/ph-charleston stay as they are (already compliant,
   already this same device) — this is the flavor-neutral default for pages
   that don't carry a per-listing destination flavor (destination.html,
   painel's listing grid, edit.html's photo grid). */
.ph-tile {
  background: linear-gradient(to bottom, var(--amber) 0 44%, var(--dusk) 44% calc(44% + 3px), var(--sea) calc(44% + 3px) 100%);
}

/* ---------- empty-glyph: sun-below-horizon (amplify #10) ----------
   Companion mark to .tick-list's rising sun: this one dips below the
   horizon line instead of rising above it, language-neutral, for empty
   states and not-found pages. Drop
   <span class="empty-glyph" aria-hidden="true"></span> above the muted
   copy. (painel.html's own .empty rule mirrors this same data URI on
   ::before, since its 8 empty-state divs are pre-existing plain markup and
   a single CSS rule there covers all of them with zero per-call-site
   edits.) */
.empty-glyph {
  display: block; width: 34px; height: 14px; margin: 0 auto 12px;
  background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 11"><rect x="4" y="0.5" width="24" height="2.6" rx="1.3" fill="%232e5158"/><path d="M9.5 3.1 a6.5 6.5 0 0 0 13 0 z" fill="%23bf3f1c"/></svg>') no-repeat center / contain;
}

/* ---------- badges ---------- */
.badge-verified {
  display: inline-flex; align-items: center; gap: 7px;
  background: var(--teal-tint); color: var(--teal-dark);
  font-size: 0.85rem; font-weight: 600;
  padding: 7px 14px; border-radius: 999px;
  position: relative; cursor: help;
}
/* (horizon glyph removed from the badge 2026-07-11 — Scot: superfluous
   next to the check; the tick + text is the whole badge.) */
/* compact variant for a badge riding on top of a photo (marketplace,
   destination, painel cards): a light translucent pill instead of the
   listing-header's teal-tint pill, no hover popover (cards have none). */
.badge-verified.card-badge {
  position: absolute; top: 12px; right: 12px; z-index: 2;
  background: rgba(255, 255, 255, .92); color: var(--ink);
  font-size: .72rem; padding: 5px 10px; gap: 5px; cursor: default;
}
.badge-verified.card-badge .tick { width: 14px; height: 14px; font-size: .62rem; }
.verified-pop {
  display: none; position: absolute; top: calc(100% + 8px); left: 0; z-index: 20;
  width: 290px; background: var(--ink); color: var(--sand);
  font-size: 0.82rem; font-weight: 400; line-height: 1.5;
  padding: 13px 15px; border-radius: 12px; box-shadow: var(--shadow-lift);
}
.verified-pop a { color: var(--coral); font-weight: 700; white-space: nowrap; }
.badge-verified:hover .verified-pop, .badge-verified:focus .verified-pop,
.badge-verified:focus-within .verified-pop { display: block; }
.badge-verified .tick {
  width: 17px; height: 17px; border-radius: 50%;
  background: var(--teal); color: var(--white);
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 0.7rem; font-weight: 800;
}

/* ---------- tick-list: shared sun-glyph marker (amplify #3) ----------
   One glyph, defined once, two use modes: ul.tick-list > li for real
   bullet lists (hosts about/adv bullets, join plan bullets, listing house
   rules), and .tick-list-glyph for a single inline lead-in mark where the
   layout is not a list (home's benefit cards, a 3-up grid). Was hand-rolled
   as an identical data-URI in three places before this pass. Consumers keep
   their own margin/font-size/color typography; this only owns structure +
   glyph. */
.tick-list { list-style: none; }
.tick-list > li { position: relative; padding-left: 29px; }
.tick-list > li::before,
.tick-list-glyph::before {
  content: "";
  background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 11.5 32 10.6"><path d="M9.5 19 a6.5 6.5 0 0 1 13 0 z" fill="%23bf3f1c"/><rect x="4" y="19" width="24" height="2.6" rx="1.3" fill="%231b2432"/></svg>') no-repeat center / contain;
  width: 23px; height: 9px;
}
/* optical tuning (Scot 2026-07-12): list bullets sat a touch high and far;
   inline lead glyphs sat a touch low and far. Separate nudges per variant. */
.tick-list > li::before { position: absolute; left: 0; top: 9px; }
.tick-list-glyph::before { display: inline-block; margin-right: 6px; position: relative; top: -2px; }
.tick-list > li b { color: var(--ink); font-weight: 700; }
/* dark-ground variant: the standard glyph's horizon bar is dusk-colored, so
   it disappears against a dusk card (hosts.html's Pro pricing tier). Same
   burnt disc, a sand-colored bar instead. */
.tick-list.on-dark > li::before {
  background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 11.5 32 10.6"><path d="M9.5 19 a6.5 6.5 0 0 1 13 0 z" fill="%23bf3f1c"/><rect x="4" y="19" width="24" height="2.6" rx="1.3" fill="%23f7efe4"/></svg>') no-repeat center / contain;
}

/* ---------- footer ---------- */
.footer {
  margin-top: 70px; padding: 26px 0 30px; background: var(--dusk); color: #cbd4d4;
  position: relative;
}
/* sunset closure (amplify #4): flat amber-over-sea horizon band across the
   top edge of every dusk footer, closed with a small burnt half-disc near
   the wordmark. Flat stacked hard-stop bands only, no gradients (locked
   design rule). Lives on the shared .footer/.brand classes so every public
   page gets it with zero per-template markup. */
.footer::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 8px;
  /* hard-stop bands, not a blend (same compliant syntax as the ph-* tiles) */
  background: linear-gradient(to bottom, var(--amber) 0 3px, var(--sea) 3px 8px);
}
/* the sun sits ON the horizon (Scot 2026-07-11): flat side on the amber/sea
   boundary 3px down, disc rising through the amber band into the page
   above. Centered so it reads the same at every viewport. */
.footer::after {
  content: ""; position: absolute; top: -8px; right: 34px; left: auto;
  width: 22px; height: 11px;
  background: var(--burnt); border-radius: 22px 22px 0 0;
}
.footer .brand .word { color: var(--sand); }
/* single shallow row: brand block left, Privacy pinned upper right — no
   wrapping even at 375px (the right column is one short link). */
.footer .cols { display: flex; flex-wrap: nowrap; gap: 24px; justify-content: space-between; align-items: flex-start; }
/* the privacy link is the footer's one action; bold since the in-page
   privacy summary card was removed (Scot 2026-07-11) */
.footer a { color: var(--amber); font-weight: 700; }
.footer .small { color: #b9c4c6; max-width: 420px; }

/* ---------- chat ---------- */
.chat-fab {
  position: fixed; right: 18px; bottom: 18px; z-index: 60;
  display: flex; align-items: center; gap: 9px;
  background: var(--teal); color: var(--white);
  padding: 14px 21px; border-radius: 999px; font-size: 1rem; font-weight: 600;
  box-shadow: var(--shadow-lift);
}
.chat-fab:hover { background: var(--teal-dark); }

.chat-panel {
  position: fixed; right: 14px; bottom: 14px; z-index: 70;
  width: min(400px, calc(100vw - 28px));
  height: min(580px, calc(100dvh - 28px));
  background: var(--white); border-radius: 20px; box-shadow: var(--shadow-lift);
  display: none; flex-direction: column; overflow: hidden;
}
.chat-panel.open { display: flex; }
.chat-head {
  background: var(--teal); color: var(--white);
  padding: 15px 18px; display: flex; align-items: center; gap: 11px;
}
.chat-head .avatar {
  width: 36px; height: 36px; border-radius: 50%;
  background: rgba(255, 255, 255, 0.18); display: flex; align-items: center;
  justify-content: center; font-size: 1.1rem;
}
/* guidebook emoji swap (amplify #19): the concierge avatar was the literal
   wave emoji (decorative chrome, not a subject like wifi/keys), now the
   reduced sun glyph — same data URI as .tick-list, purely decorative
   (.chat-head .t / .s already carry the accessible name). */
.chat-head .avatar::before {
  content: "";
  width: 20px; height: 8px;
  background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 11.5 32 10.6"><path d="M9.5 19 a6.5 6.5 0 0 1 13 0 z" fill="%23bf3f1c"/><rect x="4" y="19" width="24" height="2.6" rx="1.3" fill="%231b2432"/></svg>') no-repeat center / contain;
}
.chat-head .t { font-weight: 700; font-size: 0.98rem; line-height: 1.2; }
.chat-head .s { font-size: 0.74rem; opacity: 0.82; }
.chat-head .close { margin-left: auto; background: transparent; color: var(--white); font-size: 1.5rem; line-height: 1; padding: 4px; }
.chat-log { flex: 1; overflow-y: auto; padding: 16px 14px; display: flex; flex-direction: column; gap: 10px; background: var(--sand); }
.msg { max-width: 84%; padding: 11px 15px; border-radius: 16px; font-size: 0.93rem; white-space: pre-line; }
.msg.bot { background: var(--white); border-bottom-left-radius: 5px; box-shadow: 0 2px 8px rgba(20,40,43,0.06); }
.msg.me { background: var(--teal); color: var(--white); align-self: flex-end; border-bottom-right-radius: 5px; }
.msg.typing { color: var(--ink-soft); font-style: italic; }
.chat-chips { display: flex; gap: 7px; padding: 9px 12px; overflow-x: auto; background: var(--sand); border-top: 1px solid var(--line); }
.chat-chips button {
  flex: 0 0 auto; background: var(--white); border: 1.5px solid var(--line);
  border-radius: 999px; padding: 7px 13px; font-size: 0.82rem; font-weight: 600; color: var(--teal-dark);
}
.chat-chips button:hover { border-color: var(--teal); }
.chat-input { display: flex; gap: 8px; padding: 11px 12px; background: var(--white); border-top: 1px solid var(--line); }
.chat-input input {
  flex: 1; border: 1.5px solid var(--line); border-radius: 999px;
  padding: 11px 16px; font-family: var(--font); font-size: 0.95rem; outline: none;
}
/* focus styling for this input lives in the shared horizon-focus rule
   below (amplify #15), not here. */
.chat-input button {
  width: 44px; height: 44px; border-radius: 50%; background: var(--coral); color: var(--white);
  font-size: 1.1rem; display: flex; align-items: center; justify-content: center;
}

/* ---------- modal ---------- */
.modal-back {
  /* above Leaflet's control pane (z-index 1000), which otherwise paints the
     listing map over the inquiry modal */
  position: fixed; inset: 0; background: rgba(20, 40, 43, 0.55); z-index: 1100;
  display: none; align-items: center; justify-content: center; padding: 20px;
}
.modal-back.open { display: flex; }
.modal {
  background: var(--white); border-radius: 20px; box-shadow: var(--shadow-lift);
  max-width: 460px; width: 100%; padding: 28px; position: relative;
  max-height: 86dvh; overflow-y: auto;
}
.modal .close {
  position: absolute; top: 14px; right: 16px; background: transparent;
  font-size: 1.6rem; color: var(--ink-soft); line-height: 1;
}
.modal h3 { margin-bottom: 10px; font-size: 1.2rem; }
.modal .field { margin: 14px 0; }
.modal label { font-size: 0.83rem; font-weight: 600; color: var(--ink-soft); display: block; margin-bottom: 5px; }
.modal input, .modal textarea {
  width: 100%; border: 1.5px solid var(--line); border-radius: var(--radius-sm);
  padding: 11px 14px; font-family: var(--font); font-size: 0.95rem; outline: none;
}
/* focus styling for these inputs lives in the shared horizon-focus rule
   below (amplify #15), not here (this is the listing inquiry modal). */

/* ---------- lightbox ---------- */
.lightbox {
  position: fixed; inset: 0; background: rgba(10, 20, 22, 0.94); z-index: 1150;
  display: none; align-items: center; justify-content: center;
}
.lightbox.open { display: flex; }
.lightbox img { max-width: 92vw; max-height: 84dvh; border-radius: 10px; }
.lightbox .nav {
  position: absolute; top: 50%; transform: translateY(-50%);
  background: rgba(255,255,255,0.12); color: var(--white);
  width: 48px; height: 48px; border-radius: 50%; font-size: 1.4rem;
}
.lightbox .prev { left: 16px; }
.lightbox .next { right: 16px; }
.lightbox .close { position: absolute; top: 18px; right: 22px; background: transparent; color: var(--white); font-size: 2rem; }
.lightbox .cap { position: absolute; bottom: 22px; left: 0; right: 0; text-align: center; color: #cfdedd; font-size: 0.9rem; }

/* ---------- utility ---------- */
/* the horizon band strip: amber sky over sea, flat, used at section breaks */
.bandstrip { position: relative; display: block; width: 100%; height: 8px; overflow: hidden; }
.bandstrip::before, .bandstrip::after { content: ""; position: absolute; left: 0; right: 0; }
.bandstrip::before { top: 0; height: 3px; background: var(--amber); }
.bandstrip::after { top: 3px; height: 5px; background: var(--sea); }
.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; }
@media (max-width: 760px) { .grid-2 { grid-template-columns: 1fr; } }
.hide { display: none !important; }
.section { margin-top: 46px; }
/* horizon hairlines (amplify #16): (a) the ordinary divider, normalized
   from the sand-toned --line to a low-opacity dusk hairline; (b) the
   MAJOR-transition divider, 2px amber over 3px sea, flat stacked hard-stop
   bands, used sparingly (1-2 per page, never a generic rule). */
.divider { border: none; border-top: 1px solid rgba(27, 36, 50, .14); margin: 34px 0; }
.divider-horizon { position: relative; height: 5px; overflow: hidden; }
.divider-horizon::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: var(--amber); }
.divider-horizon::after { content: ""; position: absolute; top: 2px; left: 0; right: 0; height: 3px; background: var(--sea); }

/* ---------- form focus: horizon edge (amplify #15) ----------
   Shared focus treatment for every text-like field: a dusk border plus a
   slim amber-over-sea bottom edge (flat inset box-shadow bands, no
   gradient). Replaces the varying per-template teal focus borders. This is
   a real focus indicator, not just a color swap: border-color changes from
   the pale --line to the high-contrast --dusk, plus the two-tone edge, so
   it stays clearly visible for keyboard users. Invalid = burnt border;
   confirmed/success = sea border (CSS hooks only; no per-form validity
   wiring added in this pass). Checkboxes/radios/range/file/color/button
   keep native styling. */
input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="file"]):not([type="color"]):not([type="submit"]):not([type="button"]):focus,
textarea:focus,
select:focus {
  outline: none;
  border-color: var(--dusk);
  box-shadow: inset 0 -3px 0 0 var(--sea), inset 0 -6px 0 0 var(--amber);
}
input:invalid:not(:placeholder-shown), .invalid, .field-invalid {
  border-color: var(--burnt);
}
.valid, .field-valid {
  border-color: var(--sea);
}

/* floating manager edit pill: public listing/guide pages show it when the
   viewer arrived from the painel (?manage=1) or holds a manager session in
   this tab. The editor behind it stays token-gated. */
.edit-pill {
  position: fixed; right: 16px; bottom: 16px; z-index: 1050; display: none;
  background: var(--teal); color: var(--white); font-weight: 700; font-size: .92rem;
  padding: 12px 20px; border-radius: 999px; box-shadow: var(--shadow-lift);
}
.edit-pill:hover { background: var(--teal-dark); color: var(--white); }
.edit-pill.show { display: inline-flex; align-items: center; gap: 7px; }

/* ---------- waitlist confirmation modal (home + hosts founding form) ---------- */
.wl-back {
  position: fixed; inset: 0; background: rgba(27, 36, 50, 0.55); z-index: 120;
  display: none; align-items: center; justify-content: center; padding: 24px;
}
.wl-back.open { display: flex; }
.wl-modal {
  background: var(--white); border-radius: 20px; box-shadow: var(--shadow-lift);
  max-width: 430px; width: 100%; padding: 36px 30px 0; text-align: center; overflow: hidden;
}
.wl-modal .big { font-size: 2.7rem; line-height: 1; margin-bottom: 12px; }
.wl-modal h3 { font-family: var(--font-tight); font-size: 1.45rem; letter-spacing: -0.01em; margin-bottom: 8px; }
.wl-modal p { color: var(--ink-soft); font-size: 0.97rem; line-height: 1.55; }
.wl-modal .btn { margin-top: 22px; min-width: 170px; }
/* the brand horizon strip closes the card; the sea band owns the corner curve */
.wl-modal .strip { margin: 28px -30px 0; }
.wl-modal .strip .sky { height: 6px; background: var(--amber); }
.wl-modal .strip .sea { height: 18px; background: var(--sea); }
